    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.MultipleFeatureValue;
    009    import org.maltparser.core.feature.value.SingleFeatureValue;
    010    import org.maltparser.core.io.dataformat.ColumnDescription;
    011    import org.maltparser.core.io.dataformat.DataFormatInstance;
    012    import org.maltparser.core.symbol.SymbolTable;
    013    import org.maltparser.core.symbol.SymbolTableHandler;
    014    /**
    015    *
    016    *
    017    * @author Johan Hall
    018    */
    019    public class PrefixFeature implements FeatureMapFunction {
    020            protected FeatureFunction parentFeature;
    021            protected MultipleFeatureValue multipleFeatureValue;
    022            protected SymbolTableHandler tableHandler;
    023            protected SymbolTable table;
    024            protected DataFormatInstance dataFormatInstance;
    025            protected ColumnDescription column;
    026            protected int prefixLength;
    027
    028            public PrefixFeature(DataFormatInstance dataFormatInstance) throws MaltChainedException {
    029                    super();
    030                    setDataFormatInstance(dataFormatInstance);
    031                    multipleFeatureValue = new MultipleFeatureValue(this);
    032            }
    033
    034            public void initialize(Object[] arguments) throws MaltChainedException {
    035                    if (arguments.length != 2) {
    036                            throw new FeatureException("Could not initialize PrefixFeature: number of arguments are not correct. ");
    037                    }
    038                    if (!(arguments[0] instanceof FeatureFunction)) {
    039                            throw new FeatureException("Could not initialize PrefixFeature: the first argument is not a feature. ");
    040                    }
    041                    if (!(arguments[1] instanceof Integer)) {
    042                            throw new FeatureException("Could not initialize PrefixFeature: the second argument is not a string. ");
    043                    }
    044                    setParentFeature((FeatureFunction)arguments[0]);
    045                    setPrefixLength(((Integer)arguments[1]).intValue());
    046                    ColumnDescription parentColumn = dataFormatInstance.getColumnDescriptionByName(parentFeature.getSymbolTable().getName());
    047                    if (parentColumn.getType() != ColumnDescription.STRING) {
    048                            throw new FeatureException("Could not initialize PrefixFeature: the first argument must be a string. ");
    049                    }
    050                    setColumn(dataFormatInstance.addInternalColumnDescription("PREFIX_"+prefixLength+"_"+parentFeature.getSymbolTable().getName(), parentColumn));
    051                    setSymbolTable(column.getSymbolTable());
    052    //              setSymbolTable(tableHandler.addSymbolTable("PREFIX_"+prefixLength+"_"+parentFeature.getSymbolTable().getName(), parentFeature.getSymbolTable()));
    053            }
    054
    055            public Class<?>[] getParameterTypes() {
    056                    Class<?>[] paramTypes = { org.maltparser.core.syntaxgraph.feature.InputColumnFeature.class, java.lang.Integer.class };
    057                    return paramTypes;
    058            }
    059
    060            public FeatureValue getFeatureValue() {
    061                    return multipleFeatureValue;
    062            }
    063
    064            public int getCode(String symbol) throws MaltChainedException {
    065                    return table.getSymbolStringToCode(symbol);
    066            }
    067
    068            public String getSymbol(int code) throws MaltChainedException {
    069                    return table.getSymbolCodeToString(code);
    070            }
    071
    072            public void update() throws MaltChainedException {
    073                    parentFeature.update();
    074                    FeatureValue value = parentFeature.getFeatureValue();
    075                    if (value instanceof SingleFeatureValue) {
    076                            String symbol = ((SingleFeatureValue)value).getSymbol();
    077                            if (((FeatureValue)value).isNullValue()) {
    078                                    multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(symbol), symbol);
    079                                    multipleFeatureValue.setNullValue(true);
    080                            } else {
    081                                    String prefixStr;
    082                                    if (symbol.length()-prefixLength > 0) {
    083                                            prefixStr = symbol.substring(0, prefixLength);
    084                                    } else {
    085                                            prefixStr = symbol;
    086                                    }
    087                                    int code = table.addSymbol(prefixStr);
    088                                    multipleFeatureValue.addFeatureValue(code, prefixStr);
    089                                    multipleFeatureValue.setNullValue(false);
    090                            }
    091                    } else if (value instanceof MultipleFeatureValue) {
    092                            multipleFeatureValue.reset();
    093                            if (((MultipleFeatureValue)value).isNullValue()) {
    094                                    multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(((MultipleFeatureValue)value).getFirstSymbol()), ((MultipleFeatureValue)value).getFirstSymbol());
    095                                    multipleFeatureValue.setNullValue(true);
    096                            } else {
    097                                    for (String symbol : ((MultipleFeatureValue)value).getSymbols()) {
    098                                            String prefixStr;
    099                                            if (symbol.length()-prefixLength > 0) {
    100                                                    prefixStr = symbol.substring(0, prefixLength);
    101                                            } else {
    102                                                    prefixStr = symbol;
    103                                            }
    104                                            int code = table.addSymbol(prefixStr);
    105                                            multipleFeatureValue.addFeatureValue(code, prefixStr);
    106                                            multipleFeatureValue.setNullValue(true);
    107                                    }
    108                            }
    109                    }
    110            }
    111
    112            public void updateCardinality() throws MaltChainedException {
    113    //              parentFeature.updateCardinality();
    114    //              multipleFeatureValue.setCardinality(table.getValueCounter());
    115            }
    116
    117            public FeatureFunction getParentFeature() {
    118                    return parentFeature;
    119            }
    120
    121            public void setParentFeature(FeatureFunction feature) {
    122                    this.parentFeature = feature;
    123            }
    124
    125            public int getPrefixLength() {
    126                    return prefixLength;
    127            }
    128
    129            public void setPrefixLength(int prefixLength) {
    130                    this.prefixLength = prefixLength;
    131            }
    132
    133            public SymbolTableHandler getTableHandler() {
    134                    return dataFormatInstance.getSymbolTables();
    135            }
    136
    137            public SymbolTable getSymbolTable() {
    138                    return table;
    139            }
    140
    141            public void setSymbolTable(SymbolTable table) {
    142                    this.table = table;
    143            }
    144
    145            public DataFormatInstance getDataFormatInstance() {
    146                    return dataFormatInstance;
    147            }
    148
    149            public void setDataFormatInstance(DataFormatInstance dataFormatInstance) {
    150                    this.dataFormatInstance = dataFormatInstance;
    151            }
    152
    153            public ColumnDescription getColumn() {
    154                    return column;
    155            }
    156
    157            protected void setColumn(ColumnDescription column) {
    158                    this.column = column;
    159            }
    160
    161            public  int getType() {
    162                    return column.getType();
    163            }
    164
    165            public String getMapIdentifier() {
    166                    return getSymbolTable().getName();
    167            }
    168
    169            public boolean equals(Object obj) {
    170                    if (this == obj)
    171                            return true;
    172                    if (obj == null)
    173                            return false;
    174                    if (getClass() != obj.getClass())
    175                            return false;
    176                    return obj.toString().equals(this.toString());
    177            }
    178
    179            public String toString() {
    180                    final StringBuilder sb = new StringBuilder();
    181                    sb.append("Prefix(");
    182                    sb.append(parentFeature.toString());
    183                    sb.append(", ");
    184                    sb.append(prefixLength);
    185                    sb.append(')');
    186                    return sb.toString();
    187            }
    188    }
    189