diff --git a/src/main/java/com/marklogic/client/util/DefaultDocumentFileFinder.java b/src/main/java/com/marklogic/client/util/DefaultDocumentFileFinder.java new file mode 100644 index 0000000..dba6a82 --- /dev/null +++ b/src/main/java/com/marklogic/client/util/DefaultDocumentFileFinder.java @@ -0,0 +1,75 @@ +package com.marklogic.client.util; + +import com.marklogic.client.helper.LoggingObject; + +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.List; + +public class DefaultDocumentFileFinder extends LoggingObject implements FileVisitor, DocumentFileFinder { + + private Path currentAssetPath; + private FileFilter fileFilter; + private List documentFiles; + + public List findDocumentFiles(String... paths) { + documentFiles = new ArrayList<>(); + for (String path : paths) { + if (logger.isDebugEnabled()) { + logger.debug(format("Finding documents at path: %s", path)); + } + this.currentAssetPath = Paths.get(path); + try { + Files.walkFileTree(this.currentAssetPath, this); + } catch (IOException ie) { + throw new RuntimeException(format("IO error while walking file tree at path: %s", path), ie); + } + } + return documentFiles; + } + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + boolean accept = fileFilter == null || fileFilter.accept(dir.toFile()); + if (accept) { + if (logger.isTraceEnabled()) { + logger.trace("Visiting directory: " + dir); + } + return FileVisitResult.CONTINUE; + } else { + if (logger.isTraceEnabled()) { + logger.trace("Skipping directory: " + dir); + } + return FileVisitResult.SKIP_SUBTREE; + } + } + + @Override + public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { + if (fileFilter == null || fileFilter.accept(path.toFile())) { + Path relPath = currentAssetPath.relativize(path); + String uri = "/" + relPath.toString().replace("\\", "/"); + File f = path.toFile(); + this.documentFiles.add(new DocumentFile(uri, f)); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + public void setFileFilter(FileFilter fileFilter) { + this.fileFilter = fileFilter; + } +} diff --git a/src/main/java/com/marklogic/client/util/DocumentFile.java b/src/main/java/com/marklogic/client/util/DocumentFile.java new file mode 100644 index 0000000..a1e75e8 --- /dev/null +++ b/src/main/java/com/marklogic/client/util/DocumentFile.java @@ -0,0 +1,22 @@ +package com.marklogic.client.util; + +import java.io.File; + +public class DocumentFile { + + private String uri; + private File file; + + public DocumentFile(String uri, File file) { + this.uri = uri; + this.file = file; + } + + public String getUri() { + return uri; + } + + public File getFile() { + return file; + } +} diff --git a/src/main/java/com/marklogic/client/util/DocumentFileFinder.java b/src/main/java/com/marklogic/client/util/DocumentFileFinder.java new file mode 100644 index 0000000..025f803 --- /dev/null +++ b/src/main/java/com/marklogic/client/util/DocumentFileFinder.java @@ -0,0 +1,8 @@ +package com.marklogic.client.util; + +import java.util.List; + +public interface DocumentFileFinder { + + List findDocumentFiles(String... paths); +} diff --git a/src/test/java/com/marklogic/client/util/DocumentFinderTest.java b/src/test/java/com/marklogic/client/util/DocumentFinderTest.java new file mode 100644 index 0000000..db8a711 --- /dev/null +++ b/src/test/java/com/marklogic/client/util/DocumentFinderTest.java @@ -0,0 +1,27 @@ +package com.marklogic.client.util; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +public class DocumentFinderTest extends Assert { + + private DocumentFileFinder sut = new DefaultDocumentFileFinder(); + + @Test + public void noFileFilter() { + String path = "src/test/resources/schemas"; + List list = sut.findDocumentFiles(path); + assertEquals(3, list.size()); + + List uris = new ArrayList<>(); + for (DocumentFile file : list) { + uris.add(file.getUri()); + } + assertTrue(uris.contains("/child/child.tde")); + assertTrue(uris.contains("/child/grandchild/grandchild.tde")); + assertTrue(uris.contains("/parent.tde")); + } +} diff --git a/src/test/resources/schemas/child/child.tde b/src/test/resources/schemas/child/child.tde new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/schemas/child/grandchild/grandchild.tde b/src/test/resources/schemas/child/grandchild/grandchild.tde new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/schemas/parent.tde b/src/test/resources/schemas/parent.tde new file mode 100644 index 0000000..e69de29