001 package org.maltparser.core.syntaxgraph.feature;
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.Modifiable;
007 import org.maltparser.core.feature.value.FeatureValue;
008 import org.maltparser.core.feature.value.SingleFeatureValue;
009 import org.maltparser.core.io.dataformat.ColumnDescription;
010 import org.maltparser.core.symbol.SymbolTable;
011 import org.maltparser.core.symbol.nullvalue.NullValues.NullValueId;
012
013 /**
014 *
015 *
016 * @author Johan Hall
017 */
018 public abstract class ColumnFeature implements FeatureFunction, Modifiable {
019 protected ColumnDescription column;
020 protected final SingleFeatureValue featureValue;
021
022 public ColumnFeature() throws MaltChainedException {
023 featureValue = new SingleFeatureValue(this);
024 }
025
026 public abstract void update() throws MaltChainedException;
027 public abstract void initialize(Object[] arguments) throws MaltChainedException;
028 public abstract Class<?>[] getParameterTypes();
029
030 public String getSymbol(int value) throws MaltChainedException {
031 return column.getSymbolTable().getSymbolCodeToString(value);
032 }
033
034 public int getCode(String value) throws MaltChainedException {
035 return column.getSymbolTable().getSymbolStringToCode(value);
036 }
037
038 public ColumnDescription getColumn() {
039 return column;
040 }
041
042 protected void setColumn(ColumnDescription column) {
043 this.column = column;
044 }
045
046 public void setFeatureValue(int indexCode) throws MaltChainedException {
047 final String symbol = column.getSymbolTable().getSymbolCodeToString(indexCode);
048
049 if (symbol == null) {
050 featureValue.update(indexCode, column.getSymbolTable().getNullValueSymbol(NullValueId.NO_NODE), true, 1);
051 } else {
052 boolean nullValue = column.getSymbolTable().isNullValue(indexCode);
053 if (column.getType() == ColumnDescription.STRING || nullValue) {
054 featureValue.update(indexCode, symbol, nullValue, 1);
055 } else {
056 castFeatureValue(symbol);
057 }
058 }
059 }
060
061 public void setFeatureValue(String symbol) throws MaltChainedException {
062 final int indexCode = column.getSymbolTable().getSymbolStringToCode(symbol);
063 if (indexCode < 0) {
064 featureValue.update(column.getSymbolTable().getNullValueCode(NullValueId.NO_NODE), symbol, true, 1);
065 } else {
066 boolean nullValue = column.getSymbolTable().isNullValue(symbol);
067 if (column.getType() == ColumnDescription.STRING || nullValue) {
068 featureValue.update(indexCode, symbol, nullValue, 1);
069 } else {
070 castFeatureValue(symbol);
071 }
072 }
073 }
074
075 protected void castFeatureValue(String symbol) throws MaltChainedException {
076 if (column.getType() == ColumnDescription.INTEGER) {
077 try {
078 final int dotIndex = symbol.indexOf('.');
079 if (dotIndex == -1) {
080 featureValue.setValue(Integer.parseInt(symbol));
081 featureValue.setSymbol(symbol);
082 } else {
083 featureValue.setValue(Integer.parseInt(symbol.substring(0,dotIndex)));
084 featureValue.setSymbol(symbol.substring(0,dotIndex));
085 }
086 } catch (NumberFormatException e) {
087 throw new FeatureException("Could not cast the feature value '"+symbol+"' to integer value.", e);
088 }
089 } else if (column.getType() == ColumnDescription.BOOLEAN) {
090 final int dotIndex = symbol.indexOf('.');
091 if (symbol.equals("1") || symbol.equals("true") || symbol.equals("#true#") || (dotIndex != -1 && symbol.substring(0,dotIndex).equals("1"))) {
092 featureValue.setValue(1);
093 featureValue.setSymbol("true");
094 } else if (symbol.equals("false") || symbol.equals("0") || (dotIndex != -1 && symbol.substring(0,dotIndex).equals("0"))) {
095 featureValue.setValue(0);
096 featureValue.setSymbol("false");
097 } else {
098 throw new FeatureException("Could not cast the feature value '"+symbol+"' to boolean value.");
099 }
100 } else if (column.getType() == ColumnDescription.REAL) {
101 try {
102 featureValue.setValue(Double.parseDouble(symbol));
103 featureValue.setSymbol(symbol);
104 } catch (NumberFormatException e) {
105 throw new FeatureException("Could not cast the feature value '"+symbol+"' to real value.", e);
106 }
107 }
108 if (column.getType() == ColumnDescription.INTEGER || column.getType() == ColumnDescription.BOOLEAN || column.getType() == ColumnDescription.REAL) {
109 featureValue.setNullValue(false);
110 featureValue.setIndexCode(1);
111 }
112 }
113
114 public FeatureValue getFeatureValue() {
115 return featureValue;
116 }
117
118 public boolean equals(Object obj) {
119 if (this == obj)
120 return true;
121 if (obj == null)
122 return false;
123 if (getClass() != obj.getClass())
124 return false;
125 return obj.toString().equals(this.toString());
126 }
127
128 public String getColumnName() {
129 return column.getName();
130 }
131
132 public SymbolTable getSymbolTable() {
133 return column.getSymbolTable();
134 }
135
136 public int getType() {
137 return column.getType();
138 }
139
140 public String getMapIdentifier() {
141 return getSymbolTable().getName();
142 }
143
144 public String toString() {
145 return column.getName();
146 }
147 }