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