package org.maltparser.core.io.dataformat; import org.maltparser.core.exception.MaltChainedException; import org.maltparser.core.symbol.SymbolTable; import org.maltparser.core.symbol.SymbolTableHandler; /** * * * @author Johan Hall * @since 1.0 * */ public class ColumnDescription implements Comparable<ColumnDescription> { // Categories public static final int INPUT = 1; public static final int HEAD = 2; public static final int DEPENDENCY_EDGE_LABEL = 3; public static final int PHRASE_STRUCTURE_EDGE_LABEL = 4; public static final int PHRASE_STRUCTURE_NODE_LABEL = 5; public static final int SECONDARY_EDGE_LABEL = 6; public static final int IGNORE = 7; // Types public static final int STRING = 1; public static final int INTEGER = 2; public static final int BOOLEAN = 3; public static final int REAL = 4; private static int positionCounter = 0; private int position; private String name; private int category; private int type; private String categoryName; private String typeName; private String defaultOutput; private SymbolTable symbolTable; private String nullValueStrategy; private boolean internal; private int cachedHash; public ColumnDescription(String name, String category, String type, String defaultOutput, SymbolTableHandler symbolTables, String nullValueStrategy, boolean internal) throws MaltChainedException { setPosition(positionCounter++); setName(name); setCategory(category); setType(type); setDefaultOutput(defaultOutput); setNullValueStrategy(nullValueStrategy); setInternal(internal); createSymbolTable(symbolTables); } public ColumnDescription(String name, int category, int type, String defaultOutput, SymbolTableHandler symbolTables, String nullValueStrategy, boolean internal) throws MaltChainedException { setPosition(positionCounter++); setName(name); setCategory(category); setType(type); setDefaultOutput(defaultOutput); setNullValueStrategy(nullValueStrategy); setInternal(internal); createSymbolTable(symbolTables); } private void createSymbolTable(SymbolTableHandler symbolTables) throws MaltChainedException { if (type == ColumnDescription.STRING || type == ColumnDescription.INTEGER || type == ColumnDescription.BOOLEAN || type == ColumnDescription.REAL) { symbolTable = symbolTables.addSymbolTable(name, category, nullValueStrategy); } else { symbolTable = null; } } public int getPosition() { return position; } public String getName() { return name; } public String getDefaultOutput() { return defaultOutput; } public SymbolTable getSymbolTable() { return symbolTable; } public String getNullValueStrategy() { return nullValueStrategy; } private void setNullValueStrategy(String nullValueStrategy) { this.nullValueStrategy = nullValueStrategy; } public boolean isInternal() { return internal; } private void setInternal(boolean internal) { this.internal = internal; } private void setPosition(int position) throws MaltChainedException { if (position >= 0) { this.position = position; } else { throw new DataFormatException("Position value for column must be a non-negative value. "); } } private void setName(String name) { this.name = name.toUpperCase(); } private void setCategory(String category) throws MaltChainedException { categoryName = category.toUpperCase(); if (categoryName.equals("INPUT")) { this.category = ColumnDescription.INPUT; } else if (categoryName.equals("HEAD")) { this.category = ColumnDescription.HEAD; } else if (categoryName.equals("OUTPUT")) { this.category = ColumnDescription.DEPENDENCY_EDGE_LABEL; } else if (categoryName.equals("DEPENDENCY_EDGE_LABEL")) { this.category = ColumnDescription.DEPENDENCY_EDGE_LABEL; } else if (categoryName.equals("PHRASE_STRUCTURE_EDGE_LABEL")) { this.category = ColumnDescription.PHRASE_STRUCTURE_EDGE_LABEL; } else if (categoryName.equals("PHRASE_STRUCTURE_NODE_LABEL")) { this.category = ColumnDescription.PHRASE_STRUCTURE_NODE_LABEL; } else if (categoryName.equals("SECONDARY_EDGE_LABEL")) { this.category = ColumnDescription.SECONDARY_EDGE_LABEL; } else if (categoryName.equals("IGNORE")) { this.category = ColumnDescription.IGNORE; } else { throw new DataFormatException("The category '" + category + "' is not allowed. "); } } private void setCategory(int category) throws MaltChainedException { if (category >= INPUT && category <= IGNORE) { this.category = category; } else { throw new DataFormatException("The category '" + category + "' is not allowed. "); } } public int getCategory() { return category; } public String getCategoryName() { return categoryName; } public int getType() { return type; } public String getTypeName() { return typeName; } private void setType(String type) throws MaltChainedException { this.typeName = type.toUpperCase(); if (typeName.equals("STRING")) { this.type = ColumnDescription.STRING; } else if (typeName.equals("INTEGER")) { this.type = ColumnDescription.INTEGER; } else if (typeName.equals("BOOLEAN")) { this.type = ColumnDescription.BOOLEAN; } else if (typeName.equals("REAL")) { this.type = ColumnDescription.REAL; } else if (typeName.equals("ECHO")) { // ECHO is removed, but if it occurs in the data format file it will be interpreted as an integer instead. this.type = ColumnDescription.INTEGER; } else { throw new DataFormatException("The column type '" + type + "' is not allowed. "); } } private void setType(int type) throws MaltChainedException { if (type >= STRING && type <= REAL) { this.type = type; } else { throw new DataFormatException("The column type '" + type + "' is not allowed. "); } } private void setDefaultOutput(String defaultOutput) { this.defaultOutput = defaultOutput; } public int compareTo(ColumnDescription that) { final int BEFORE = -1; final int EQUAL = 0; final int AFTER = 1; if (this == that) { return EQUAL; } if (this.position < that.position) { return BEFORE; } if (this.position > that.position) { return AFTER; } return EQUAL; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } ColumnDescription objC = (ColumnDescription) obj; return type == objC.type && category == objC.category && ((name == null) ? objC.name == null : name.equals(objC.name)); } @Override public int hashCode() { if (cachedHash == 0) { int hash = 31 * 7 + type; hash = 31 * hash + category; hash = 31 * hash + (null == name ? 0 : name.hashCode()); cachedHash = hash; } return cachedHash; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(name); sb.append('\t'); sb.append(category); sb.append('\t'); sb.append(type); if (defaultOutput != null) { sb.append('\t'); sb.append(defaultOutput); } return sb.toString(); } }