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