    001    package org.maltparser.core.feature.map;
    002
    003    import org.maltparser.core.exception.MaltChainedException;
    004    import org.maltparser.core.feature.FeatureException;
    005    import org.maltparser.core.feature.function.FeatureFunction;
    006    import org.maltparser.core.feature.function.FeatureMapFunction;
    007    import org.maltparser.core.feature.value.FeatureValue;
    008    import org.maltparser.core.feature.value.FunctionValue;
    009    import org.maltparser.core.feature.value.MultipleFeatureValue;
    010    import org.maltparser.core.feature.value.SingleFeatureValue;
    011    import org.maltparser.core.symbol.SymbolTable;
    012    import org.maltparser.core.symbol.SymbolTableHandler;
    013    /**
    014    *
    015    *
    016    * @author Johan Hall
    017    */
    018    public class SuffixFeature implements FeatureMapFunction {
    019            protected FeatureFunction parentFeature;
    020            protected MultipleFeatureValue multipleFeatureValue;
    021            protected SymbolTableHandler tableHandler;
    022            protected SymbolTable table;
    023            protected int suffixLength;
    024
    025            public SuffixFeature(SymbolTableHandler tableHandler) throws MaltChainedException {
    026                    super();
    027                    setTableHandler(tableHandler);
    028                    multipleFeatureValue = new MultipleFeatureValue(this);
    029            }
    030
    031            public void initialize(Object[] arguments) throws MaltChainedException {
    032                    if (arguments.length != 2) {
    033                            throw new FeatureException("Could not initialize SuffixFeature: number of arguments are not correct. ");
    034                    }
    035                    if (!(arguments[0] instanceof FeatureFunction)) {
    036                            throw new FeatureException("Could not initialize SuffixFeature: the first argument is not a feature. ");
    037                    }
    038                    if (!(arguments[1] instanceof Integer)) {
    039                            throw new FeatureException("Could not initialize SuffixFeature: the second argument is not a string. ");
    040                    }
    041                    setParentFeature((FeatureFunction)arguments[0]);
    042                    setSuffixLength(((Integer)arguments[1]).intValue());
    043                    setSymbolTable(tableHandler.addSymbolTable("SUFFIX_"+suffixLength+"_"+parentFeature.getSymbolTable().getName(), parentFeature.getSymbolTable()));
    044            }
    045
    046            public Class<?>[] getParameterTypes() {
    047                    Class<?>[] paramTypes = { org.maltparser.core.syntaxgraph.feature.InputColumnFeature.class, java.lang.Integer.class };
    048                    return paramTypes;
    049            }
    050
    051            public FeatureValue getFeatureValue() {
    052                    return multipleFeatureValue;
    053            }
    054
    055            public int getCode(String symbol) throws MaltChainedException {
    056                    return table.getSymbolStringToCode(symbol);
    057            }
    058
    059            public String getSymbol(int code) throws MaltChainedException {
    060                    return table.getSymbolCodeToString(code);
    061            }
    062
    063            public void update() throws MaltChainedException {
    064                    parentFeature.update();
    065                    FunctionValue value = parentFeature.getFeatureValue();
    066                    if (value instanceof SingleFeatureValue) {
    067                            String symbol = ((SingleFeatureValue)value).getSymbol();
    068                            if (((FeatureValue)value).isNullValue()) {
    069                                    multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(symbol), symbol, true);
    070                                    multipleFeatureValue.setNullValue(true);
    071                            } else {
    072                                    String suffixStr;
    073                                    if (symbol.length()-suffixLength > 0) {
    074                                            suffixStr = symbol.substring(symbol.length()-suffixLength);
    075                                    } else {
    076                                            suffixStr = symbol;
    077                                    }
    078                                    int code = table.addSymbol(suffixStr);
    079                                    multipleFeatureValue.addFeatureValue(code, suffixStr, table.getKnown(suffixStr));
    080                                    multipleFeatureValue.setNullValue(false);
    081                            }
    082                    } else if (value instanceof MultipleFeatureValue) {
    083                            multipleFeatureValue.reset();
    084                            if (((MultipleFeatureValue)value).isNullValue()) {
    085                                    multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(((MultipleFeatureValue)value).getFirstSymbol()), ((MultipleFeatureValue)value).getFirstSymbol(), true);
    086                                    multipleFeatureValue.setNullValue(true);
    087                            } else {
    088                                    for (String symbol : ((MultipleFeatureValue)value).getSymbols()) {
    089                                            String suffixStr;
    090                                            if (symbol.length()-suffixLength > 0) {
    091                                                    suffixStr = symbol.substring(symbol.length()-suffixLength);
    092                                            } else {
    093                                                    suffixStr = symbol;
    094                                            }
    095                                            int code = table.addSymbol(suffixStr);
    096                                            multipleFeatureValue.addFeatureValue(code, suffixStr, table.getKnown(suffixStr));
    097                                            multipleFeatureValue.setNullValue(true);
    098                                    }
    099                            }
    100                    }
    101            }
    102
    103            public void updateCardinality() throws MaltChainedException {
    104                    parentFeature.updateCardinality();
    105                    multipleFeatureValue.setCardinality(table.getValueCounter());
    106            }
    107
    108            public FeatureFunction getParentFeature() {
    109                    return parentFeature;
    110            }
    111
    112            public void setParentFeature(FeatureFunction feature) {
    113                    this.parentFeature = feature;
    114            }
    115
    116            public int getSuffixLength() {
    117                    return suffixLength;
    118            }
    119
    120            public void setSuffixLength(int suffixLength) {
    121                    this.suffixLength = suffixLength;
    122            }
    123
    124            public SymbolTableHandler getTableHandler() {
    125                    return tableHandler;
    126            }
    127
    128            public void setTableHandler(SymbolTableHandler tableHandler) {
    129                    this.tableHandler = tableHandler;
    130            }
    131
    132            public SymbolTable getSymbolTable() {
    133                    return table;
    134            }
    135
    136            public void setSymbolTable(SymbolTable table) {
    137                    this.table = table;
    138            }
    139
    140            public boolean equals(Object obj) {
    141                    if (this == obj)
    142                            return true;
    143                    if (obj == null)
    144                            return false;
    145                    if (getClass() != obj.getClass())
    146                            return false;
    147                    return obj.toString().equals(this.toString());
    148            }
    149
    150            public String toString() {
    151                    final StringBuilder sb = new StringBuilder();
    152                    sb.append("Suffix(");
    153                    sb.append(parentFeature.toString());
    154                    sb.append(", ");
    155                    sb.append(suffixLength);
    156                    sb.append(')');
    157                    return sb.toString();
    158            }
    159    }