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