    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    }