    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    }