1   /*
2    * Copyright 1999-2004 The Apache Software Foundation
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.apache.commons.jxpath.ri.model.dom;
17  
18  import junit.framework.Test;
19  import junit.framework.TestSuite;
20  
21  import org.apache.commons.jxpath.AbstractFactory;
22  import org.apache.commons.jxpath.ri.model.XMLModelTestCase;
23  import org.apache.commons.jxpath.xml.DocumentContainer;
24  import org.w3c.dom.Attr;
25  import org.w3c.dom.Document;
26  import org.w3c.dom.Element;
27  import org.w3c.dom.Node;
28  import org.w3c.dom.NodeList;
29  
30  /***
31   * Tests JXPath with DOM
32   *
33   * @author Dmitri Plotnikov
34   * @version $Revision: 1.13 $ $Date: 2004/03/02 01:32:20 $
35   */
36  
37  public class DOMModelTest extends XMLModelTestCase {
38      
39      /***
40       * Construct a new instance of this test case.
41       *
42       * @param name Name of the test case
43       */
44      public DOMModelTest(String name) {
45          super(name);
46      }
47  
48      /***
49       * Return the tests included in this test suite.
50       */
51      public static Test suite() {
52          return (new TestSuite(DOMModelTest.class));
53      }
54  
55      protected String getModel() {
56          return DocumentContainer.MODEL_DOM;
57      }
58  
59      protected AbstractFactory getAbstractFactory() {
60          return new TestDOMFactory();
61      }
62      
63      public void testGetNode() {
64          assertXPathNodeType(context, "/", Document.class);
65          assertXPathNodeType(context, "/vendor/location", Element.class);
66          assertXPathNodeType(context, "//location/@name", Attr.class);
67      }
68      
69      protected String getXMLSignature(
70          Object node,
71          boolean elements,
72          boolean attributes,
73          boolean text,
74          boolean pi) 
75      {
76          StringBuffer buffer = new StringBuffer();
77          appendXMLSignature(buffer, node, elements, attributes, text, pi);
78          return buffer.toString();
79      }
80  
81      private void appendXMLSignature(
82          StringBuffer buffer,
83          Object object,
84          boolean elements,
85          boolean attributes,
86          boolean text,
87          boolean pi) 
88      {
89          Node node = (Node) object;
90          int type = node.getNodeType();
91          switch (type) {
92              case Node.DOCUMENT_NODE :
93                  buffer.append("<D>");
94                  appendXMLSignature(
95                      buffer,
96                      node.getChildNodes(),
97                      elements,
98                      attributes,
99                      text,
100                     pi);
101                 buffer.append("</D");
102                 break;
103 
104             case Node.ELEMENT_NODE :
105                 String tag = elements ? ((Element) node).getTagName() : "E";
106                 buffer.append("<");
107                 buffer.append(tag);
108                 buffer.append(">");
109                 appendXMLSignature(
110                     buffer,
111                     node.getChildNodes(),
112                     elements,
113                     attributes,
114                     text,
115                     pi);
116                 buffer.append("</");
117                 buffer.append(tag);
118                 buffer.append(">");
119                 break;
120 
121             case Node.TEXT_NODE :
122             case Node.CDATA_SECTION_NODE :
123                 if (text) {
124                     String string = node.getNodeValue();
125                     string = string.replace('\n', '=');
126                     buffer.append(string);
127                 }
128                 break;
129         }
130     }
131 
132     private void appendXMLSignature(
133         StringBuffer buffer,
134         NodeList children,
135         boolean elements,
136         boolean attributes,
137         boolean text,
138         boolean pi) 
139     {
140         for (int i = 0; i < children.getLength(); i++) {
141             appendXMLSignature(
142                 buffer,
143                 children.item(i),
144                 elements,
145                 attributes,
146                 text,
147                 pi);
148         }
149     }
150 }