]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.jcr/src/org/argeo/jcr/fs/NodeDirectoryStream.java
Move file system support to JCR bundle.
[lgpl/argeo-commons.git] / org.argeo.jcr / src / org / argeo / jcr / fs / NodeDirectoryStream.java
1 package org.argeo.jcr.fs;
2
3 import java.io.IOException;
4 import java.nio.file.DirectoryStream;
5 import java.nio.file.Path;
6 import java.util.Iterator;
7
8 import javax.jcr.Node;
9 import javax.jcr.NodeIterator;
10
11 public class NodeDirectoryStream implements DirectoryStream<Path> {
12 private final JcrFileSystem fs;
13 private final NodeIterator nodeIterator;
14 private final Filter<? super Path> filter;
15
16 public NodeDirectoryStream(JcrFileSystem fs, NodeIterator nodeIterator, Filter<? super Path> filter) {
17 this.fs = fs;
18 this.nodeIterator = nodeIterator;
19 this.filter = filter;
20 }
21
22 @Override
23 public void close() throws IOException {
24 }
25
26 @Override
27 public Iterator<Path> iterator() {
28 return new Iterator<Path>() {
29 private JcrPath next = null;
30
31 @Override
32 public synchronized boolean hasNext() {
33 if (next != null)
34 return true;
35 nodes: while (nodeIterator.hasNext()) {
36 try {
37 Node node = nodeIterator.nextNode();
38 String nodeName = node.getName();
39 if (nodeName.startsWith("rep:") || nodeName.startsWith("jcr:"))
40 continue nodes;
41 if (fs.skipNode(node))
42 continue nodes;
43 next = new JcrPath(fs, node);
44 if (filter != null) {
45 if (filter.accept(next))
46 break nodes;
47 } else
48 break nodes;
49 } catch (Exception e) {
50 throw new JcrFsException("Could not get next path", e);
51 }
52 }
53 return next != null;
54 }
55
56 @Override
57 public synchronized Path next() {
58 if (!hasNext())// make sure has next has been called
59 return null;
60 JcrPath res = next;
61 next = null;
62 return res;
63 }
64
65 };
66 }
67
68 }