1 package tests.org.w3c.dom;
2 
3 import java.net.MalformedURLException;
4 import java.net.URL;
5 
6 import javax.xml.parsers.DocumentBuilder;
7 
8 import org.w3c.dom.Document;
9 import org.xml.sax.SAXException;
10 import org.xml.sax.SAXParseException;
11 
12 import junit.framework.TestCase;
13 
14 public class DOMTestCase extends TestCase {
15 
load(String docURI, DocumentBuilder builder)16     public Document load(String docURI, DocumentBuilder builder) {
17         Document doc = load(resolveURI(docURI), builder);
18         return doc;
19     }
20 
load(URL url, DocumentBuilder builder)21     public Document load(URL url, DocumentBuilder builder) {
22         Document doc = null;
23         Exception parseException = null;
24         try {
25             LoadErrorHandler errorHandler = new LoadErrorHandler();
26             builder.setErrorHandler(errorHandler);
27             doc = builder.parse(url.openStream());
28             parseException = errorHandler.getFirstException();
29         } catch (Exception ex) {
30             parseException = ex;
31         }
32         builder.setErrorHandler(null);
33         if (parseException != null) {
34             // fail("Unexpected exception " + parseException.getMessage());
35             throw new RuntimeException("Unexpected exception " + parseException.getMessage(), parseException);
36         }
37         return doc;
38     }
39 
preload(String contentType, String docURI, boolean willBeModified)40     public void preload(String contentType, String docURI,
41             boolean willBeModified) {
42         if ("text/html".equals(contentType)
43                 || "application/xhtml+xml".equals(contentType)) {
44             if (docURI.startsWith("staff")
45                     || docURI.equals("datatype_normalization")) {
46 
47             }
48         }
49     }
50 
resolveURI(String baseURI)51     private URL resolveURI(String baseURI) {
52         String docURI = baseURI + ".xml";
53 
54         URL resolvedURI = null;
55         try {
56             resolvedURI = new URL(docURI);
57             if (resolvedURI.getProtocol() != null) {
58                 return resolvedURI;
59             }
60         } catch (MalformedURLException ex) {
61             // fail("Unexpected exception " + ex.getMessage());
62         }
63         //
64         // build a URL for a test file in the JAR
65         //
66         resolvedURI = getClass().getResource("/" + docURI);
67         if (resolvedURI == null) {
68             //
69             // see if it is an absolute URI
70             //
71             int firstSlash = docURI.indexOf('/');
72             try {
73                 if (firstSlash == 0
74                         || (firstSlash >= 1 && docURI.charAt(firstSlash - 1) == ':')) {
75                     resolvedURI = new URL(docURI);
76                 } else {
77                     //
78                     // try the files/level?/spec directory
79                     //
80                     String filename = getClass().getPackage().getName();
81                     filename = "tests/"
82                             + filename.substring(14).replace('.', '/')
83                             + "/files/" + docURI;
84                     resolvedURI = new java.io.File(filename).toURL();
85                 }
86             } catch (MalformedURLException ex) {
87                 fail("Unexpected exception " + ex.getMessage());
88             }
89         }
90 
91         if (resolvedURI == null) {
92             fail("resolvedURI is null ");
93         }
94         return resolvedURI;
95     }
96 
97 
getContentType()98     public String getContentType() {
99         return "xml";
100     }
101 
assertURIEquals(String assertID, String scheme, String path, String host, String file, String name, String query, String fragment, Boolean isAbsolute, String actual)102     public void assertURIEquals(String assertID, String scheme, String path,
103             String host, String file, String name, String query,
104             String fragment, Boolean isAbsolute, String actual) {
105         //
106         // URI must be non-null
107         assertNotNull(assertID, actual);
108 
109         String uri = actual;
110 
111         int lastPound = actual.lastIndexOf("#");
112         String actualFragment = "";
113         if (lastPound != -1) {
114             //
115             // substring before pound
116             //
117             uri = actual.substring(0, lastPound);
118             actualFragment = actual.substring(lastPound + 1);
119         }
120         if (fragment != null) {
121             assertEquals(assertID, fragment, actualFragment);
122 
123         }
124         int lastQuestion = uri.lastIndexOf("?");
125         String actualQuery = "";
126         if (lastQuestion != -1) {
127             //
128             // substring before pound
129             //
130             uri = actual.substring(0, lastQuestion);
131             actualQuery = actual.substring(lastQuestion + 1);
132         }
133         if (query != null) {
134             assertEquals(assertID, query, actualQuery);
135 
136         }
137         int firstColon = uri.indexOf(":");
138         int firstSlash = uri.indexOf("/");
139         String actualPath = uri;
140         String actualScheme = "";
141         if (firstColon != -1 && firstColon < firstSlash) {
142             actualScheme = uri.substring(0, firstColon);
143             actualPath = uri.substring(firstColon + 1);
144         }
145 
146         if (scheme != null) {
147             assertEquals(assertID, scheme, actualScheme);
148         }
149 
150         if (path != null) {
151             assertEquals(assertID, path, actualPath);
152         }
153 
154         if (host != null) {
155             String actualHost = "";
156             if (actualPath.startsWith("//")) {
157                 int termSlash = actualPath.indexOf("/", 2);
158                 actualHost = actualPath.substring(0, termSlash);
159             }
160             assertEquals(assertID, host, actualHost);
161         }
162 
163         String actualFile = actualPath;
164         if (file != null || name != null) {
165             int finalSlash = actualPath.lastIndexOf("/");
166             if (finalSlash != -1) {
167                 actualFile = actualPath.substring(finalSlash + 1);
168             }
169             if (file != null) {
170                 assertEquals(assertID, file, actualFile);
171             }
172         }
173 
174         if (name != null) {
175             String actualName = actualFile;
176             int finalPeriod = actualFile.lastIndexOf(".");
177             if (finalPeriod != -1) {
178                 actualName = actualFile.substring(0, finalPeriod);
179             }
180             assertEquals(assertID, name, actualName);
181         }
182 
183         if (isAbsolute != null) {
184             //
185             // Jar URL's will have any actual path like file:/c:/somedrive...
186             assertEquals(assertID, isAbsolute.booleanValue(), actualPath
187                     .startsWith("/")
188                     || actualPath.startsWith("file:/"));
189         }
190     }
191 
192 
193     private class LoadErrorHandler implements org.xml.sax.ErrorHandler {
194         private SAXException parseException;
195 
196         private int errorCount;
197 
198         private int warningCount;
199 
LoadErrorHandler()200         public LoadErrorHandler() {
201             parseException = null;
202             errorCount = 0;
203             warningCount = 0;
204         }
205 
error(SAXParseException ex)206         public void error(SAXParseException ex) {
207             errorCount++;
208             if (parseException == null) {
209                 parseException = ex;
210             }
211         }
212 
warning(SAXParseException ex)213         public void warning(SAXParseException ex) {
214             warningCount++;
215         }
216 
fatalError(SAXParseException ex)217         public void fatalError(SAXParseException ex) {
218             if (parseException == null) {
219                 parseException = ex;
220             }
221         }
222 
getFirstException()223         public SAXException getFirstException() {
224             return parseException;
225         }
226     }
227 }
228