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* 
014* @author Johan Hall
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                if (code < 0 || code >= nextCode)
070                        return false;
071                return true;
072        }
073        
074        public boolean isNullValue(String symbol) {
075                if (symbol == null || symbol.length() == 0 || symbol.charAt(0) != '#')
076                        return false;
077                if (symbol.equals("#null#")) {
078                        return true;
079                }
080                
081                if ((nullValueEncoding == NullValueDegree.ROOTNODE || nullValueEncoding == NullValueDegree.NOVALUE) && symbol.equals("#rootnode#")) {
082                        return true;
083                }
084                
085                if (nullValueEncoding == NullValueDegree.NOVALUE && symbol.equals("#novalue#")) {
086                        return true;
087                }
088                return false;
089        }
090        
091        public int nullvalueToCode(NullValueId nullValueIdentifier) throws MaltChainedException {
092                if (!nullValue2CodeMap.containsKey(nullValueIdentifier)) {
093                        throw new SymbolException("Illegal null-value identifier. ");
094                }
095                return nullValue2CodeMap.get(nullValueIdentifier);
096        }
097        
098        public String nullvalueToSymbol(NullValueId nullValueIdentifier) throws MaltChainedException {
099                if (!nullValue2SymbolMap.containsKey(nullValueIdentifier)) {
100                        throw new SymbolException("Illegal null-value identifier. ");
101                }
102                return nullValue2SymbolMap.get(nullValueIdentifier);
103        }
104        
105        public int symbolToCode(String symbol) {
106                if (!symbol2CodeMap.containsKey(symbol)) {
107                        return -1;
108                }
109                return symbol2CodeMap.get(symbol);
110        }
111        
112        public String codeToSymbol(int code) {
113                if (!code2SymbolMap.containsKey(code)) {
114                        return null;
115                }
116                return code2SymbolMap.get(code);
117        }
118        
119        protected abstract void setNullValueEncoding(String nullValueStrategy);
120        protected abstract void makeNullValues();
121        
122        /* (non-Javadoc)
123         * @see java.lang.Object#equals(java.lang.Object)
124         */
125        public boolean equals(Object obj) {
126                if (this == obj)
127                        return true;
128                if (obj == null)
129                        return false;
130                if (getClass() != obj.getClass())
131                        return false;
132                
133                NullValues nl = (NullValues)obj;
134                if (!nullValueStrategy.equalsIgnoreCase(nl.getNullValueStrategy())) { return false; }
135                if (nextCode != nl.getNextCode()) { return false; }
136                if (!nullValue2SymbolMap.equals(nl.nullValue2SymbolMap)) { return false; }
137                if (!nullValue2CodeMap.equals(nl.nullValue2CodeMap)) { return false; }  
138                if (!code2SymbolMap.equals(nl.code2SymbolMap)) { return false; }
139                if (!symbol2CodeMap.equals(nl.symbol2CodeMap)) { return false; }
140                return true;
141        }
142        
143        /* (non-Javadoc)
144         * @see java.lang.Object#toString()
145         */
146        public String toString() {
147                final StringBuilder sb = new StringBuilder();
148                sb.append("Null-values:\n");
149                sb.append("  Strategy: "+ nullValueStrategy);
150                sb.append("  NO_NODE -> "+ nullValue2CodeMap.get(NullValueId.NO_NODE) + " " + nullValue2SymbolMap.get(NullValueId.NO_NODE)+"\n");
151                sb.append("  ROOT_NODE -> "+ nullValue2CodeMap.get(NullValueId.ROOT_NODE) + " " + nullValue2SymbolMap.get(NullValueId.ROOT_NODE)+"\n");
152                sb.append("  NO_VALUE -> "+ nullValue2CodeMap.get(NullValueId.NO_VALUE) + " " + nullValue2SymbolMap.get(NullValueId.NO_VALUE)+"\n");
153                return sb.toString();
154        }
155}