1 /* 2 * Copyright (c) 2001-2003 World Wide Web Consortium, (Massachusetts Institute 3 * of Technology, Institut National de Recherche en Informatique et en 4 * Automatique, Keio University). All Rights Reserved. This program is 5 * distributed under the W3C's Software Intellectual Property License. This 6 * program is distributed in the hope that it will be useful, but WITHOUT ANY 7 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 8 * FOR A PARTICULAR PURPOSE. See W3C License 9 * http://www.w3.org/Consortium/Legal/ for more details. 10 */ 11 12 13 package org.w3c.domts; 14 15 import java.io.File; 16 import java.io.IOException; 17 import java.io.InputStream; 18 import java.lang.reflect.Method; 19 import java.net.MalformedURLException; 20 import java.net.URL; 21 22 import org.w3c.dom.DOMImplementation; 23 import org.w3c.dom.Document; 24 25 /** 26 * This is an abstract base class for generated DOM tests 27 * 28 */ 29 public abstract class DOMTest /* wBM: implements EventListener */ { 30 private DOMTestDocumentBuilderFactory factory; 31 private int mutationCount = 0; 32 33 /** 34 * This is the appropriate constructor for tests that make no requirements 35 * on the parser configuration. 36 * 37 * @param factory 38 * must not be null 39 */ DOMTest(DOMTestDocumentBuilderFactory factory)40 public DOMTest(DOMTestDocumentBuilderFactory factory) { 41 if (factory == null) { 42 throw new NullPointerException("factory"); 43 } 44 this.factory = factory; 45 } 46 47 /** 48 * This constructor is used by tests that must create a modified document 49 * factory to meet requirements on the parser configuration. setFactory 50 * should be called within the test's constructor. 51 */ DOMTest()52 public DOMTest() { 53 factory = null; 54 } 55 56 /** 57 * Should only be called in the constructor of a derived type. 58 */ setFactory(DOMTestDocumentBuilderFactory factory)59 protected void setFactory(DOMTestDocumentBuilderFactory factory) { 60 this.factory = factory; 61 } 62 hasFeature(String feature, String version)63 public boolean hasFeature(String feature, String version) { 64 return factory.hasFeature(feature, version); 65 } 66 hasSetting(DocumentBuilderSetting setting)67 public boolean hasSetting(DocumentBuilderSetting setting) { 68 return setting.hasSetting(factory); 69 } 70 getFactory()71 protected DOMTestDocumentBuilderFactory getFactory() { 72 return factory; 73 } 74 getImplementation()75 public DOMImplementation getImplementation() { 76 return factory.getDOMImplementation(); 77 } 78 resolveURI(String baseURI)79 private URL resolveURI(String baseURI) throws DOMTestLoadException { 80 String docURI = factory.addExtension(baseURI); 81 82 URL resolvedURI = null; 83 try { 84 resolvedURI = new URL(docURI); 85 if (resolvedURI.getProtocol() != null) { 86 return resolvedURI; 87 } 88 } 89 catch (MalformedURLException ex) { 90 // throw new DOMTestLoadException(ex); 91 } 92 // 93 // build a URL for a test file in the JAR 94 // 95 resolvedURI = getClass().getResource("/" + docURI); 96 if (resolvedURI == null) { 97 // 98 // see if it is an absolute URI 99 // 100 int firstSlash = docURI.indexOf('/'); 101 try { 102 if (firstSlash == 0 103 || (firstSlash >= 1 104 && docURI.charAt(firstSlash - 1) == ':')) { 105 resolvedURI = new URL(docURI); 106 } 107 else { 108 // 109 // try the files/level?/spec directory 110 // 111 String filename = getClass().getPackage().getName(); 112 filename = 113 "tests/" 114 + filename.substring(14).replace('.', '/') 115 + "/files/" 116 + docURI; 117 resolvedURI = new java.io.File(filename).toURL(); 118 } 119 } 120 catch (MalformedURLException ex) { 121 throw new DOMTestLoadException(ex); 122 } 123 } 124 125 if (resolvedURI == null) { 126 throw new DOMTestLoadException( 127 new java.io.FileNotFoundException(docURI)); 128 } 129 return resolvedURI; 130 } 131 getResourceURI(String href, String scheme, String contentType)132 public String getResourceURI(String href, String scheme, String contentType) throws 133 DOMTestLoadException { 134 if (scheme == null) { 135 throw new NullPointerException("scheme"); 136 } 137 if ("file".equals(scheme)) { 138 return resolveURI(href).toString(); 139 } 140 if ("http".equals(scheme)) { 141 StringBuffer httpURL = new StringBuffer( 142 System.getProperty("org.w3c.domts.httpbase", 143 "http://localhost:8080/webdav/")); 144 httpURL.append(href); 145 if ("application/pdf".equals(contentType)) { 146 httpURL.append(".pdf"); 147 } 148 else { 149 httpURL.append(".xml"); 150 } 151 return httpURL.toString(); 152 } 153 throw new DOMTestLoadException(new Exception("Unrecognized URI scheme " + 154 scheme)); 155 } 156 createTempURI(String scheme)157 public String createTempURI(String scheme) throws DOMTestLoadException { 158 if (scheme == null) { 159 throw new NullPointerException("scheme"); 160 } 161 if ("file".equals(scheme)) { 162 try { 163 File tempFile = File.createTempFile("domts", ".xml"); 164 try { 165 // 166 // if available use JDK 1.4's File.toURI().toString() 167 // 168 Method method = File.class.getMethod("toURI", (Class<?>) null); 169 Object uri = method.invoke(tempFile, (Class<?>) null); 170 return uri.toString(); 171 } 172 catch (NoSuchMethodException ex) { 173 // 174 // File.toURL is not as robust 175 // 176 URL url = tempFile.toURL(); 177 return url.toString(); 178 } 179 } 180 catch (Exception ex) { 181 throw new DOMTestLoadException(ex); 182 } 183 } 184 if ("http".equals(scheme)) { 185 String httpBase = System.getProperty("org.w3c.domts.httpbase", 186 "http://localhost:8080/webdav/"); 187 java.lang.StringBuffer buf = new StringBuffer(httpBase); 188 if (!httpBase.endsWith("/")) { 189 buf.append("/"); 190 } 191 buf.append("tmp"); 192 buf.append( (new java.util.Random()).nextInt(Integer.MAX_VALUE)); 193 buf.append(".xml"); 194 return buf.toString(); 195 } 196 throw new DOMTestLoadException(new Exception("Unrecognized URI scheme " + 197 scheme)); 198 } 199 load(String docURI, boolean willBeModified)200 public Document load(String docURI, boolean willBeModified) throws 201 DOMTestLoadException { 202 Document doc = factory.load(resolveURI(docURI)); 203 // 204 // if will be modified is false and doc is an EventTarget 205 // 206 /* 207 * wBM: if (!willBeModified && doc instanceof EventTarget) { 208 * ((EventTarget) doc).addEventListener("DOMSubtreeModified", this, 209 * false); } 210 */ 211 return doc; 212 } 213 preload(String contentType, String docURI, boolean willBeModified)214 public void preload(String contentType, String docURI, boolean willBeModified) throws 215 DOMTestIncompatibleException { 216 if ("text/html".equals(contentType) || 217 "application/xhtml+xml".equals(contentType)) { 218 if (docURI.startsWith("staff") || docURI.equals("datatype_normalization")) { 219 throw DOMTestIncompatibleException.incompatibleLoad(docURI, contentType); 220 } 221 } 222 } 223 createXPathEvaluator(Document doc)224 public Object createXPathEvaluator(Document doc) { 225 return factory.createXPathEvaluator(doc); 226 } 227 createStream(String bytes)228 public InputStream createStream(String bytes) throws DOMTestLoadException, 229 IOException { 230 int byteCount = bytes.length() / 2; 231 byte[] array = new byte[byteCount]; 232 for (int i = 0; i < byteCount; i++) { 233 array[i] = Byte.parseByte(bytes.substring(i * 2, i * 2 + 2), 16); 234 } 235 return new java.io.ByteArrayInputStream(array); 236 } 237 getTargetURI()238 abstract public String getTargetURI(); 239 isCoalescing()240 public final boolean isCoalescing() { 241 return factory.isCoalescing(); 242 } 243 isExpandEntityReferences()244 public final boolean isExpandEntityReferences() { 245 return factory.isExpandEntityReferences(); 246 } 247 isIgnoringElementContentWhitespace()248 public final boolean isIgnoringElementContentWhitespace() { 249 return factory.isIgnoringElementContentWhitespace(); 250 } 251 isNamespaceAware()252 public final boolean isNamespaceAware() { 253 return factory.isNamespaceAware(); 254 } 255 isValidating()256 public final boolean isValidating() { 257 return factory.isValidating(); 258 } 259 isSigned()260 public final boolean isSigned() { 261 return true; 262 } 263 isHasNullString()264 public final boolean isHasNullString() { 265 return true; 266 } 267 getContentType()268 public final String getContentType() { 269 return factory.getContentType(); 270 } 271 272 /** 273 * Implementation of EventListener.handleEvent 274 * 275 * This method is called when a mutation is reported for a document that 276 * was declared to not be modified during testing 277 * 278 * @param evt 279 * mutation event 280 */ 281 /* 282 * wBM: public final void handleEvent(Event evt) { mutationCount++; } 283 */ 284 getMutationCount()285 public final int getMutationCount() { 286 return mutationCount; 287 } 288 289 } 290