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