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 }