From 7997e8fc33fd6c9b1f881a10aa650b2f8eb09410 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Mon, 10 Nov 2025 22:17:31 +1300 Subject: [PATCH] #229 AntEnhanceTask to honor packages specified This means that packages specified will be honored over any filtering that would otherwise occur via IgnoreClassHelper. The fix is to combine the Ant task packages parameter with the transform args and pass that in ultimately to the EnhanceContext (which parses that out and will then use the PackageFilter rather than IgnoreClassHelper). --- .../io/ebean/enhance/ant/AntEnhanceTask.java | 48 +++++++++---------- .../ebean/enhance/common/PackageFilter.java | 7 +-- .../ebean/enhance/ant/AntEnhanceTaskTest.java | 28 +++++++++++ .../ebean/enhance/common/ArgParserTest.java | 18 +++++++ .../enhance/common/PackageFilterTest.java | 14 ++++++ 5 files changed, 87 insertions(+), 28 deletions(-) create mode 100644 ebean-agent/src/test/java/io/ebean/enhance/ant/AntEnhanceTaskTest.java create mode 100644 ebean-agent/src/test/java/io/ebean/enhance/common/ArgParserTest.java diff --git a/ebean-agent/src/main/java/io/ebean/enhance/ant/AntEnhanceTask.java b/ebean-agent/src/main/java/io/ebean/enhance/ant/AntEnhanceTask.java index 35db49d0..329866a2 100644 --- a/ebean-agent/src/main/java/io/ebean/enhance/ant/AntEnhanceTask.java +++ b/ebean-agent/src/main/java/io/ebean/enhance/ant/AntEnhanceTask.java @@ -4,8 +4,6 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; -import java.io.File; - /** * An ANT task that can enhance entity beans etc for use by Ebean. *

@@ -25,18 +23,16 @@ * *

* - *
- *
- * 	 <taskdef name="ebeanEnhance" classname="AntEnhanceTask" classpath="bin" />
+ * 
{@code
  *
- *   <target name="enhance" depends="compile">
- *       <ebeanEnhance
- *            classSource="${bin.dir}"
- *            packages="com.avaje.ebean.meta.**, com.acme.myapp.entity.**"
- *            transformArgs="debug=1" />
- *   </target>
- *
- * 
+ * + * + * + * + * }
*/ public class AntEnhanceTask extends Task { @@ -47,24 +43,26 @@ public class AntEnhanceTask extends Task { @Override public void execute() throws BuildException { - -// StringBuilder extraClassPath = new StringBuilder(); -// extraClassPath.append(classSource); -// if (classpath != null) -// { -// if (!extraClassPath.toString().endsWith(";")) -// { -// extraClassPath.append(";"); -// } -// extraClassPath.append(classpath); -// } - Transformer t = new Transformer(null, transformArgs);//extraClassPath.toString(), + String agentArgs = combine(packages, transformArgs); + Transformer t = new Transformer(null, agentArgs); ClassLoader cl = AntEnhanceTask.class.getClassLoader(); OfflineFileTransform ft = new OfflineFileTransform(t, cl, classSource); ft.process(packages); } + /** + * Combine the packages into the transformArgs to filter enhanced classes via PackageFilter. + */ + static String combine(String packages, String transformArgs) { + StringBuilder args = new StringBuilder(); + args.append("packages=").append(packages.replace("**", "")); + if (transformArgs != null && !transformArgs.isEmpty()) { + args.append(',').append(transformArgs); + } + return args.toString(); + } + /** * the classpath used to search for e.g. inerited classes */ diff --git a/ebean-agent/src/main/java/io/ebean/enhance/common/PackageFilter.java b/ebean-agent/src/main/java/io/ebean/enhance/common/PackageFilter.java index 3b3d7266..c1c2b6c8 100644 --- a/ebean-agent/src/main/java/io/ebean/enhance/common/PackageFilter.java +++ b/ebean-agent/src/main/java/io/ebean/enhance/common/PackageFilter.java @@ -10,10 +10,11 @@ final class PackageFilter { PackageFilter(String packages) { List prefixes = new ArrayList<>(); for (String pkg : packages.split(",")) { - String replace = pkg.replace('.', '/').trim() + '/'; - if (!replace.isEmpty()) { - prefixes.add(replace); + String replace = pkg.replace('.', '/').trim(); + if (!replace.endsWith("/")) { + replace += '/'; } + prefixes.add(replace); } packagePrefixes = prefixes.toArray(new String[]{}); } diff --git a/ebean-agent/src/test/java/io/ebean/enhance/ant/AntEnhanceTaskTest.java b/ebean-agent/src/test/java/io/ebean/enhance/ant/AntEnhanceTaskTest.java new file mode 100644 index 00000000..5feaeed0 --- /dev/null +++ b/ebean-agent/src/test/java/io/ebean/enhance/ant/AntEnhanceTaskTest.java @@ -0,0 +1,28 @@ +package io.ebean.enhance.ant; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class AntEnhanceTaskTest { + + @Test + void combine() { + String result = AntEnhanceTask.combine("com/one/**, com/two/**", "debug=1"); + assertThat(result).isEqualTo("packages=com/one/, com/two/,debug=1"); + } + + @Test + void combine_when_NoTransformArgs() { + String result = AntEnhanceTask.combine("com/one/**", ""); + assertThat(result).isEqualTo("packages=com/one/"); + } + + @Test + void combine_when_NullTransformArgs() { + String result = AntEnhanceTask.combine("com/one/**", null); + assertThat(result).isEqualTo("packages=com/one/"); + } + +} diff --git a/ebean-agent/src/test/java/io/ebean/enhance/common/ArgParserTest.java b/ebean-agent/src/test/java/io/ebean/enhance/common/ArgParserTest.java new file mode 100644 index 00000000..c9d33e73 --- /dev/null +++ b/ebean-agent/src/test/java/io/ebean/enhance/common/ArgParserTest.java @@ -0,0 +1,18 @@ +package io.ebean.enhance.common; + +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ArgParserTest { + + @Test + void parse() { + Map map = ArgParser.parse("packages=com/google/foo"); + assertThat(map).containsKey("packages"); + assertThat(map.get("packages")).isEqualTo("com/google/foo"); + } +} diff --git a/ebean-agent/src/test/java/io/ebean/enhance/common/PackageFilterTest.java b/ebean-agent/src/test/java/io/ebean/enhance/common/PackageFilterTest.java index efabc9be..32e8c909 100644 --- a/ebean-agent/src/test/java/io/ebean/enhance/common/PackageFilterTest.java +++ b/ebean-agent/src/test/java/io/ebean/enhance/common/PackageFilterTest.java @@ -21,4 +21,18 @@ void ignore() { assertTrue(filter.ignore("org/baz/Some")); assertTrue(filter.ignore("org/foo")); } + + @Test + void endingSlash() { + PackageFilter filter = new PackageFilter("org/foo/,com/bar"); + + assertFalse(filter.ignore("org/foo/A")); + assertFalse(filter.ignore("org/foo/B")); + assertFalse(filter.ignore("org/foo/some/A")); + assertFalse(filter.ignore("com/bar/A")); + assertFalse(filter.ignore("com/bar/some/A")); + + assertTrue(filter.ignore("org/baz/Some")); + assertTrue(filter.ignore("org/foo")); + } }