001package org.maltparser.core.symbol.nullvalue;
002
003import java.util.SortedMap;
004import java.util.TreeMap;
005
006import org.maltparser.core.exception.MaltChainedException;
007import org.maltparser.core.helper.HashMap;
008import org.maltparser.core.symbol.SymbolException;
009import org.maltparser.core.symbol.SymbolTable;
010/**
011
012
013@author Johan Hall
014@since 1.0
015 */
016public abstract class NullValues {
017        protected enum NullValueDegree {
018                NONE, ONE, 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                final 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}