1 2 57 58 package dom.events; 59 60 import org.enhydra.apache.xerces.dom.TextImpl; 61 import org.w3c.dom.Document ; 62 import org.w3c.dom.NamedNodeMap ; 63 import org.w3c.dom.Node ; 64 import org.w3c.dom.NodeList ; 65 import org.w3c.dom.events.EventTarget ; 66 67 import util.Arguments; 68 import dom.DOMParserWrapper; 69 70 74 public class DeferredDOM 75 { 76 80 81 private static final String 82 DEFAULT_PARSER_NAME = "dom.wrappers.DOMParser"; 83 84 private static boolean setValidation = false; private static boolean setNameSpaces = true; 86 private static boolean setSchemaSupport = true; 87 private static boolean setDeferredDOM = true; 88 89 90 91 95 96 private long elements; 97 98 99 private long attributes; 100 101 102 private long characters; 103 104 105 private long ignorableWhitespace; 106 107 108 112 113 public static void traverse(String parserWrapperName, String uri) { 114 115 try { 116 DOMParserWrapper parser = 117 (DOMParserWrapper)Class.forName(parserWrapperName).newInstance(); 118 DeferredDOM test = new DeferredDOM(); 119 120 parser.setFeature( "http://apache.org/xml/features/dom/defer-node-expansion", 121 122 setDeferredDOM ); 123 parser.setFeature( "http://xml.org/sax/features/validation", 124 setValidation ); 125 parser.setFeature( "http://xml.org/sax/features/namespaces", 126 setNameSpaces ); 127 parser.setFeature( "http://apache.org/xml/features/validation/schema", 128 setSchemaSupport ); 129 130 Document document = parser.parse(uri); 131 test.reportAllMutations(document); 132 test.traverse(document); 133 } catch (org.xml.sax.SAXParseException spe) { 134 } catch (org.xml.sax.SAXNotRecognizedException ex ){ 135 } catch (org.xml.sax.SAXNotSupportedException ex ){ 136 } catch (org.xml.sax.SAXException se) { 137 if (se.getException() != null) 138 se.getException().printStackTrace(System.err); 139 else 140 se.printStackTrace(System.err); 141 } catch (Exception e) { 142 e.printStackTrace(System.err); 143 } 144 145 } 147 151 152 public void traverse(Node node) { 153 154 if (node == null) { 156 return; 157 } 158 159 int type = node.getNodeType(); 160 switch (type) { 161 case Node.DOCUMENT_NODE: { 163 elements = 0; 164 attributes = 0; 165 characters = 0; 166 ignorableWhitespace = 0; 167 traverse(((Document )node).getDocumentElement()); 168 break; 169 } 170 171 case Node.ELEMENT_NODE: { 173 elements++; 174 NamedNodeMap attrs = node.getAttributes(); 175 if (attrs != null) { 176 attributes += attrs.getLength(); 177 } 178 NodeList children = node.getChildNodes(); 179 if (children != null) { 180 int len = children.getLength(); 181 for (int i = 0; i < len; i++) { 182 traverse(children.item(i)); 183 } 184 } 185 break; 186 } 187 188 case Node.ENTITY_REFERENCE_NODE: { 190 NodeList children = node.getChildNodes(); 191 if (children != null) { 192 int len = children.getLength(); 193 for (int i = 0; i < len; i++) { 194 traverse(children.item(i)); 195 } 196 } 197 break; 198 } 199 200 case Node.CDATA_SECTION_NODE: { 202 characters += node.getNodeValue().length(); 203 break; 204 } 205 case Node.TEXT_NODE: { 206 if (node instanceof TextImpl) { 207 if (((TextImpl)node).isIgnorableWhitespace()) 208 ignorableWhitespace += node.getNodeValue().length(); 209 else 210 characters += node.getNodeValue().length(); 211 } else 212 characters += node.getNodeValue().length(); 213 break; 214 } 215 } 216 217 } 219 223 224 public static void main(String argv[]) { 225 226 Arguments argopt = new Arguments(); 227 argopt.setUsage( new String [] { 228 "usage: java dom.events.DeferredDOM (options) uri ...", 229 "", 230 "options:", 231 " -p name Specify DOM parser wrapper by name.", 232 " -n | -N Turn on/off namespace [default=on]", 233 " -v | -V Turn on/off validation [default=off]", 234 " -s | -S Turn on/off Schema support [default=on]", 235 " -d | -D Turn on/off deferred DOM [default=on]", 236 " -h This help screen."} ); 237 238 239 if (argv.length == 0) { 241 argopt.printUsage(); 242 System.exit(1); 243 } 244 245 String parserName = DEFAULT_PARSER_NAME; 247 248 argopt.parseArgumentTokens(argv , new char[] { 'p'} ); 249 250 int c; 251 String arg = null; 252 while ( ( arg = argopt.getlistFiles() ) != null ) { 253 outer: 254 while ( (c = argopt.getArguments()) != -1 ){ 255 switch (c) { 256 case 'v': 257 setValidation = true; 258 break; 260 case 'V': 261 setValidation = false; 262 break; 264 case 'N': 265 setNameSpaces = false; 266 break; 267 case 'n': 268 setNameSpaces = true; 269 break; 270 case 'p': 271 parserName = argopt.getStringParameter(); 273 break; 275 case 'd': 276 setDeferredDOM = true; 277 break; 278 case 'D': 279 setDeferredDOM = false; 280 break; 281 case 's': 282 setSchemaSupport = true; 284 break; 285 case 'S': 286 setSchemaSupport = false; 288 break; 289 case '?': 290 case 'h': 291 case '-': 292 argopt.printUsage(); 293 System.exit(1); 294 break; 295 case -1: 296 break outer; 298 default: 299 300 break; 301 } 302 } 303 304 traverse(parserName, arg ); } 306 307 } 309 310 EventReporter sharedReporter=new EventReporter(); 311 312 void reportAllMutations(Node n) 313 { 314 String [] evtNames={ 315 "DOMSubtreeModified","DOMAttrModified","DOMCharacterDataModified", 316 "DOMNodeInserted","DOMNodeRemoved", 317 "DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument", 318 }; 319 320 EventTarget t=(EventTarget )n; 321 322 for(int i=evtNames.length-1; 323 i>=0; 324 --i) 325 { 326 t.addEventListener(evtNames[i], sharedReporter, true); 327 t.addEventListener(evtNames[i], sharedReporter, false); 328 } 329 330 } 331 } 332 | Popular Tags |