001    package org.maltparser.core.symbol.nullvalue;
002    
003    import java.util.HashMap;
004    import java.util.SortedMap;
005    import java.util.TreeMap;
006    
007    import org.maltparser.core.exception.MaltChainedException;
008    import org.maltparser.core.symbol.SymbolException;
009    import org.maltparser.core.symbol.SymbolTable;
010    /**
011    
012    
013    @author Johan Hall
014    @since 1.0
015     */
016    public abstract class NullValues {
017            protected enum NullValueDegree {
018                    NONE, ONE, ROOTLABEL, ROOTNODE, NOVALUE
019            };
020            public enum NullValueId {
021                    NO_NODE, ROOT_NODE, NO_VALUE
022            };
023            protected HashMap<NullValueId, String> nullValue2SymbolMap;
024            protected HashMap<NullValueId, Integer> nullValue2CodeMap;
025            protected HashMap<String, Integer> symbol2CodeMap;
026            protected SortedMap<Integer, String> code2SymbolMap;
027            protected SymbolTable table;
028            protected NullValueDegree nullValueEncoding;
029            protected String nullValueStrategy;
030            protected int nextCode;
031            
032            public NullValues(SymbolTable table) {
033                    setSymbolTable(table);
034                    nullValue2SymbolMap = new HashMap<NullValueId, String>();
035                    nullValue2CodeMap = new HashMap<NullValueId, Integer>();
036                    symbol2CodeMap = new HashMap<String, Integer>();
037                    code2SymbolMap = new TreeMap<Integer, String>();
038            }
039            
040            private void setSymbolTable(SymbolTable table) {
041                    this.table = table; 
042            }
043            
044            public SymbolTable getSymbolTable() {
045                    return table;
046            }
047            
048            public String getNullValueStrategy() {
049                    return nullValueStrategy;
050            }
051    
052            protected void setNullValueStrategy(String nullValueStrategy) {
053                    this.nullValueStrategy = nullValueStrategy;
054            }
055    
056            public NullValueDegree getNullValueEncoding() {
057                    return nullValueEncoding;
058            }
059            
060            public int getNextCode() {
061                    return nextCode;
062            }
063    
064            protected void setNextCode(int nextCode) {
065                    this.nextCode = nextCode;
066            }
067            
068            public boolean isNullValue(int code) {
069                    return code2SymbolMap.containsKey(code);
070            }
071            
072            public boolean isNullValue(String symbol) {
073                    return symbol2CodeMap.containsKey(symbol);
074            }
075            
076            public boolean isNullValue(StringBuilder symbol) {
077                    return symbol2CodeMap.containsKey(symbol);
078            }
079            
080            public int nullvalueToCode(NullValueId nullValueIdentifier) throws MaltChainedException {
081                    if (!nullValue2CodeMap.containsKey(nullValueIdentifier)) {
082                            throw new SymbolException("Illegal null-value identifier. ");
083                    }
084                    return nullValue2CodeMap.get(nullValueIdentifier);
085            }
086            
087            public String nullvalueToSymbol(NullValueId nullValueIdentifier) throws MaltChainedException {
088                    if (!nullValue2SymbolMap.containsKey(nullValueIdentifier)) {
089                            throw new SymbolException("Illegal null-value identifier. ");
090                    }
091                    return nullValue2SymbolMap.get(nullValueIdentifier);
092            }
093            
094            public int symbolToCode(String symbol) {
095                    if (!symbol2CodeMap.containsKey(symbol)) {
096                            return -1;
097                    }
098                    return symbol2CodeMap.get(symbol);
099            }
100            
101            public int symbolToCode(StringBuilder symbol) {
102                    if (!symbol2CodeMap.containsKey(symbol)) {
103                            return -1;
104                    }
105                    return symbol2CodeMap.get(symbol);
106            }
107            
108            public String codeToSymbol(int code) {
109                    if (!code2SymbolMap.containsKey(code)) {
110                            return null;
111                    }
112                    return code2SymbolMap.get(code);
113            }
114            
115            protected abstract void setNullValueEncoding(String nullValueStrategy);
116            protected abstract void makeNullValues();
117            
118            /* (non-Javadoc)
119             * @see java.lang.Object#equals(java.lang.Object)
120             */
121            public boolean equals(Object obj) {
122                    if (this == obj)
123                            return true;
124                    if (obj == null)
125                            return false;
126                    if (getClass() != obj.getClass())
127                            return false;
128                    
129                    NullValues nl = (NullValues)obj;
130                    if (!nullValueStrategy.equalsIgnoreCase(nl.getNullValueStrategy())) { return false; }
131                    if (nextCode != nl.getNextCode()) { return false; }
132                    if (!nullValue2SymbolMap.equals(nl.nullValue2SymbolMap)) { return false; }
133                    if (!nullValue2CodeMap.equals(nl.nullValue2CodeMap)) { return false; }  
134                    if (!code2SymbolMap.equals(nl.code2SymbolMap)) { return false; }
135                    if (!symbol2CodeMap.equals(nl.symbol2CodeMap)) { return false; }
136                    return true;
137            }
138            
139            /* (non-Javadoc)
140             * @see java.lang.Object#toString()
141             */
142            public String toString() {
143                    StringBuilder sb = new StringBuilder();
144                    sb.append("Null-values:\n");
145                    sb.append("  Strategy: "+ nullValueStrategy);
146                    sb.append("  NO_NODE -> "+ nullValue2CodeMap.get(NullValueId.NO_NODE) + " " + nullValue2SymbolMap.get(NullValueId.NO_NODE)+"\n");
147                    sb.append("  ROOT_NODE -> "+ nullValue2CodeMap.get(NullValueId.ROOT_NODE) + " " + nullValue2SymbolMap.get(NullValueId.ROOT_NODE)+"\n");
148                    sb.append("  NO_VALUE -> "+ nullValue2CodeMap.get(NullValueId.NO_VALUE) + " " + nullValue2SymbolMap.get(NullValueId.NO_VALUE)+"\n");
149                    return sb.toString();
150            }
151    }