    001    package org.maltparser.parser.history.container;
    002
    003    import org.maltparser.core.exception.MaltChainedException;
    004    import org.maltparser.core.symbol.Table;
    005    /**
    006    *
    007    * @author Johan Hall
    008    * @since 1.1
    009    **/
    010    public class TableContainer {
    011            public enum RelationToNextDecision { COMBINED, SEQUANTIAL, BRANCHED, SWITCHED, NONE }
    012            protected int cachedCode;
    013            protected StringBuilder cachedSymbol;
    014            protected Table table;
    015            protected String name;
    016            protected RelationToNextDecision relationToNextDecision;
    017
    018            public TableContainer(Table table, String name, char decisionSeparator) {
    019                    setTable(table);
    020                    setName(name);
    021                    setRelationToNextDecision(decisionSeparator);
    022                    cachedSymbol = new StringBuilder();
    023                    cachedCode = -1;
    024            }
    025
    026            public void clearCache() {
    027                    cachedCode = -1;
    028                    cachedSymbol.setLength(0);
    029            }
    030
    031            public String getSymbol(int code) throws MaltChainedException {
    032                    if (code < 0 && !containCode(code)) {
    033                            clearCache();
    034                            return null;
    035                    }
    036                    if (cachedCode != code) {
    037                            clearCache();
    038                            cachedCode = code;
    039                            cachedSymbol.append(table.getSymbolCodeToString(cachedCode));
    040                    }
    041                    return cachedSymbol.toString();
    042            }
    043
    044            public int getCode(String symbol) throws MaltChainedException {
    045                    if (cachedSymbol == null || !cachedSymbol.equals(symbol)) {
    046                            clearCache();
    047                            cachedSymbol.append(symbol);
    048                            cachedCode = table.getSymbolStringToCode(symbol);
    049                    }
    050                    return cachedCode;
    051            }
    052
    053            public boolean containCode(int code) throws MaltChainedException {
    054                    if (cachedCode != code) {
    055                            clearCache();
    056                            cachedSymbol.append(table.getSymbolCodeToString(code));
    057                            if (cachedSymbol == null) {
    058                                    return false;
    059                            }
    060                            cachedCode = code;
    061                    }
    062                    return true;
    063            }
    064
    065            public boolean containSymbol(String symbol) throws MaltChainedException {
    066                    if (cachedSymbol == null || !cachedSymbol.equals(symbol)) {
    067                            clearCache();
    068                            cachedCode = table.getSymbolStringToCode(symbol);
    069                            if (cachedCode < 0) {
    070                                    return false;
    071                            }
    072                            cachedSymbol.append(symbol);
    073                    }
    074                    return true;
    075            }
    076
    077            public boolean continueWithNextDecision(int code) throws MaltChainedException {
    078                    if (table instanceof DecisionPropertyTable) {
    079                            return ((DecisionPropertyTable)table).continueWithNextDecision(code);
    080                    }
    081                    return true;
    082            }
    083
    084            public boolean continueWithNextDecision(String symbol) throws MaltChainedException {
    085                    if (table instanceof DecisionPropertyTable) {
    086                            return ((DecisionPropertyTable)table).continueWithNextDecision(symbol);
    087                    }
    088                    return true;
    089            }
    090
    091            public Table getTable() {
    092                    return table;
    093            }
    094
    095            public String getTableName() {
    096                    return table != null?table.getName():null;
    097            }
    098
    099            public String getTableContainerName() {
    100                    return name;
    101            }
    102
    103            public RelationToNextDecision getRelationToNextDecision() {
    104                    return relationToNextDecision;
    105            }
    106
    107            protected void setRelationToNextDecision(char decisionSeparator) {
    108                    switch (decisionSeparator) {
    109                    case '+':
    110                            this.relationToNextDecision = RelationToNextDecision.COMBINED;
    111                            break;
    112                    case ',':
    113                            this.relationToNextDecision = RelationToNextDecision.SEQUANTIAL;
    114                            break;
    115                    case ';':
    116                            this.relationToNextDecision = RelationToNextDecision.BRANCHED;
    117                            break;
    118                    case '#':
    119                            this.relationToNextDecision = RelationToNextDecision.BRANCHED;
    120                            break;
    121                    case '?':
    122                            this.relationToNextDecision = RelationToNextDecision.SWITCHED;
    123                            break;
    124                    default:
    125                            this.relationToNextDecision = RelationToNextDecision.NONE;
    126                    }
    127            }
    128
    129            protected void setTable(Table table) {
    130                    this.table = table;
    131            }
    132
    133            protected void setName(String name) {
    134                    this.name = name;
    135            }
    136
    137            public int size() {
    138                    return table.size();
    139            }
    140
    141            public String toString() {
    142                    StringBuilder sb = new StringBuilder();
    143                    sb.append(name);
    144                    sb.append(" -> " );
    145                    sb.append(cachedSymbol);
    146                    sb.append(" = ");
    147                    sb.append(cachedCode);
    148                    return sb.toString();
    149            }
    150    }