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