001 package org.maltparser.core.syntaxgraph.feature;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.feature.function.AddressFunction;
005 import org.maltparser.core.feature.value.AddressValue;
006 import org.maltparser.core.io.dataformat.ColumnDescription;
007 import org.maltparser.core.io.dataformat.DataFormatInstance;
008 import org.maltparser.core.symbol.nullvalue.NullValues.NullValueId;
009 import org.maltparser.core.syntaxgraph.SyntaxGraphException;
010 import org.maltparser.core.syntaxgraph.node.DependencyNode;
011
012 /**
013 *
014 *
015 * @author Johan Hall
016 */
017 public class OutputColumnFeature extends ColumnFeature {
018 protected AddressFunction addressFunction;
019 protected DataFormatInstance dataFormatInstance;
020
021 public OutputColumnFeature(DataFormatInstance dataFormatInstance) throws MaltChainedException {
022 super();
023 setDataFormatInstance(dataFormatInstance);
024 }
025
026 public void initialize(Object[] arguments) throws MaltChainedException {
027 if (arguments.length != 2) {
028 throw new SyntaxGraphException("Could not initialize OutputColumnFeature: number of arguments are not correct. ");
029 }
030 if (!(arguments[0] instanceof String)) {
031 throw new SyntaxGraphException("Could not initialize OutputColumnFeature: the first argument is not a string. ");
032 }
033 if (!(arguments[1] instanceof AddressFunction)) {
034 throw new SyntaxGraphException("Could not initialize OutputColumnFeature: the second argument is not an address function. ");
035 }
036 ColumnDescription column = dataFormatInstance.getColumnDescriptionByName((String)arguments[0]);
037 if (column == null) {
038 throw new SyntaxGraphException("Could not initialize OutputColumnFeature: the output column type '"+(String)arguments[0]+"' could not be found in the data format specification. ' ");
039 }
040 setColumn(column);
041 setAddressFunction((AddressFunction)arguments[1]);
042 }
043
044 public Class<?>[] getParameterTypes() {
045 Class<?>[] paramTypes = { java.lang.String.class, org.maltparser.core.feature.function.AddressFunction.class };
046 return paramTypes;
047 }
048
049 public void update() throws MaltChainedException {
050 final AddressValue a = addressFunction.getAddressValue();
051
052 if (a.getAddress() == null) {
053 featureValue.update(column.getSymbolTable().getNullValueCode(NullValueId.NO_NODE),
054 column.getSymbolTable().getNullValueSymbol(NullValueId.NO_NODE), true, 1);
055 } else {
056 final DependencyNode node = (DependencyNode)a.getAddress();
057 if (!node.isRoot()) {
058 if (node.hasHead()) {
059 int indexCode = node.getHeadEdge().getLabelCode(column.getSymbolTable());
060 String symbol = column.getSymbolTable().getSymbolCodeToString(indexCode);
061 if (column.getType() == ColumnDescription.STRING) {
062 featureValue.update(indexCode, symbol, false, 1);
063 } else {
064 castFeatureValue(symbol);
065 }
066 } else {
067 featureValue.update(column.getSymbolTable().getNullValueCode(NullValueId.NO_VALUE),
068 column.getSymbolTable().getNullValueSymbol(NullValueId.NO_VALUE), true, 1);
069 }
070 } else {
071 featureValue.update(column.getSymbolTable().getNullValueCode(NullValueId.ROOT_NODE),
072 column.getSymbolTable().getNullValueSymbol(NullValueId.ROOT_NODE), true, 1);
073 }
074 }
075
076 }
077
078 public AddressFunction getAddressFunction() {
079 return addressFunction;
080 }
081
082 public void setAddressFunction(AddressFunction addressFunction) {
083 this.addressFunction = addressFunction;
084 }
085
086 public DataFormatInstance getDataFormatInstance() {
087 return dataFormatInstance;
088 }
089
090 public void setDataFormatInstance(DataFormatInstance dataFormatInstance) {
091 this.dataFormatInstance = dataFormatInstance;
092 }
093
094
095 public boolean equals(Object obj) {
096 if (this == obj)
097 return true;
098 if (obj == null)
099 return false;
100 if (getClass() != obj.getClass())
101 return false;
102 return obj.toString().equals(toString());
103 }
104
105 public int hashCode() {
106 return 217 + (null == toString() ? 0 : toString().hashCode());
107 }
108
109 public String toString() {
110 final StringBuilder sb = new StringBuilder();
111 sb.append("OutputColumn(");
112 sb.append(super.toString());
113 sb.append(", ");
114 sb.append(addressFunction.toString());
115 sb.append(")");
116 return sb.toString();
117 }
118 }