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.TableFeature; 009 import org.maltparser.core.symbol.nullvalue.NullValues.NullValueId; 010 import org.maltparser.core.syntaxgraph.SyntaxGraphException; 011 import org.maltparser.core.syntaxgraph.node.DependencyNode; 012 013 public class InputTableFeature extends TableFeature { 014 protected AddressFunction addressFunction; 015 016 public InputTableFeature(DataFormatInstance dataFormatInstance) throws MaltChainedException { 017 super(); 018 setTableHandler(dataFormatInstance.getSymbolTables()); 019 } 020 021 public void initialize(Object[] arguments) throws MaltChainedException { 022 if (arguments.length != 2) { 023 throw new SyntaxGraphException("Could not initialize InputTableFeature: number of arguments are not correct. "); 024 } 025 if (!(arguments[0] instanceof String)) { 026 throw new SyntaxGraphException("Could not initialize InputTableFeature: the first argument is not a string. "); 027 } 028 if (!(arguments[1] instanceof AddressFunction)) { 029 throw new SyntaxGraphException("Could not initialize InputTableFeature: the second argument is not an address function. "); 030 } 031 setTableName((String)arguments[0]); 032 setSymbolTable(tableHandler.getSymbolTable(getTableName())); 033 setAddressFunction((AddressFunction)arguments[1]); 034 setType(ColumnDescription.STRING); // TODO Probably it could possible to vary the type 035 } 036 037 public Class<?>[] getParameterTypes() { 038 Class<?>[] paramTypes = { java.lang.String.class, org.maltparser.core.feature.function.AddressFunction.class }; 039 return paramTypes; 040 } 041 042 public void update() throws MaltChainedException { 043 final AddressValue a = addressFunction.getAddressValue(); 044 045 if (a.getAddress() == null) { 046 if (getSymbolTable() != null) { 047 featureValue.setIndexCode(getSymbolTable().getNullValueCode(NullValueId.NO_NODE)); 048 featureValue.setSymbol(getSymbolTable().getNullValueSymbol(NullValueId.NO_NODE)); 049 } else { 050 featureValue.setIndexCode(0); 051 featureValue.setSymbol("#null"); 052 } 053 // featureValue.setKnown(true); 054 featureValue.setNullValue(true); 055 } else { 056 final DependencyNode node = (DependencyNode)a.getAddress(); 057 if (!node.isRoot()) { 058 if (getSymbolTable() != null && node.hasLabel(getSymbolTable())) { 059 featureValue.setIndexCode(node.getLabelCode(getSymbolTable())); 060 featureValue.setSymbol(getSymbolTable().getSymbolCodeToString(node.getLabelCode(getSymbolTable()))); 061 // featureValue.setKnown(getSymbolTable().getKnown(node.getLabelCode(getSymbolTable()))); 062 featureValue.setNullValue(false); 063 } else { 064 // featureValue.setCode(0); 065 // featureValue.setSymbol("#null"); 066 if (getSymbolTable() != null) { 067 featureValue.setIndexCode(getSymbolTable().getNullValueCode(NullValueId.NO_VALUE)); 068 featureValue.setSymbol(getSymbolTable().getNullValueSymbol(NullValueId.NO_VALUE)); 069 } 070 // else { 071 // featureValue.setCode(0); 072 // featureValue.setSymbol("#null"); 073 // } 074 // featureValue.setKnown(true); 075 featureValue.setNullValue(true); 076 } 077 } else { 078 if (getSymbolTable() != null) { 079 featureValue.setIndexCode(getSymbolTable().getNullValueCode(NullValueId.ROOT_NODE)); 080 featureValue.setSymbol(getSymbolTable().getNullValueSymbol(NullValueId.ROOT_NODE)); 081 } 082 // else { 083 // featureValue.setCode(0); 084 // featureValue.setSymbol("#null"); 085 // } 086 // featureValue.setCode(0); 087 // featureValue.setSymbol("#null"); 088 // featureValue.setKnown(true); 089 featureValue.setNullValue(true); 090 } 091 } 092 featureValue.setValue(1); 093 } 094 095 public AddressFunction getAddressFunction() { 096 return addressFunction; 097 } 098 099 public void setAddressFunction(AddressFunction addressFunction) { 100 this.addressFunction = addressFunction; 101 } 102 103 public boolean equals(Object obj) { 104 if (this == obj) 105 return true; 106 if (obj == null) 107 return false; 108 if (getClass() != obj.getClass()) 109 return false; 110 return obj.toString().equals(toString()); 111 } 112 113 public int hashCode() { 114 return 217 + (null == toString() ? 0 : toString().hashCode()); 115 } 116 117 public String toString() { 118 final StringBuilder sb = new StringBuilder(); 119 sb.append("InputTable("); 120 sb.append(super.toString()); 121 sb.append(", "); 122 sb.append(addressFunction.toString()); 123 sb.append(")"); 124 return sb.toString(); 125 } 126 127 }