From f4c207840e9ccbe6ade72ec0f73c7f1e5fb3c3f4 Mon Sep 17 00:00:00 2001 From: Milan Sanders Date: Thu, 21 Dec 2023 08:01:53 +0100 Subject: [PATCH 1/5] Allow checking subdirectories of sourceDir for schemas --- .../org/apache/xmlbeans/impl/tool/MavenPlugin.java | 10 ++++++++-- src/main/maven/plugin.xml | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java index 3fd8c857d..3832f8b73 100644 --- a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java +++ b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java @@ -15,6 +15,9 @@ package org.apache.xmlbeans.impl.tool; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.RegexFileFilter; +import org.apache.commons.io.filefilter.TrueFileFilter; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -59,6 +62,10 @@ public class MavenPlugin extends AbstractMojo { @Parameter( defaultValue = "*.xsd,*.wsdl,*.java" ) private String sourceSchemas; + /** sourceSubdirs determines if subdirectories of sourceDir are checked for schemas */ + @Parameter( defaultValue = "false" ) + private boolean sourceSubdirs; + /** xmlConfigs points to your xmlconfig.xml file */ @Parameter( defaultValue = "${project.basedir}/src/schema/xmlconfig.xml" ) private String xmlConfigs; @@ -217,8 +224,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { .replace("*",".*") + ")"); - File[] schemaFiles = Objects.requireNonNull(base.listFiles((dir, name) -> - !name.endsWith(".xsdconfig") && pat.matcher(name).matches())); + Collection schemaFiles = FileUtils.listFiles(base, new RegexFileFilter(pat), sourceSubdirs ? TrueFileFilter.INSTANCE : null); for (File sf : schemaFiles) { String name = sf.getName(); switch (name.replaceAll(".*\\.", "")) { diff --git a/src/main/maven/plugin.xml b/src/main/maven/plugin.xml index ef2d7fce2..c1002c38c 100644 --- a/src/main/maven/plugin.xml +++ b/src/main/maven/plugin.xml @@ -167,6 +167,13 @@ true sourceSchemas is a comma-delimited list of all the schemas you want to compile + + sourceSubdirs + boolean + false + true + sourceSubdirs determines if subdirectories of sourceDir are checked for schemas + xmlConfigs java.lang.String @@ -363,6 +370,7 @@ + From 9b1624915b6e7062bf0fd0418cfb3ef700eb4942 Mon Sep 17 00:00:00 2001 From: Milan Sanders Date: Thu, 21 Dec 2023 08:10:19 +0100 Subject: [PATCH 2/5] Exclude *.xsdconfig --- .../org/apache/xmlbeans/impl/tool/MavenPlugin.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java index 3832f8b73..7b15948d2 100644 --- a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java +++ b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java @@ -16,7 +16,12 @@ package org.apache.xmlbeans.impl.tool; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.filefilter.AndFileFilter; +import org.apache.commons.io.filefilter.IOFileFilter; +import org.apache.commons.io.filefilter.NameFileFilter; +import org.apache.commons.io.filefilter.NotFileFilter; import org.apache.commons.io.filefilter.RegexFileFilter; +import org.apache.commons.io.filefilter.SuffixFileFilter; import org.apache.commons.io.filefilter.TrueFileFilter; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; @@ -223,8 +228,11 @@ public void execute() throws MojoExecutionException, MojoFailureException { .replace(".", "\\.") .replace("*",".*") + ")"); - - Collection schemaFiles = FileUtils.listFiles(base, new RegexFileFilter(pat), sourceSubdirs ? TrueFileFilter.INSTANCE : null); + // Check for files that match the pattern and exclude *.xsdconfig + IOFileFilter fileFilter = new AndFileFilter(new RegexFileFilter(pat), new NotFileFilter(new SuffixFileFilter(".xsdconfig"))); + // if sourceSubdirs is true check all subdirectories of sourceDir, otherwise check only sourceDir + IOFileFilter directoryFilter = sourceSubdirs ? TrueFileFilter.INSTANCE : null; + Collection schemaFiles = FileUtils.listFiles(base, fileFilter, directoryFilter); for (File sf : schemaFiles) { String name = sf.getName(); switch (name.replaceAll(".*\\.", "")) { From 78cac2b8d13824f5f4a822fa93d64406ff626b0a Mon Sep 17 00:00:00 2001 From: Milan Sanders Date: Thu, 21 Dec 2023 08:11:20 +0100 Subject: [PATCH 3/5] Optimize imports --- src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java index 7b15948d2..d90be3c20 100644 --- a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java +++ b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java @@ -18,7 +18,6 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.AndFileFilter; import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.io.filefilter.NameFileFilter; import org.apache.commons.io.filefilter.NotFileFilter; import org.apache.commons.io.filefilter.RegexFileFilter; import org.apache.commons.io.filefilter.SuffixFileFilter; From 3167ccaf2349e2105ed43eb7bccc03ec51bd7554 Mon Sep 17 00:00:00 2001 From: Milan Sanders Date: Thu, 21 Dec 2023 10:28:57 +0100 Subject: [PATCH 4/5] Add commons-io as compile/runtime dependency --- build.gradle | 2 +- src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 034dde350..ed3efe751 100644 --- a/build.gradle +++ b/build.gradle @@ -123,6 +123,7 @@ dependencies { implementation "org.apache.ant:ant:${antVersion}" implementation "com.github.javaparser:javaparser-core:${javaparserVersion}" implementation "com.github.javaparser:javaparser-symbol-solver-core:${javaparserVersion}" + implementation "commons-io:commons-io:2.15.0" // only for java 8 if (JavaVersion.current() == JavaVersion.VERSION_1_8) { @@ -135,7 +136,6 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' testImplementation 'org.junit.platform:junit-platform-launcher:1.10.0' - testImplementation "commons-io:commons-io:2.15.0" testImplementation "org.apache.logging.log4j:log4j-core:${log4jVersion}" // testImplementation "org.apache.ant:ant-junit:${antVersion}" // testImplementation "org.apache.ant:ant-junit4:${antVersion}" diff --git a/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml b/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml index d80f45628..7914286c7 100644 --- a/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml +++ b/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml @@ -100,6 +100,11 @@ 3.25.5 provided + + commons-io + commons-io + 2.15.0 + From 353f63ef10dcf1733fc013e869abc6f23a5518d3 Mon Sep 17 00:00:00 2001 From: Milan Sanders Date: Thu, 21 Dec 2023 14:25:55 +0100 Subject: [PATCH 5/5] Rewrite without additional dependencies --- build.gradle | 2 +- .../xmlbeans/impl/tool/MavenPlugin.java | 14 +--- .../apache/xmlbeans/impl/util/FileUtil.java | 33 +++++++++ .../org.apache.xmlbeans/xmlbeans/pom.xml | 5 -- .../xmlbeans/impl/util/FileUtilTest.java | 69 +++++++++++++++++++ 5 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/apache/xmlbeans/impl/util/FileUtil.java create mode 100644 src/test/java/org/apache/xmlbeans/impl/util/FileUtilTest.java diff --git a/build.gradle b/build.gradle index ed3efe751..034dde350 100644 --- a/build.gradle +++ b/build.gradle @@ -123,7 +123,6 @@ dependencies { implementation "org.apache.ant:ant:${antVersion}" implementation "com.github.javaparser:javaparser-core:${javaparserVersion}" implementation "com.github.javaparser:javaparser-symbol-solver-core:${javaparserVersion}" - implementation "commons-io:commons-io:2.15.0" // only for java 8 if (JavaVersion.current() == JavaVersion.VERSION_1_8) { @@ -136,6 +135,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.0' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.10.0' testImplementation 'org.junit.platform:junit-platform-launcher:1.10.0' + testImplementation "commons-io:commons-io:2.15.0" testImplementation "org.apache.logging.log4j:log4j-core:${log4jVersion}" // testImplementation "org.apache.ant:ant-junit:${antVersion}" // testImplementation "org.apache.ant:ant-junit4:${antVersion}" diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java index d90be3c20..145c168d4 100644 --- a/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java +++ b/src/main/java/org/apache/xmlbeans/impl/tool/MavenPlugin.java @@ -15,13 +15,6 @@ package org.apache.xmlbeans.impl.tool; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.AndFileFilter; -import org.apache.commons.io.filefilter.IOFileFilter; -import org.apache.commons.io.filefilter.NotFileFilter; -import org.apache.commons.io.filefilter.RegexFileFilter; -import org.apache.commons.io.filefilter.SuffixFileFilter; -import org.apache.commons.io.filefilter.TrueFileFilter; import org.apache.maven.model.Resource; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -31,6 +24,7 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.xmlbeans.XmlError; +import org.apache.xmlbeans.impl.util.FileUtil; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -227,11 +221,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { .replace(".", "\\.") .replace("*",".*") + ")"); - // Check for files that match the pattern and exclude *.xsdconfig - IOFileFilter fileFilter = new AndFileFilter(new RegexFileFilter(pat), new NotFileFilter(new SuffixFileFilter(".xsdconfig"))); - // if sourceSubdirs is true check all subdirectories of sourceDir, otherwise check only sourceDir - IOFileFilter directoryFilter = sourceSubdirs ? TrueFileFilter.INSTANCE : null; - Collection schemaFiles = FileUtils.listFiles(base, fileFilter, directoryFilter); + Collection schemaFiles = FileUtil.find(base, pat, sourceSubdirs); for (File sf : schemaFiles) { String name = sf.getName(); switch (name.replaceAll(".*\\.", "")) { diff --git a/src/main/java/org/apache/xmlbeans/impl/util/FileUtil.java b/src/main/java/org/apache/xmlbeans/impl/util/FileUtil.java new file mode 100644 index 000000000..8637d1a05 --- /dev/null +++ b/src/main/java/org/apache/xmlbeans/impl/util/FileUtil.java @@ -0,0 +1,33 @@ +package org.apache.xmlbeans.impl.util; + +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FileUtil { + + private FileUtil() {} + + /** + * @param base Directory where to look for files + * @param pattern Regex pattern the files must match to be included + * @param searchSubdirectories If true, search all subdirectories. Otherwise, only search base + * @return Collection of files in base and possibly subdirectories that match pattern + */ + public static Collection find(File base, Pattern pattern, boolean searchSubdirectories) { + try (Stream pathStream = Files.find(base.toPath(), searchSubdirectories ? Integer.MAX_VALUE : 1, (path, atts) -> { + String name = path.getFileName().toString(); + return !name.endsWith(".xsdconfig") && pattern.matcher(name).matches(); + })) { + return pathStream.map(Path::toFile).collect(Collectors.toList()); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } +} diff --git a/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml b/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml index 7914286c7..d80f45628 100644 --- a/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml +++ b/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml @@ -100,11 +100,6 @@ 3.25.5 provided - - commons-io - commons-io - 2.15.0 - diff --git a/src/test/java/org/apache/xmlbeans/impl/util/FileUtilTest.java b/src/test/java/org/apache/xmlbeans/impl/util/FileUtilTest.java new file mode 100644 index 000000000..23e80a2c5 --- /dev/null +++ b/src/test/java/org/apache/xmlbeans/impl/util/FileUtilTest.java @@ -0,0 +1,69 @@ +package org.apache.xmlbeans.impl.util; + +import static org.junit.jupiter.api.Assertions.*; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Comparator; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class FileUtilTest { + + private Path root; + + @BeforeEach + public void setup() throws IOException { + root = Files.createTempDirectory("test"); + } + + @AfterEach + public void cleanup() throws IOException { + try (Stream walk = Files.walk(root)) { + walk.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } + + @Test + public void testFindNoSubdirs() throws IOException { + Files.createFile(root.resolve("test1.xsdconfig")); + Files.createFile(root.resolve("test1.xsd")); + Files.createFile(root.resolve("test1.txt")); + Path dir = Files.createDirectory(root.resolve("test")); + Files.createFile(dir.resolve("test2.xsdconfig")); + Files.createFile(dir.resolve("test2.xsd")); + Files.createFile(dir.resolve("test2.txt")); + + Collection files = FileUtil.find(root.toFile(), Pattern.compile(".*\\.xsd"), false); + + assertEquals(1, files.size()); + assertEquals("test1.xsd", files.iterator().next().getName()); + } + + @Test + public void testFindSubdirs() throws IOException { + Files.createFile(root.resolve("test1.xsdconfig")); + Files.createFile(root.resolve("test1.xsd")); + Files.createFile(root.resolve("test1.txt")); + Path dir = Files.createDirectory(root.resolve("test")); + Files.createFile(dir.resolve("test2.xsdconfig")); + Files.createFile(dir.resolve("test2.xsd")); + Files.createFile(dir.resolve("test2.txt")); + + Collection files = FileUtil.find(root.toFile(), Pattern.compile(".*\\.xsd"), true); + + assertEquals(2, files.size()); + assertEquals(Set.of("test1.xsd", "test2.xsd"), files.stream().map(File::getName).collect(Collectors.toSet())); + } +} \ No newline at end of file