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}