]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/acr/xml/ElementIterator.java
Introduce CMS JShell
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / xml / ElementIterator.java
1 package org.argeo.cms.acr.xml;
2
3 import java.util.Iterator;
4 import java.util.NoSuchElementException;
5
6 import org.argeo.api.acr.ArgeoNamespace;
7 import org.argeo.api.acr.Content;
8 import org.argeo.api.acr.CrName;
9 import org.argeo.api.acr.spi.ProvidedSession;
10 import org.w3c.dom.Element;
11 import org.w3c.dom.Node;
12 import org.w3c.dom.NodeList;
13
14 class ElementIterator implements Iterator<Content> {
15 private DomContent parent;
16 private final ProvidedSession session;
17 private final DomContentProvider provider;
18 private final NodeList nodeList;
19
20 private int currentIndex;
21 private final int length;
22 private Element nextElement = null;
23
24 public ElementIterator(DomContent parent, ProvidedSession session, DomContentProvider provider, NodeList nodeList) {
25 this.parent = parent;
26 this.session = session;
27 this.provider = provider;
28 this.nodeList = nodeList;
29
30 this.length = nodeList.getLength();
31 this.currentIndex = 0;
32 this.nextElement = findNext();
33 }
34
35 private Element findNext() {
36 while (currentIndex < length) {
37 Node node = nodeList.item(currentIndex);
38 if (node instanceof Element) {
39 return (Element) node;
40 }
41 currentIndex++;
42 }
43 return null;
44 }
45
46 @Override
47 public boolean hasNext() {
48 return nextElement != null;
49 }
50
51 @Override
52 public Content next() {
53 if (nextElement == null)
54 throw new NoSuchElementException();
55 Content result;
56 String isMount = nextElement.getAttributeNS(ArgeoNamespace.CR_NAMESPACE_URI, CrName.mount.qName().getLocalPart());
57 if (isMount.equals("true")) {
58 result = session.get(parent.getPath() + '/' + nextElement.getTagName());
59 }
60
61 else {
62 result = new DomContent(session, provider, nextElement);
63 }
64 currentIndex++;
65 nextElement = findNext();
66 return result;
67 }
68
69 }