1 23 package org.objectweb.clif.scenario.util.isac.util.tree; 24 25 import java.io.InputStream ; 26 import java.io.InputStreamReader ; 27 import java.util.Enumeration ; 28 import java.util.Hashtable ; 29 import java.util.Vector ; 30 31 import org.apache.log4j.Category; 32 33 import com.wutka.dtd.DTD; 34 import com.wutka.dtd.DTDCardinal; 35 import com.wutka.dtd.DTDChoice; 36 import com.wutka.dtd.DTDElement; 37 import com.wutka.dtd.DTDItem; 38 import com.wutka.dtd.DTDMixed; 39 import com.wutka.dtd.DTDName; 40 import com.wutka.dtd.DTDParser; 41 import com.wutka.dtd.DTDSequence; 42 49 public class SyntaxAnalyser { 50 static Category cat = Category.getInstance(SyntaxAnalyser.class.getName()) ; 51 52 55 public final static char MULTIPLE = '*'; 56 public final static char UNIQUE = '!'; 57 public final static char MAYBE = '?'; 58 public final static char STRICT_MULTIPLE = '+'; 59 60 private Hashtable types; 61 68 public SyntaxAnalyser(String fileName) { 69 cat.debug("-> constructor") ; 70 this.types = new Hashtable (); 72 this.init(fileName); 73 } 74 75 81 private void init(String fileName) { 82 cat.debug("-> init") ; 83 try { 84 InputStream is = SyntaxAnalyser.class.getClassLoader().getResourceAsStream(fileName) ; 85 InputStreamReader reader = new InputStreamReader (is) ; 86 DTDParser dtdParser = new DTDParser(reader); 87 DTD dtd = dtdParser.parse(true); 88 Enumeration e = dtd.elements.elements(); 89 while (e.hasMoreElements()) { 90 DTDElement elem = (DTDElement) e.nextElement(); 91 if (Node.isBehaviorsNode(elem.name)) { 92 Hashtable children = new Hashtable (); 93 dumpDTDItem(elem.content, children, UNIQUE); 94 this.types.put(elem.name, children); 95 } 96 } 97 } catch (Exception e) { 98 cat.fatal("Unable to find the file or bad syntax : " + fileName + " -> " + e); 99 } 100 } 101 102 110 private static void dumpDTDItem(DTDItem item, Hashtable children, char card) { 111 cat.debug("-> dumpDTDItem") ; 112 if (item == null) 113 return; 114 115 if (item instanceof DTDName) { 116 if (Node.isBehaviorsNode(((DTDName) item).value)) { 117 if (item.cardinal == DTDCardinal.OPTIONAL) 119 card = MAYBE; 120 else if (item.cardinal == DTDCardinal.ZEROMANY) 121 card = MULTIPLE; 122 else if (item.cardinal == DTDCardinal.ONEMANY) 123 card = STRICT_MULTIPLE; 124 children.put(((DTDName) item).value, new Character (card)); 125 } 126 } else if (item instanceof DTDChoice) { 127 DTDItem[] items = ((DTDChoice) item).getItems(); 128 if (item.cardinal == DTDCardinal.OPTIONAL) 130 card = MAYBE; 131 else if (item.cardinal == DTDCardinal.ZEROMANY) 132 card = MULTIPLE; 133 else if (item.cardinal == DTDCardinal.ONEMANY) 134 card = STRICT_MULTIPLE; 135 for (int i = 0; i < items.length; i++) { 136 dumpDTDItem(items[i], children, card); 137 } 138 } else if (item instanceof DTDSequence) { 139 DTDItem[] items = ((DTDSequence) item).getItems(); 140 if (item.cardinal == DTDCardinal.OPTIONAL) 142 card = MAYBE; 143 else if (item.cardinal == DTDCardinal.ZEROMANY) 144 card = MULTIPLE; 145 else if (item.cardinal == DTDCardinal.ONEMANY) 146 card = STRICT_MULTIPLE; 147 148 for (int i = 0; i < items.length; i++) { 149 dumpDTDItem(items[i], children, card); 150 } 151 } else if (item instanceof DTDMixed) { 152 DTDItem[] items = ((DTDMixed) item).getItems(); 153 154 for (int i = 0; i < items.length; i++) { 155 dumpDTDItem(items[i], children, card); 156 } 157 } 158 } 159 160 167 public Hashtable childrenAllowed(String type) { 168 cat.debug("-> childrenAllowed" + type) ; 169 if (types.containsKey(type)) 170 return (Hashtable ) types.get(type); 171 return new Hashtable (); 172 } 173 174 181 public static Vector sortByType(Vector entries) { 182 cat.debug("-> sortByType") ; 183 if (entries == null) 184 return null ; 185 Vector result = new Vector (); 187 Vector objects = new Vector (); 188 Vector samples = new Vector (); 189 Vector timers = new Vector (); 190 Vector controlers = new Vector (); 191 Vector nonePlugins = new Vector (); 192 Vector structures = new Vector (); 193 Enumeration keys = entries.elements(); 195 while (keys.hasMoreElements()) { 196 String type = (String ) keys.nextElement(); 197 if (Node.isControllerNode(type)) { 198 controlers.add(type); 199 continue; 200 } 201 if (type.equals(Node.SAMPLE)) { 202 samples.add(type); 203 continue; 204 } 205 if (type.equals(Node.TIMER)) { 206 timers.add(type); 207 continue; 208 } 209 if (type.equals(Node.TIMER)) { 210 timers.add(type); 211 continue; 212 } 213 if (Node.isStructureNode(type)) { 214 structures.add(type); 215 continue; 216 } 217 if (type.equals(Node.USE)) { 218 objects.add(type) ; 219 continue ; 220 } 221 nonePlugins.add(type) ; 222 } 223 result.addAll(objects) ; 225 result.addAll(samples) ; 226 result.addAll(timers) ; 227 result.addAll(controlers) ; 228 result.addAll(nonePlugins) ; 229 result.addAll(structures) ; 230 231 return result ; 232 } 233 234 } | Popular Tags |