]> git.argeo.org Git - lgpl/argeo-commons.git/blob - cms/gcr/xml/DomContent.java
Prepare next development cycle
[lgpl/argeo-commons.git] / cms / gcr / xml / DomContent.java
1 package org.argeo.cms.gcr.xml;
2
3 import java.util.HashSet;
4 import java.util.Iterator;
5 import java.util.Set;
6
7 import org.argeo.api.gcr.Content;
8 import org.argeo.api.gcr.ContentSystemProvider;
9 import org.argeo.api.gcr.spi.AbstractContent;
10 import org.w3c.dom.Attr;
11 import org.w3c.dom.Element;
12 import org.w3c.dom.NamedNodeMap;
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15 import org.w3c.dom.Text;
16
17 public class DomContent extends AbstractContent implements Content {
18
19 private final DomContentSession contentSession;
20 private final Element element;
21
22 // private String text = null;
23 private Boolean hasText = null;
24
25 public DomContent(DomContentSession contentSession, Element element) {
26 this.contentSession = contentSession;
27 this.element = element;
28 }
29
30 @Override
31 public Iterator<Content> iterator() {
32 NodeList nodeList = element.getChildNodes();
33 return new ElementIterator(contentSession, nodeList);
34 }
35
36 @Override
37 public String getName() {
38 return element.getNodeName();
39 }
40
41 @Override
42 public Iterable<String> keys() {
43 // TODO implement an iterator?
44 Set<String> result = new HashSet<>();
45 NamedNodeMap attributes = element.getAttributes();
46 for (int i = 0; i < attributes.getLength(); i++) {
47 Attr attr = (Attr) attributes.item(i);
48 String attrName = attr.getNodeName();
49 result.add(attrName);
50 }
51 return result;
52 }
53
54 @Override
55 public <A> A get(String key, Class<A> clss) {
56 if (element.hasAttribute(key)) {
57 String value = element.getAttribute(key);
58 if (clss.isAssignableFrom(String.class))
59 return (A) value;
60 else
61 throw new IllegalArgumentException();
62 } else
63 return null;
64 }
65
66
67 @Override
68 public boolean hasText() {
69 // return element instanceof Text;
70 if (hasText != null)
71 return hasText;
72 NodeList nodeList = element.getChildNodes();
73 if (nodeList.getLength() > 1) {
74 hasText = false;
75 return hasText;
76 }
77 nodes: for (int i = 0; i < nodeList.getLength(); i++) {
78 Node node = nodeList.item(i);
79 if (node instanceof Text) {
80 Text text =(Text) node;
81 if (!text.isElementContentWhitespace()) {
82 hasText = true;
83 break nodes;
84 }
85 }
86 }
87 if (hasText == null)
88 hasText = false;
89 return hasText;
90 // if (text != null)
91 // return true;
92 // text = element.getTextContent();
93 // return text != null;
94 }
95
96 @Override
97 public String getText() {
98 if (hasText())
99 return element.getTextContent();
100 else
101 return null;
102 }
103
104 }