001 package org.maltparser.core.io.dataformat;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.symbol.SymbolTable;
005 import org.maltparser.core.symbol.SymbolTableHandler;
006
007 /**
008 *
009 *
010 * @author Johan Hall
011 * @since 1.0
012 **/
013 public class ColumnDescription implements Comparable<ColumnDescription> {
014 // Categories
015 public static final int INPUT = 1;
016 public static final int HEAD = 2;
017 public static final int DEPENDENCY_EDGE_LABEL = 3;
018 public static final int PHRASE_STRUCTURE_EDGE_LABEL = 4;
019 public static final int PHRASE_STRUCTURE_NODE_LABEL = 5;
020 public static final int SECONDARY_EDGE_LABEL = 6;
021
022 // Types
023 public static final int STRING = 1;
024 public static final int INTEGER = 2;
025 public static final int BOOLEAN = 3;
026 public static final int ECHO = 4;
027 public static final int IGNORE = 5;
028
029 private int position;
030 private String name;
031 private int category;
032 private int type;
033 private String defaultOutput;
034 private SymbolTable symbolTable;
035 private int cachedHash;
036
037 public ColumnDescription(int position, String name, String category, String type, String defaultOutput, SymbolTableHandler symbolTables, String specialSymbolsfileName, String rootLabel) throws MaltChainedException {
038 setPosition(position);
039 setName(name);
040 setCategory(category);
041 setType(type);
042 setDefaultOutput(defaultOutput);
043 createSymbolTable(symbolTables, specialSymbolsfileName, rootLabel);
044 }
045
046 private void createSymbolTable(SymbolTableHandler symbolTables, String nullValueStrategy, String rootLabel) throws MaltChainedException {
047 if (type == ColumnDescription.STRING || type == ColumnDescription.INTEGER || type == ColumnDescription.BOOLEAN) {
048 if (category == ColumnDescription.DEPENDENCY_EDGE_LABEL) {
049 symbolTable = symbolTables.addSymbolTable(name, category, nullValueStrategy, rootLabel);
050 } else {
051 symbolTable = symbolTables.addSymbolTable(name, category, nullValueStrategy);
052 }
053 } else {
054 symbolTable = null;
055 }
056 }
057
058 public int getPosition() {
059 return position;
060 }
061
062 public String getName() {
063 return name;
064 }
065
066 public int getCategory() {
067 return category;
068 }
069
070 public int getType() {
071 return type;
072 }
073
074 public String getDefaultOutput() {
075 return defaultOutput;
076 }
077
078 public SymbolTable getSymbolTable() {
079 return symbolTable;
080 }
081
082 private void setPosition(int position) throws MaltChainedException {
083 if (position >= 0) {
084 this.position = position;
085 } else {
086 throw new DataFormatException("Position value for column must be a non-negative value. ");
087 }
088 }
089
090 private void setName(String name) {
091 this.name = name.toUpperCase();
092 }
093
094 private void setCategory(String category) throws MaltChainedException {
095 if (category.toUpperCase().equals("INPUT")) {
096 this.category = ColumnDescription.INPUT;
097 } else if (category.toUpperCase().equals("HEAD")) {
098 this.category = ColumnDescription.HEAD;
099 } else if (category.toUpperCase().equals("OUTPUT")) {
100 this.category = ColumnDescription.DEPENDENCY_EDGE_LABEL;
101 } else if (category.toUpperCase().equals("DEPENDENCY_EDGE_LABEL")) {
102 this.category = ColumnDescription.DEPENDENCY_EDGE_LABEL;
103 } else if (category.toUpperCase().equals("PHRASE_STRUCTURE_EDGE_LABEL")) {
104 this.category = ColumnDescription.PHRASE_STRUCTURE_EDGE_LABEL;
105 } else if (category.toUpperCase().equals("PHRASE_STRUCTURE_NODE_LABEL")) {
106 this.category = ColumnDescription.PHRASE_STRUCTURE_NODE_LABEL;
107 } else if (category.toUpperCase().equals("SECONDARY_EDGE_LABEL")) {
108 this.category = ColumnDescription.SECONDARY_EDGE_LABEL;
109 } else {
110 throw new DataFormatException("The category '"+category+"' is not allowed. ");
111 }
112 }
113
114 private void setType(String type) throws MaltChainedException {
115 if (type.toUpperCase().equals("STRING")) {
116 this.type = ColumnDescription.STRING;
117 } else if (type.toUpperCase().equals("INTEGER")) {
118 this.type = ColumnDescription.INTEGER;
119 } else if (type.toUpperCase().equals("BOOLEAN")) {
120 this.type = ColumnDescription.BOOLEAN;
121 } else if (type.toUpperCase().equals("ECHO")) {
122 this.type = ColumnDescription.ECHO;
123 //this.type = ColumnDescription.STRING;
124 } else if (type.toUpperCase().equals("IGNORE")) {
125 this.type = ColumnDescription.IGNORE;
126 } else {
127 throw new DataFormatException("The column type '"+type+"' is not allowed. ");
128 }
129 }
130
131 public void setSymbolTable(SymbolTable symbolTable) {
132 if (type == ColumnDescription.STRING) {
133 this.symbolTable = symbolTable;
134 }
135 }
136
137 public void setDefaultOutput(String defaultOutput) {
138 this.defaultOutput = defaultOutput;
139 }
140
141 public int compareTo(ColumnDescription that) {
142 final int BEFORE = -1;
143 final int EQUAL = 0;
144 final int AFTER = 1;
145 if (this == that) return EQUAL;
146 if (this.position < that.position) return BEFORE;
147 if (this.position > that.position) return AFTER;
148 return EQUAL;
149 }
150
151 public boolean equals(Object obj) {
152 if (this == obj)
153 return true;
154 if (obj == null)
155 return false;
156 if (getClass() != obj.getClass())
157 return false;
158 ColumnDescription objC = (ColumnDescription)obj;
159 return type == objC.type && category == objC.category &&((name == null) ? objC.name == null : name.equals(objC.name));
160 }
161
162 public int hashCode() {
163 if (cachedHash == 0) {
164 int hash = 31*7 + type;
165 hash = 31*hash + category;
166 hash = 31*hash + (null == name ? 0 : name.hashCode());
167 cachedHash = hash;
168 }
169 return cachedHash;
170 }
171
172
173 public String toString() {
174 final StringBuilder sb = new StringBuilder();
175 sb.append(name);
176 sb.append('\t');
177 sb.append(category);
178 sb.append('\t');
179 sb.append(type);
180 if (defaultOutput != null) {
181 sb.append('\t');
182 sb.append(defaultOutput);
183 }
184 return sb.toString();
185 }
186 }