1 9 package org.ozoneDB.core.xml; 10 11 import org.xml.sax.Attributes ; 12 import org.xml.sax.Locator ; 13 14 import java.util.Hashtable ; 15 import java.util.Stack ; 16 17 23 public class HashtableContentHandler extends XML2ObjectContentHandler { 24 25 29 31 protected Stack hashEndStack; 32 33 35 private int memberStartStackSize = 0; 36 37 40 private int mode = NOMODE; 41 42 final static int NOMODE = 0; 43 final static int KEYMODE = 1; 44 final static int VALUEMODE = 2; 45 final static int NEXTMODE = 3; 46 47 51 53 public HashtableContentHandler() { 54 } 55 56 60 public HashtableContentHandler(Locator locator, Hashtable hash) { 61 super(); 62 63 stack.push(hash); 64 65 setDocumentLocator (locator); 66 67 hashEndStack = new Stack (); 68 hashEndStack.push("START"); 69 70 } 71 72 79 protected void memberStartElement(Attributes atts) { 80 81 if ((atts.getValue("name").equals("key") || 82 atts.getValue("name").equals("value") || 83 atts.getValue("name").equals("next")) && mode != NOMODE) { 84 85 System.out.println("Object Hashtable has member with name key/value/next !"); 86 } 87 88 if (atts.getValue("name").equals("key")) { 89 mode = KEYMODE; 90 memberStartStackSize = stack.size(); 91 } 92 93 if (atts.getValue("name").equals("value")) { 94 mode = VALUEMODE; 95 memberStartStackSize = stack.size(); 96 } 97 98 if (atts.getValue("name").equals("next")) { 99 mode = NEXTMODE; 100 memberStartStackSize = stack.size(); 101 } 102 103 if (mode != KEYMODE && mode != VALUEMODE) { 104 stack.push("Member " + atts.getValue("name")); 105 return; 106 } 107 108 handleMemberStartElement(atts); 109 } 110 111 115 protected void memberEndElement() { 116 117 if (mode == NEXTMODE) { 118 stack.pop(); 120 Object value = stack.pop(); 121 Object key = stack.pop(); 122 123 Hashtable hash = (Hashtable )stack.elementAt(0); 124 hash.put (key, value); 125 126 stack.remove(0); 127 stack.add(0, hash); 128 129 mode = NOMODE; 130 memberStartStackSize = 0; 131 return; 132 } 133 134 int currentStackSize = stack.size(); 135 if ((mode == KEYMODE || mode == VALUEMODE) && (currentStackSize-2) == memberStartStackSize) { 136 137 Object value = stack.pop(); 138 139 stack.pop(); 140 stack.push(value); 141 mode = NOMODE; 142 return; 143 } 144 145 if ((mode == KEYMODE || mode == VALUEMODE) && (currentStackSize-2) != memberStartStackSize) { 146 147 handleMemberEndElement(); 148 149 } else 150 stack.pop(); 151 } 152 153 159 protected void valueStartElement(Attributes atts) { 160 161 if (mode != KEYMODE && mode != VALUEMODE) { 162 stack.push("Value"); 163 return; 164 } 165 166 handleValueStartElement(atts); 167 } 168 169 173 protected void valueEndElement() { 174 if (mode != KEYMODE && mode != VALUEMODE) { 175 stack.pop(); 176 return; 177 } 178 179 handleValueEndElement(); 180 } 181 182 189 public void values (char[] ch, int start, int end) { 190 if (mode != KEYMODE && mode != VALUEMODE) 191 return; 192 193 handleValues(ch, start, end); 194 } 195 196 202 protected void valueObjStartElement(Attributes atts) { 203 if (mode != KEYMODE && mode != VALUEMODE) { 204 stack.push("ValueObj"); 205 return; 206 } 207 208 handleValueObjStartElement(atts); 209 } 210 211 215 protected void valueObjEndElement() { 216 if (mode != KEYMODE && mode != VALUEMODE) { 217 stack.pop(); 218 return; 219 } 220 221 handleValueObjEndElement(); 222 } 223 224 225 231 protected void valueArrayStartElement(Attributes atts) { 232 if (mode != KEYMODE && mode != VALUEMODE) { 233 stack.push("ValueArray"); 234 return; 235 } 236 237 handleValueArrayStartElement(atts); 238 } 239 240 244 protected void valueArrayEndElement() { 245 246 if (mode != KEYMODE && mode != VALUEMODE) { 247 stack.pop(); 248 return; 249 } 250 251 handleValueArrayEndElement(); 252 } 253 254 259 public Stack getStack() { 260 return stack; 261 } 262 263 } 264 | Popular Tags |