1   
2   
3   
4   
5   
6   
7   
8   package org.dom4j;
9   
10  import junit.textui.TestRunner;
11  
12  import java.io.StringReader;
13  import java.util.Iterator;
14  import java.util.List;
15  
16  import javax.xml.parsers.DocumentBuilder;
17  import javax.xml.parsers.DocumentBuilderFactory;
18  
19  import org.dom4j.io.DOMReader;
20  
21  import org.xml.sax.InputSource;
22  
23  /***
24   * Test the use of namespaces
25   * 
26   * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
27   * @version $Revision: 1.4 $
28   */
29  public class NamespacesTest extends AbstractTestCase {
30      public static void main(String[] args) {
31          TestRunner.run(NamespacesTest.class);
32      }
33  
34      
35      
36      public void testNamespaces() throws Exception {
37          testNamespaces(document);
38          testNamespaces(saxRoundTrip(document));
39          testNamespaces(domRoundTrip(document));
40      }
41  
42      public void testNamespaces(Document document) throws Exception {
43          Document doc2 = (Document) document.clone();
44  
45          Element root = doc2.getRootElement();
46          assertNamespace(root.getNamespace(), "",
47                  "http://www.w3.org/2001/XMLSchema");
48          assertEquals("xmlns=\"http://www.w3.org/2001/XMLSchema\"", root
49                  .getNamespace().asXML());
50          assertEquals("namespace::*[name()='']", root.getNamespace().getPath());
51          assertEquals("namespace::*[name()='']", root.getNamespace()
52                  .getUniquePath());
53  
54          List additionalNS = root.additionalNamespaces();
55          assertTrue("at least one additional namespace", (additionalNS != null)
56                  && (additionalNS.size() > 0));
57  
58          Namespace ns = (Namespace) additionalNS.get(0);
59          assertNamespace(ns, "t", "http://www.w3.org/namespace/");
60          assertEquals("xmlns:t=\"http://www.w3.org/namespace/\"", ns.asXML());
61          assertEquals("namespace::t", ns.getPath());
62          assertEquals("namespace::t", ns.getUniquePath());
63  
64          Node node = root.node(0);
65          assertTrue("First node is a namespace", node instanceof Namespace);
66  
67          
68          root.remove(ns);
69          root.addNamespace("t", "myNewURI");
70  
71          additionalNS = root.additionalNamespaces();
72          assertTrue("at least one additional namespace", (additionalNS != null)
73                  && (additionalNS.size() > 0));
74  
75          ns = (Namespace) additionalNS.get(0);
76          assertNamespace(ns, "t", "myNewURI");
77  
78          
79          additionalNS.remove(0);
80          additionalNS.add(Namespace.get("t", "myNewURI-2"));
81  
82          additionalNS = root.additionalNamespaces();
83          assertTrue("at least one additional namespace", (additionalNS != null)
84                  && (additionalNS.size() > 0));
85  
86          ns = (Namespace) additionalNS.get(0);
87          assertNamespace(ns, "t", "myNewURI-2");
88  
89          additionalNS.clear();
90          root.addNamespace("t", "myNewURI");
91  
92          additionalNS = root.additionalNamespaces();
93          assertTrue("at least one additional namespace", (additionalNS != null)
94                  && (additionalNS.size() > 0));
95  
96          ns = (Namespace) additionalNS.get(0);
97          assertNamespace(ns, "t", "myNewURI");
98  
99          log("Namespaces: " + additionalNS);
100         log("XML is now");
101         log(root.asXML());
102     }
103 
104     public void testNamespaceForPrefix() throws Exception {
105         testNamespaceForPrefix(document);
106         testNamespaceForPrefix(saxRoundTrip(document));
107         testNamespaceForPrefix(domRoundTrip(document));
108     }
109 
110     public void testNamespaceForPrefix(Document document) throws Exception {
111         Element root = document.getRootElement();
112         Namespace ns = root.getNamespaceForPrefix("t");
113 
114         assertNamespace(ns, "t", "http://www.w3.org/namespace/");
115 
116         Element element = (Element) root.elements().get(0);
117         Namespace ns2 = element.getNamespaceForPrefix("t");
118 
119         assertNamespace(ns2, "t", "http://www.w3.org/namespace/");
120         assertTrue("Same namespace instance returned", ns == ns2);
121 
122         log("found: " + ns.asXML());
123     }
124 
125     public void testNamespaceForDefaultPrefix() throws Exception {
126         Document document = getDocument("/xml/test/defaultNamespace.xml");
127 
128         testNamespaceForDefaultPrefix(document);
129         testNamespaceForDefaultPrefix(saxRoundTrip(document));
130         testNamespaceForDefaultPrefix(domRoundTrip(document));
131     }
132 
133     public void testNamespaceForDefaultPrefix(Document document)
134             throws Exception {
135         List list = document.selectNodes("//*");
136 
137         for (Iterator iter = list.iterator(); iter.hasNext();) {
138             Element element = (Element) iter.next();
139             Namespace ns = element.getNamespaceForPrefix("");
140             assertNamespace(ns, "", "dummyNamespace");
141             ns = element.getNamespaceForPrefix(null);
142             assertNamespace(ns, "", "dummyNamespace");
143             log("found: " + ns.asXML());
144         }
145     }
146 
147     public void testAttributeDefaultPrefix() throws Exception {
148         Document document = getDocument("/xml/test/soap3.xml");
149 
150         testAttributeDefaultPrefix(document);
151         testAttributeDefaultPrefix(saxRoundTrip(document));
152         testAttributeDefaultPrefix(domRoundTrip(document));
153     }
154 
155     public void testAttributeDefaultPrefix(Document document) throws Exception {
156         List list = document.selectNodes("//@*[local-name()='actor']");
157 
158         assertTrue("Matched at least one 'actor' attribute", list.size() > 0);
159 
160         for (Iterator iter = list.iterator(); iter.hasNext();) {
161             Attribute attribute = (Attribute) iter.next();
162 
163             log("found: " + attribute.asXML());
164 
165             Element element = attribute.getParent();
166             assertTrue("Attribute has a parent", element != null);
167 
168             Namespace ns = element.getNamespaceForPrefix("");
169 
170             String uri = "http://schemas.xmlsoap.org/soap/envelope/";
171             assertNamespace(ns, "", uri);
172 
173             Namespace ns2 = attribute.getNamespace();
174 
175             
176             assertNamespace(ns2, "", "");
177         }
178     }
179 
180     public void testNamespaceForURI() throws Exception {
181         testNamespaceForURI(document);
182         testNamespaceForURI(saxRoundTrip(document));
183         testNamespaceForURI(domRoundTrip(document));
184     }
185 
186     public void testNamespaceForURI(Document document) throws Exception {
187         Element root = document.getRootElement();
188 
189         Namespace ns = root.getNamespaceForURI("http://www.w3.org/namespace/");
190 
191         assertNamespace(ns, "t", "http://www.w3.org/namespace/");
192 
193         Element element = (Element) root.elements().get(0);
194         Namespace ns2 = element
195                 .getNamespaceForURI("http://www.w3.org/namespace/");
196 
197         assertNamespace(ns2, "t", "http://www.w3.org/namespace/");
198 
199         assertTrue("Same namespace instance returned", ns == ns2);
200 
201         log("found: " + ns.asXML());
202     }
203 
204     public void testRedeclareNamespaces() throws Exception {
205         Document document = getDocument("/xml/test/soap2.xml");
206         testRedeclareNamespaces(document);
207         testRedeclareNamespaces(saxRoundTrip(document));
208         testRedeclareNamespaces(domRoundTrip(document));
209     }
210 
211     public void testRedeclareNamespaces(Document document) throws Exception {
212         String uri = "http://schemas.xmlsoap.org/soap/envelope/";
213         assertNamespaces(document.selectNodes("//*[local-name()='Envelope']"),
214                 "SOAP-ENV", uri);
215         assertNamespaces(document.selectNodes("//*[local-name()='Body']"),
216                 "SOAP-ENV", uri);
217         assertNamespaces(document.selectNodes("//*[local-name()='bar']"), "a",
218                 "barURI");
219         assertNamespaces(document.selectNodes("//*[local-name()='newBar']"),
220                 "a", "newBarURI");
221         assertNamespaces(document.selectNodes("//*[local-name()='foo']"), "",
222                 "fooURI");
223         assertNamespaces(document.selectNodes("//*[local-name()='newFoo']"),
224                 "", "newFooURI");
225     }
226 
227     public void testDefaultNamespaceIssue() throws Exception {
228         Document document = getDocument("/xml/test/defaultNamespaceIssue.xsd");
229         testDefaultNamespaceIssue(document);
230         testDefaultNamespaceIssue(saxRoundTrip(document));
231         testDefaultNamespaceIssue(domRoundTrip(document));
232     }
233 
234     public void testDefaultNamespaceIssue(Document document) throws Exception {
235         
236         
237         
238         
239         
240         String expr 
241             = "/xsd:schema/xsd:element/xsd:annotation/xsd:documentation/text";
242         assertNotNull("default namespace redeclaration", (Element) document
243                 .selectSingleNode(expr));
244 
245         
246         
247         
248         
249         Iterator iter = document.getRootElement().declaredNamespaces()
250                 .iterator();
251 
252         while (iter.hasNext()) {
253             Namespace ns = (Namespace) iter.next();
254 
255             if ("urn:wapforum:devicesheet".equals(ns.getURI())
256                     && "".equals(ns.getPrefix())) {
257                 return;
258             }
259         }
260 
261         fail("Default namespace declaration not present on root element");
262     }
263 
264     public void testDefaultNamespace() throws Exception {
265         Document doc = DocumentHelper.createDocument();
266         Element processDef = doc.addElement("process-definition",
267                 "http://jbpm.org/statedefinition-2.0-beta3");
268         Element startState = processDef.addElement("start-state");
269         startState.addAttribute("name", "start");
270 
271         Element transition = startState.addElement("transition");
272         transition.addAttribute("to", "first");
273 
274         assertEquals("http://jbpm.org/statedefinition-2.0-beta3", startState
275                 .getNamespace().getURI());
276         assertEquals("", startState.getNamespace().getPrefix());
277 
278         System.out.println(doc.asXML());
279     }
280 
281     
282     
283     protected void setUp() throws Exception {
284         super.setUp();
285         document = getDocument("/xml/test/test_schema.xml");
286     }
287 
288     protected Document saxRoundTrip(Document document) throws Exception {
289         return DocumentHelper.parseText(document.asXML());
290     }
291 
292     protected Document domRoundTrip(Document document) throws Exception {
293         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
294         factory.setNamespaceAware(true);
295 
296         DocumentBuilder builder = factory.newDocumentBuilder();
297         org.w3c.dom.Document domDocument = builder.parse(new InputSource(
298                 new StringReader(document.asXML())));
299 
300         
301         DOMReader domReader = new DOMReader();
302 
303         return domReader.read(domDocument);
304     }
305 
306     protected void assertNamespaces(List elements, String prefix, String uri)
307             throws Exception {
308         for (Iterator iter = elements.iterator(); iter.hasNext();) {
309             Element element = (Element) iter.next();
310             assertNamespace(element.getNamespace(), prefix, uri);
311         }
312     }
313 
314     protected void assertNamespace(Namespace ns, String prefix, String uri)
315             throws Exception {
316         assertEquals("namespace prefix", prefix, ns.getPrefix());
317         assertEquals("namespace URI", uri, ns.getURI());
318     }
319 }
320 
321 
322 
323 
324 
325 
326 
327 
328 
329 
330 
331 
332 
333 
334 
335 
336 
337 
338 
339 
340 
341 
342 
343 
344 
345 
346 
347 
348 
349 
350 
351 
352 
353 
354 
355 
356