From 6264b17844e3d93257dfbca78d57dda6059fd1bd Mon Sep 17 00:00:00 2001 From: Jonathan Shook Date: Fri, 27 Mar 2020 08:44:14 -0500 Subject: [PATCH] partial work for search within --- .../docsys/core/PathWalkerTest.java | 7 + .../nosqlbench/engine/api/util/NBFiles.java | 16 ++- .../engine/api/util/NBPathWalker.java | 125 ++++++++++++++++++ .../engine/api/util/NBPathWalkerTest.java | 21 +++ .../resources/testdocs/nested1/identity.yaml | 2 + 5 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 docsys/src/test/java/io/nosqlbench/docsys/core/PathWalkerTest.java create mode 100644 engine-api/src/main/java/io/nosqlbench/engine/api/util/NBPathWalker.java create mode 100644 engine-api/src/test/java/io/nosqlbench/engine/api/util/NBPathWalkerTest.java create mode 100644 engine-api/src/test/resources/testdocs/nested1/identity.yaml diff --git a/docsys/src/test/java/io/nosqlbench/docsys/core/PathWalkerTest.java b/docsys/src/test/java/io/nosqlbench/docsys/core/PathWalkerTest.java new file mode 100644 index 000000000..d7215f608 --- /dev/null +++ b/docsys/src/test/java/io/nosqlbench/docsys/core/PathWalkerTest.java @@ -0,0 +1,7 @@ +package io.nosqlbench.docsys.core; + +import static org.junit.Assert.*; + +public class PathWalkerTest { + +} diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBFiles.java b/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBFiles.java index 3e7da3f45..3f70196c7 100644 --- a/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBFiles.java +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBFiles.java @@ -73,7 +73,15 @@ public class NBFiles { return Optional.empty(); } - public static Optional findOptionalPath(String basename, String extension, String... searchPaths) { + /** + * Search for the path + * @param basename Basename of path, with or without extension + * @param extension The extension of the filename + * @param searchWithin If enabled, all searchPaths are traversed, looking for a matching suffix pattern. + * @param searchPaths Additional places to look for the path suffix + * @return An optional path + */ + public static Optional findOptionalPath(String basename, String extension, boolean searchWithin, String... searchPaths) { boolean needsExtension = (extension != null && !extension.isEmpty() && !basename.endsWith("." + extension)); String filename = basename + (needsExtension ? "." + extension : ""); @@ -95,6 +103,12 @@ public class NBFiles { } } + if (searchWithin) { + throw new RuntimeException("not implemented"); +// for (String searchPath : searchPaths) { +// NBPathWalker.findEndMatching(Path.of(searchPath), Path.of(filename)); +// } + } return Optional.empty(); } diff --git a/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBPathWalker.java b/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBPathWalker.java new file mode 100644 index 000000000..6b03f794f --- /dev/null +++ b/engine-api/src/main/java/io/nosqlbench/engine/api/util/NBPathWalker.java @@ -0,0 +1,125 @@ +package io.nosqlbench.engine.api.util; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; +import java.nio.file.spi.FileSystemProvider; +import java.util.ArrayList; +import java.util.List; + +public class NBPathWalker { + private final static Logger logger = LogManager.getLogger(NBPathWalker.class); + + public static void walk(Path p, PathVisitor v) { + walk(p, v, NBPathWalker.WALK_ALL); + } + + public static List findAll(Path p) { + Collect fileCollector = new Collect(true, false); + walk(p, fileCollector); + return fileCollector.get(); + } + public static List findEndMatching(Path p, Path endingName) { + Collect fileCollector = new Collect(true, false); + MatchEnding ending = new MatchEnding(endingName.toString()); + walk(p, fileCollector, ending); + return fileCollector.get(); + } + + public static void walk(Path p, PathVisitor v, DirectoryStream.Filter filter) { + try { + FileSystemProvider provider = p.getFileSystem().provider(); + DirectoryStream paths = provider.newDirectoryStream(p, (Path r) -> true); + List pathlist = new ArrayList<>(); + for (Path path : paths) { + pathlist.add(path); + } + for (Path path : pathlist) { + if (path.getFileSystem().provider().readAttributes(path, BasicFileAttributes.class).isDirectory()) { + v.preVisitDir(path); + walk(path, v, filter); + v.postVisitDir(path); + } else if (filter.accept(path)) { + v.preVisitFile(path); + v.visit(path); + v.postVisitFile(path); + + } else { + logger.error("error"); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public interface PathVisitor { + void visit(Path p); + + default void preVisitFile(Path path) { + } + + default void postVisitFile(Path path) { + } + + default void preVisitDir(Path path) { + } + + default void postVisitDir(Path path) { + } + } + + public static DirectoryStream.Filter WALK_ALL = entry -> true; + + public static class MatchEnding implements DirectoryStream.Filter { + private final String regex; + + public MatchEnding(String pathEnd) { + this.regex = pathEnd; + } + + @Override + public boolean accept(Path entry) throws IOException { + return entry.toString().endsWith(regex); + } + } + + public static class Collect implements PathVisitor { + private final List listing = new ArrayList<>(); + private final boolean collectFiles; + private final boolean collectDirectories; + + public Collect(boolean collectFiles, boolean collectDirectories) { + + this.collectFiles = collectFiles; + this.collectDirectories = collectDirectories; + } + + public List get() { + return listing; + } + + @Override + public void visit(Path p) { + } + + @Override + public void preVisitFile(Path path) { + if (this.collectFiles) { + listing.add(path); + } + } + + @Override + public void preVisitDir(Path path) { + if (this.collectDirectories) { + listing.add(path); + } + } + } + +} diff --git a/engine-api/src/test/java/io/nosqlbench/engine/api/util/NBPathWalkerTest.java b/engine-api/src/test/java/io/nosqlbench/engine/api/util/NBPathWalkerTest.java new file mode 100644 index 000000000..7607eb859 --- /dev/null +++ b/engine-api/src/test/java/io/nosqlbench/engine/api/util/NBPathWalkerTest.java @@ -0,0 +1,21 @@ +package io.nosqlbench.engine.api.util; + +import org.junit.Test; + +import java.nio.file.Path; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class NBPathWalkerTest { + + @Test + public void testBasicPathmatching() { + List found = NBPathWalker.findEndMatching( + Path.of("testdocs"), + Path.of("identity.yaml") + ); + + assertThat(found).containsExactly(Path.of("flsd")); + } +} diff --git a/engine-api/src/test/resources/testdocs/nested1/identity.yaml b/engine-api/src/test/resources/testdocs/nested1/identity.yaml new file mode 100644 index 000000000..706c257c0 --- /dev/null +++ b/engine-api/src/test/resources/testdocs/nested1/identity.yaml @@ -0,0 +1,2 @@ +bindings: + i: Identity();