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 }