001    package org.maltparser.core.syntaxgraph.feature;
002    
003    import org.maltparser.core.exception.MaltChainedException;
004    import org.maltparser.core.feature.function.FeatureFunction;
005    import org.maltparser.core.feature.function.Modifiable;
006    import org.maltparser.core.feature.value.FeatureValue;
007    import org.maltparser.core.feature.value.SingleFeatureValue;
008    import org.maltparser.core.io.dataformat.ColumnDescription;
009    import org.maltparser.core.symbol.SymbolTable;
010    import org.maltparser.core.symbol.nullvalue.NullValues.NullValueId;
011    
012    /**
013    *
014    *
015    * @author Johan Hall
016    */
017    public abstract class ColumnFeature implements FeatureFunction, Modifiable {
018            protected ColumnDescription column;
019            protected SingleFeatureValue featureValue;
020            
021            public ColumnFeature() throws MaltChainedException {
022                    featureValue = new SingleFeatureValue(this);
023            }
024            
025            public abstract void update() throws MaltChainedException;
026            public abstract void initialize(Object[] arguments) throws MaltChainedException;
027            public abstract Class<?>[] getParameterTypes();
028            
029            public String getSymbol(int value) throws MaltChainedException {
030                    return column.getSymbolTable().getSymbolCodeToString(value);
031            }
032            
033            public int getCode(String value) throws MaltChainedException {
034                    return column.getSymbolTable().getSymbolStringToCode(value);
035            }
036            
037            public ColumnDescription getColumn() {
038                    return column;
039            }
040            
041            protected void setColumn(ColumnDescription column) {
042                    this.column = column;
043            }
044            
045            public void updateCardinality() {
046                    featureValue.setCardinality(column.getSymbolTable().getValueCounter()); 
047            }
048            
049            public void setFeatureValue(int value) throws MaltChainedException {
050                    if (column.getSymbolTable().getSymbolCodeToString(value) == null) {
051                            featureValue.setCode(value);
052                            featureValue.setKnown(column.getSymbolTable().getKnown(value));
053                            featureValue.setSymbol(column.getSymbolTable().getNullValueSymbol(NullValueId.NO_NODE));
054                            featureValue.setNullValue(true);
055                    } else {
056                            featureValue.setCode(value);
057                            featureValue.setKnown(column.getSymbolTable().getKnown(value));
058                            featureValue.setSymbol(column.getSymbolTable().getSymbolCodeToString(value));
059                            featureValue.setNullValue(column.getSymbolTable().isNullValue(value));
060                    }
061            }
062            
063            public void setFeatureValue(String value) throws MaltChainedException {
064                    if (column.getSymbolTable().getSymbolStringToCode(value) < 0) {
065                            featureValue.setCode(column.getSymbolTable().getNullValueCode(NullValueId.NO_NODE));
066                            featureValue.setKnown(column.getSymbolTable().getKnown(value));
067                            featureValue.setSymbol(value);
068                            featureValue.setNullValue(true);
069                    } else {
070                            featureValue.setCode(column.getSymbolTable().getSymbolStringToCode(value));
071                            featureValue.setKnown(column.getSymbolTable().getKnown(value));
072                            featureValue.setSymbol(value);
073                            featureValue.setNullValue(column.getSymbolTable().isNullValue(value));
074                    }
075            }
076            
077            public FeatureValue getFeatureValue() {
078                    return featureValue;
079            }
080            
081            public boolean equals(Object obj) {
082                    if (this == obj)
083                            return true;
084                    if (obj == null)
085                            return false;
086                    if (getClass() != obj.getClass())
087                            return false;
088                    return obj.toString().equals(this.toString());
089            }
090    
091            public String getColumnName() {
092                    return column.getName();
093            }
094            
095            public SymbolTable getSymbolTable() {
096                    return column.getSymbolTable();
097            }
098            
099            public String toString() {
100                    return column.getName();
101            }
102    }