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