package org.maltparser.core.feature.map;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.feature.FeatureException;
import org.maltparser.core.feature.function.FeatureFunction;
import org.maltparser.core.feature.function.FeatureMapFunction;
import org.maltparser.core.feature.value.FeatureValue;
import org.maltparser.core.feature.value.FunctionValue;
import org.maltparser.core.feature.value.MultipleFeatureValue;
import org.maltparser.core.feature.value.SingleFeatureValue;
import org.maltparser.core.io.dataformat.ColumnDescription;
import org.maltparser.core.io.dataformat.DataFormatInstance;
import org.maltparser.core.symbol.SymbolTable;
import org.maltparser.core.symbol.SymbolTableHandler;
/**
*
*
* @author Johan Hall
*/
public class SuffixFeature implements FeatureMapFunction {
protected FeatureFunction parentFeature;
protected MultipleFeatureValue multipleFeatureValue;
protected SymbolTableHandler tableHandler;
protected SymbolTable table;
protected DataFormatInstance dataFormatInstance;
protected ColumnDescription column;
protected int suffixLength;
public SuffixFeature(DataFormatInstance dataFormatInstance) throws MaltChainedException {
super();
setDataFormatInstance(dataFormatInstance);
multipleFeatureValue = new MultipleFeatureValue(this);
}
public void initialize(Object[] arguments) throws MaltChainedException {
if (arguments.length != 2) {
throw new FeatureException("Could not initialize SuffixFeature: number of arguments are not correct. ");
}
if (!(arguments[0] instanceof FeatureFunction)) {
throw new FeatureException("Could not initialize SuffixFeature: the first argument is not a feature. ");
}
if (!(arguments[1] instanceof Integer)) {
throw new FeatureException("Could not initialize SuffixFeature: the second argument is not a string. ");
}
setParentFeature((FeatureFunction) arguments[0]);
setSuffixLength(((Integer) arguments[1]).intValue());
ColumnDescription parentColumn = dataFormatInstance.getColumnDescriptionByName(parentFeature.getSymbolTable().getName());
if (parentColumn.getType() != ColumnDescription.STRING) {
throw new FeatureException("Could not initialize SuffixFeature: the first argument must be a string. ");
}
setColumn(dataFormatInstance.addInternalColumnDescription("SUFFIX_" + suffixLength + "_" + parentFeature.getSymbolTable().getName(), parentColumn));
setSymbolTable(column.getSymbolTable());
// setSymbolTable(tableHandler.addSymbolTable("SUFFIX_"+suffixLength+"_"+parentFeature.getSymbolTable().getName(), parentFeature.getSymbolTable()));
}
public Class<?>[] getParameterTypes() {
Class<?>[] paramTypes = {org.maltparser.core.syntaxgraph.feature.InputColumnFeature.class, java.lang.Integer.class};
return paramTypes;
}
public FeatureValue getFeatureValue() {
return multipleFeatureValue;
}
public int getCode(String symbol) throws MaltChainedException {
return table.getSymbolStringToCode(symbol);
}
public String getSymbol(int code) throws MaltChainedException {
return table.getSymbolCodeToString(code);
}
public void update() throws MaltChainedException {
parentFeature.update();
FunctionValue value = parentFeature.getFeatureValue();
if (value instanceof SingleFeatureValue) {
String symbol = ((SingleFeatureValue) value).getSymbol();
if (((FeatureValue) value).isNullValue()) {
multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(symbol), symbol);
multipleFeatureValue.setNullValue(true);
} else {
String suffixStr;
if (symbol.length() - suffixLength > 0) {
suffixStr = symbol.substring(symbol.length() - suffixLength);
} else {
suffixStr = symbol;
}
int code = table.addSymbol(suffixStr);
multipleFeatureValue.addFeatureValue(code, suffixStr);
multipleFeatureValue.setNullValue(false);
}
} else if (value instanceof MultipleFeatureValue) {
multipleFeatureValue.reset();
if (((MultipleFeatureValue) value).isNullValue()) {
multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(((MultipleFeatureValue) value).getFirstSymbol()), ((MultipleFeatureValue) value).getFirstSymbol());
multipleFeatureValue.setNullValue(true);
} else {
for (String symbol : ((MultipleFeatureValue) value).getSymbols()) {
String suffixStr;
if (symbol.length() - suffixLength > 0) {
suffixStr = symbol.substring(symbol.length() - suffixLength);
} else {
suffixStr = symbol;
}
int code = table.addSymbol(suffixStr);
multipleFeatureValue.addFeatureValue(code, suffixStr);
multipleFeatureValue.setNullValue(true);
}
}
}
}
public FeatureFunction getParentFeature() {
return parentFeature;
}
public void setParentFeature(FeatureFunction feature) {
this.parentFeature = feature;
}
public int getSuffixLength() {
return suffixLength;
}
public void setSuffixLength(int suffixLength) {
this.suffixLength = suffixLength;
}
public SymbolTableHandler getTableHandler() {
return dataFormatInstance.getSymbolTables();
}
public SymbolTable getSymbolTable() {
return table;
}
public void setSymbolTable(SymbolTable table) {
this.table = table;
}
public DataFormatInstance getDataFormatInstance() {
return dataFormatInstance;
}
public void setDataFormatInstance(DataFormatInstance dataFormatInstance) {
this.dataFormatInstance = dataFormatInstance;
}
public ColumnDescription getColumn() {
return column;
}
protected void setColumn(ColumnDescription column) {
this.column = column;
}
public int getType() {
return column.getType();
}
public String getMapIdentifier() {
return getSymbolTable().getName();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return obj.toString().equals(this.toString());
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Suffix(");
sb.append(parentFeature.toString());
sb.append(", ");
sb.append(suffixLength);
sb.append(')');
return sb.toString();
}
}