1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.jxpath.ri.model.dom;
19
20 import org.apache.commons.jxpath.AbstractFactory;
21 import org.apache.commons.jxpath.JXPathContext;
22 import org.apache.commons.jxpath.Pointer;
23 import org.w3c.dom.Document;
24 import org.w3c.dom.Node;
25
26
27
28
29 public class TestDOMFactory extends AbstractFactory {
30
31 private void addDOMElement(final Node parent, final int index, final String tag, final String namespaceURI) {
32 Node child = parent.getFirstChild();
33 int count = 0;
34 while (child != null) {
35 if (child.getNodeName().equals(tag)) {
36 count++;
37 }
38 child = child.getNextSibling();
39 }
40
41 while (count <= index) {
42 final Document doc = parent.getOwnerDocument();
43 Node newElement;
44 if (namespaceURI == null) {
45 newElement = doc.createElement(tag);
46 } else {
47 newElement = doc.createElementNS(namespaceURI, tag);
48 }
49 parent.appendChild(newElement);
50 count++;
51 }
52 }
53
54
55
56
57 @Override
58 public boolean createObject(final JXPathContext context, final Pointer pointer, final Object parent, final String name, final int index) {
59 if (name.equals("location") || name.equals("address") || name.equals("street")) {
60 addDOMElement((Node) parent, index, name, null);
61 return true;
62 }
63 if (name.startsWith("price:")) {
64 final String namespaceURI = context.getNamespaceURI("price");
65 addDOMElement((Node) parent, index, name, namespaceURI);
66 return true;
67 }
68 return false;
69 }
70
71 @Override
72 public boolean declareVariable(final JXPathContext context, final String name) {
73 return false;
74 }
75 }