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 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 updateCardinality() {
047 // featureValue.setCardinality(column.getSymbolTable().getValueCounter());
048 }
049
050 public void setFeatureValue(int indexCode) throws MaltChainedException {
051 final String symbol = column.getSymbolTable().getSymbolCodeToString(indexCode);
052
053 if (symbol == null) {
054 featureValue.update(indexCode, column.getSymbolTable().getNullValueSymbol(NullValueId.NO_NODE), true, 1);
055 } else {
056 boolean nullValue = column.getSymbolTable().isNullValue(indexCode);
057 if (column.getType() == ColumnDescription.STRING || nullValue) {
058 featureValue.update(indexCode, symbol, nullValue, 1);
059 } else {
060 castFeatureValue(symbol);
061 }
062 }
063 }
064
065 public void setFeatureValue(String symbol) throws MaltChainedException {
066 int indexCode = column.getSymbolTable().getSymbolStringToCode(symbol);
067 if (indexCode < 0) {
068 featureValue.update(column.getSymbolTable().getNullValueCode(NullValueId.NO_NODE), symbol, true, 1);
069 } else {
070 boolean nullValue = column.getSymbolTable().isNullValue(symbol);
071 if (column.getType() == ColumnDescription.STRING || nullValue) {
072 featureValue.update(indexCode, symbol, nullValue, 1);
073 } else {
074 castFeatureValue(symbol);
075 }
076 }
077 }
078
079 protected void castFeatureValue(String symbol) throws MaltChainedException {
080 if (column.getType() == ColumnDescription.INTEGER) {
081 try {
082 int dotIndex = symbol.indexOf('.');
083 if (dotIndex == -1) {
084 featureValue.setValue(Integer.parseInt(symbol));
085 featureValue.setSymbol(symbol);
086 } else {
087 featureValue.setValue(Integer.parseInt(symbol.substring(0,dotIndex)));
088 featureValue.setSymbol(symbol.substring(0,dotIndex));
089 }
090 } catch (NumberFormatException e) {
091 throw new FeatureException("Could not cast the feature value '"+symbol+"' to integer value.", e);
092 }
093 } else if (column.getType() == ColumnDescription.BOOLEAN) {
094 int dotIndex = symbol.indexOf('.');
095 if (symbol.equals("1") || symbol.equals("true") || symbol.equals("#true#") || (dotIndex != -1 && symbol.substring(0,dotIndex).equals("1"))) {
096 featureValue.setValue(1);
097 featureValue.setSymbol("true");
098 } else if (symbol.equals("false") || symbol.equals("0") || (dotIndex != -1 && symbol.substring(0,dotIndex).equals("0"))) {
099 featureValue.setValue(0);
100 featureValue.setSymbol("false");
101 } else {
102 throw new FeatureException("Could not cast the feature value '"+symbol+"' to boolean value.");
103 }
104 } else if (column.getType() == ColumnDescription.REAL) {
105 try {
106 featureValue.setValue(Double.parseDouble(symbol));
107 featureValue.setSymbol(symbol);
108 } catch (NumberFormatException e) {
109 throw new FeatureException("Could not cast the feature value '"+symbol+"' to real value.", e);
110 }
111 }
112 if (column.getType() == ColumnDescription.INTEGER || column.getType() == ColumnDescription.BOOLEAN || column.getType() == ColumnDescription.REAL) {
113 featureValue.setNullValue(false);
114 featureValue.setIndexCode(1);
115 }
116 }
117
118 public FeatureValue getFeatureValue() {
119 return featureValue;
120 }
121
122 public boolean equals(Object obj) {
123 if (this == obj)
124 return true;
125 if (obj == null)
126 return false;
127 if (getClass() != obj.getClass())
128 return false;
129 return obj.toString().equals(this.toString());
130 }
131
132 public String getColumnName() {
133 return column.getName();
134 }
135
136 public SymbolTable getSymbolTable() {
137 return column.getSymbolTable();
138 }
139
140 public String toString() {
141 return column.getName();
142 }
143 }