001    package org.maltparser.core.feature.map;
002    
003    
004    import org.maltparser.core.exception.MaltChainedException;
005    import org.maltparser.core.feature.FeatureException;
006    import org.maltparser.core.feature.function.FeatureFunction;
007    import org.maltparser.core.feature.function.FeatureMapFunction;
008    import org.maltparser.core.feature.value.FeatureValue;
009    import org.maltparser.core.feature.value.FunctionValue;
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 MergeFeature implements FeatureMapFunction {
019            protected FeatureFunction firstFeature;
020            protected FeatureFunction secondFeature;
021            protected SymbolTableHandler tableHandler;
022            protected SymbolTable table;
023            protected SingleFeatureValue singleFeatureValue;
024            
025            public MergeFeature(SymbolTableHandler tableHandler) throws MaltChainedException {
026                    super();
027                    setTableHandler(tableHandler);
028                    singleFeatureValue = new SingleFeatureValue(this);
029            }
030            
031            public void initialize(Object[] arguments) throws MaltChainedException {
032                    if (arguments.length != 2) {
033                            throw new FeatureException("Could not initialize MergeFeature: number of arguments are not correct. ");
034                    }
035                    if (!(arguments[0] instanceof FeatureFunction)) {
036                            throw new FeatureException("Could not initialize MergeFeature: the first argument is not a feature. ");
037                    }
038                    if (!(arguments[1] instanceof FeatureFunction)) {
039                            throw new FeatureException("Could not initialize MergeFeature: the second argument is not a feature. ");
040                    }
041                    setFirstFeature((FeatureFunction)arguments[0]);
042                    setSecondFeature((FeatureFunction)arguments[1]);
043                    setSymbolTable(tableHandler.addSymbolTable("MERGE2_"+firstFeature.getSymbolTable().getName()+"_"+secondFeature.getSymbolTable().getName(), firstFeature.getSymbolTable()));
044            }
045            
046            public void update() throws MaltChainedException {
047    //              multipleFeatureValue.reset();
048                    singleFeatureValue.reset();
049                    firstFeature.update();
050                    secondFeature.update();
051                    FunctionValue firstValue = firstFeature.getFeatureValue();
052                    FunctionValue secondValue = secondFeature.getFeatureValue();
053                    if (firstValue instanceof SingleFeatureValue && secondValue instanceof SingleFeatureValue) {
054                            String symbol = ((SingleFeatureValue)firstValue).getSymbol();
055                            if (((FeatureValue)firstValue).isNullValue() && ((FeatureValue)secondValue).isNullValue()) {
056                                    singleFeatureValue.setCode(firstFeature.getSymbolTable().getSymbolStringToCode(symbol));
057                                    singleFeatureValue.setKnown(firstFeature.getSymbolTable().getKnown(symbol));
058                                    singleFeatureValue.setSymbol(symbol);
059                                    singleFeatureValue.setNullValue(true);
060    //                              multipleFeatureValue.addFeatureValue(firstFeature.getSymbolTable().getSymbolStringToCode(symbol), symbol, true);
061    //                              multipleFeatureValue.setNullValue(true);
062                            } else {
063                                    StringBuilder mergedValue = new StringBuilder();
064                                    mergedValue.append(((SingleFeatureValue)firstValue).getSymbol());
065                                    mergedValue.append('~');
066                                    mergedValue.append(((SingleFeatureValue)secondValue).getSymbol());
067                                    
068                                    singleFeatureValue.setCode(table.addSymbol(mergedValue.toString()));
069                                    singleFeatureValue.setKnown(table.getKnown(mergedValue.toString()));
070                                    singleFeatureValue.setSymbol(mergedValue.toString());
071                                    singleFeatureValue.setNullValue(false);
072    //                              multipleFeatureValue.addFeatureValue(table.addSymbol(mergedValue.toString()), mergedValue.toString(), table.getKnown(mergedValue.toString()));
073    //                              multipleFeatureValue.setNullValue(false);
074                            }
075                    } else {
076                            throw new FeatureException("It is not possible to merge Split-features. ");
077                    }
078            }
079            
080            public Class<?>[] getParameterTypes() {
081                    Class<?>[] paramTypes = { org.maltparser.core.feature.function.FeatureFunction.class, org.maltparser.core.feature.function.FeatureFunction.class };
082                    return paramTypes; 
083            }
084    
085            public FeatureValue getFeatureValue() {
086                    return singleFeatureValue;
087    //              return multipleFeatureValue;
088            }
089    
090            public String getSymbol(int code) throws MaltChainedException {
091                    return table.getSymbolCodeToString(code);
092            }
093            
094            public int getCode(String symbol) throws MaltChainedException {
095                    return table.getSymbolStringToCode(symbol);
096            }
097            
098            public void updateCardinality() throws MaltChainedException {
099                    firstFeature.updateCardinality();
100                    secondFeature.updateCardinality();
101                    singleFeatureValue.setCardinality(table.getValueCounter());
102    //              multipleFeatureValue.setCardinality(table.getValueCounter()); 
103            }
104            
105            public FeatureFunction getFirstFeature() {
106                    return firstFeature;
107            }
108    
109            public void setFirstFeature(FeatureFunction firstFeature) {
110                    this.firstFeature = firstFeature;
111            }
112    
113            public FeatureFunction getSecondFeature() {
114                    return secondFeature;
115            }
116    
117            public void setSecondFeature(FeatureFunction secondFeature) {
118                    this.secondFeature = secondFeature;
119            }
120    
121            public SymbolTableHandler getTableHandler() {
122                    return tableHandler;
123            }
124    
125            public void setTableHandler(SymbolTableHandler tableHandler) {
126                    this.tableHandler = tableHandler;
127            }
128    
129            public SymbolTable getSymbolTable() {
130                    return table;
131            }
132    
133            public void setSymbolTable(SymbolTable table) {
134                    this.table = table;
135            }
136            
137            public boolean equals(Object obj) {
138                    if (this == obj)
139                            return true;
140                    if (obj == null)
141                            return false;
142                    if (getClass() != obj.getClass())
143                            return false;
144                    return obj.toString().equals(this.toString());
145            }
146            
147            public String toString() {
148                    final StringBuilder sb = new StringBuilder();
149                    sb.append("Merge(");
150                    sb.append(firstFeature.toString());
151                    sb.append(", ");
152                    sb.append(secondFeature.toString());
153                    sb.append(')');
154                    return sb.toString();
155            }
156            
157    }