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    }