diff --git a/pom.xml b/pom.xml index e5e60d9c..afaa9cff 100644 --- a/pom.xml +++ b/pom.xml @@ -210,11 +210,6 @@ xstream 1.4.20 - - org.apache.commons - commons-lang3 - 3.14.0 - diff --git a/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java b/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java index aa2f2502..975fd8aa 100644 --- a/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java +++ b/src/main/java/org/apache/maven/plugins/help/EvaluateMojo.java @@ -35,7 +35,6 @@ import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.collections.PropertiesConverter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; -import org.apache.commons.lang3.ClassUtils; import org.apache.maven.lifecycle.internal.MojoDescriptorCreator; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; @@ -425,7 +424,7 @@ private void addAlias(XStream xstreamObject, File jarFile, String packageFilter) if (name.contains(packageFilter) && !name.contains("$")) { try { - Class clazz = ClassUtils.getClass(name); + Class clazz = Class.forName(name); String alias = StringUtils.lowercaseFirstLetter(clazz.getSimpleName()); xstreamObject.alias(alias, clazz); if (!clazz.equals(Model.class)) { diff --git a/src/test/java/org/apache/maven/plugins/help/DescribeMojoTest.java b/src/test/java/org/apache/maven/plugins/help/DescribeMojoTest.java index ce210f18..135ad5b9 100644 --- a/src/test/java/org/apache/maven/plugins/help/DescribeMojoTest.java +++ b/src/test/java/org/apache/maven/plugins/help/DescribeMojoTest.java @@ -18,7 +18,9 @@ */ package org.apache.maven.plugins.help; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Collections; import org.apache.maven.execution.MavenSession; @@ -37,9 +39,6 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; -import static org.apache.commons.lang3.reflect.FieldUtils.writeDeclaredField; -import static org.apache.commons.lang3.reflect.FieldUtils.writeField; -import static org.apache.commons.lang3.reflect.MethodUtils.invokeMethod; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -55,7 +54,10 @@ public class DescribeMojoTest { public void testGetExpressionsRoot() { try { DescribeMojo describeMojo = new DescribeMojo(); - invokeMethod(describeMojo, true, "toLines", "", 2, 2, 80); + Method toLines = + describeMojo.getClass().getDeclaredMethod("toLines", String.class, int.class, int.class, int.class); + toLines.setAccessible(true); + toLines.invoke(null, "", 2, 2, 80); } catch (Throwable e) { fail("The API changes"); } @@ -73,7 +75,10 @@ public void testValidExpression() throws Exception { String ls = System.getProperty("line.separator"); try { - invokeMethod(new DescribeMojo(), true, "describeMojoParameters", md, sb); + Method describeMojoParameters = DescribeMojo.class.getDeclaredMethod( + "describeMojoParameters", MojoDescriptor.class, StringBuilder.class); + describeMojoParameters.setAccessible(true); + describeMojoParameters.invoke(new DescribeMojo(), md, sb); assertEquals( " Available parameters:" + ls + ls + " name" + ls + " User property: valid.expression" + ls @@ -96,7 +101,10 @@ public void testInvalidExpression() throws Exception { String ls = System.getProperty("line.separator"); try { - invokeMethod(new DescribeMojo(), true, "describeMojoParameters", md, sb); + Method describeMojoParameters = DescribeMojo.class.getDeclaredMethod( + "describeMojoParameters", MojoDescriptor.class, StringBuilder.class); + describeMojoParameters.setAccessible(true); + describeMojoParameters.invoke(new DescribeMojo(), md, sb); assertEquals( " Available parameters:" + ls + ls @@ -113,11 +121,12 @@ public void testInvalidExpression() throws Exception { @Test public void testParsePluginInfoGAV() throws Throwable { DescribeMojo mojo = new DescribeMojo(); - writeDeclaredField(mojo, "groupId", "org.test", true); - writeDeclaredField(mojo, "artifactId", "test", true); - writeDeclaredField(mojo, "version", "1.0", true); + setFieldWithReflection(mojo, "groupId", "org.test"); + setFieldWithReflection(mojo, "artifactId", "test"); + setFieldWithReflection(mojo, "version", "1.0"); - PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo"); + Method parsePluginLookupInfo = setParsePluginLookupInfoAccessibility(); + PluginInfo pi = (PluginInfo) parsePluginLookupInfo.invoke(mojo); assertEquals("org.test", pi.getGroupId()); assertEquals("test", pi.getArtifactId()); @@ -128,18 +137,19 @@ public void testParsePluginInfoGAV() throws Throwable { @Test public void testParsePluginInfoPluginPrefix() throws Throwable { DescribeMojo mojo = new DescribeMojo(); - writeDeclaredField(mojo, "plugin", "help", true); + setFieldWithReflection(mojo, "plugin", "help"); - PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo"); + Method parsePluginLookupInfo = setParsePluginLookupInfoAccessibility(); + PluginInfo pi = (PluginInfo) parsePluginLookupInfo.invoke(mojo); assertNull(pi.getGroupId()); assertNull(pi.getArtifactId()); assertNull(pi.getVersion()); assertEquals("help", pi.getPrefix()); - writeDeclaredField(mojo, "plugin", "help2:::", true); + setFieldWithReflection(mojo, "plugin", "help2:::"); - pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo"); + pi = (PluginInfo) parsePluginLookupInfo.invoke(mojo); assertEquals("help2", pi.getPrefix()); } @@ -147,9 +157,10 @@ public void testParsePluginInfoPluginPrefix() throws Throwable { @Test public void testParsePluginInfoPluginGA() throws Throwable { DescribeMojo mojo = new DescribeMojo(); - writeDeclaredField(mojo, "plugin", "org.test:test", true); + setFieldWithReflection(mojo, "plugin", "org.test:test"); - PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo"); + Method parsePluginLookupInfo = setParsePluginLookupInfoAccessibility(); + PluginInfo pi = (PluginInfo) parsePluginLookupInfo.invoke(mojo); assertEquals("org.test", pi.getGroupId()); assertEquals("test", pi.getArtifactId()); @@ -160,9 +171,10 @@ public void testParsePluginInfoPluginGA() throws Throwable { @Test public void testParsePluginInfoPluginGAV() throws Throwable { DescribeMojo mojo = new DescribeMojo(); - writeDeclaredField(mojo, "plugin", "org.test:test:1.0", true); + setFieldWithReflection(mojo, "plugin", "org.test:test:1.0"); - PluginInfo pi = (PluginInfo) invokeMethod(mojo, true, "parsePluginLookupInfo"); + Method parsePluginLookupInfo = setParsePluginLookupInfoAccessibility(); + PluginInfo pi = (PluginInfo) parsePluginLookupInfo.invoke(mojo); assertEquals("org.test", pi.getGroupId()); assertEquals("test", pi.getArtifactId()); @@ -173,9 +185,10 @@ public void testParsePluginInfoPluginGAV() throws Throwable { @Test public void testParsePluginInfoPluginIncorrect() throws Throwable { DescribeMojo mojo = new DescribeMojo(); - writeDeclaredField(mojo, "plugin", "org.test:test:1.0:invalid", true); + setFieldWithReflection(mojo, "plugin", "org.test:test:1.0:invalid"); try { - invokeMethod(mojo, "parsePluginLookupInfo"); + Method parsePluginLookupInfo = setParsePluginLookupInfoAccessibility(); + parsePluginLookupInfo.invoke(mojo); fail(); } catch (Exception e) { // expected @@ -201,18 +214,16 @@ public void testLookupPluginDescriptorPrefixWithVersion() throws Throwable { MavenPluginManager pluginManager = mock(MavenPluginManager.class); MavenSession session = mock(MavenSession.class); when(session.getRepositorySession()).thenReturn(mock(RepositorySystemSession.class)); - writeDeclaredField(mojo, "mojoDescriptorCreator", mojoDescriptorCreator, true); - writeDeclaredField(mojo, "pluginVersionResolver", pluginVersionResolver, true); - writeDeclaredField(mojo, "pluginManager", pluginManager, true); - writeField(mojo, "session", session, true); + setFieldsOnMojo(mojo, mojoDescriptorCreator, pluginVersionResolver, pluginManager, session); MavenProject mavenProject = new MavenProject(); mavenProject.setPluginArtifactRepositories(Collections.emptyList()); - writeField(mojo, "project", mavenProject, true); + setParentFieldWithReflection(mojo, "project", mavenProject); when(mojoDescriptorCreator.findPluginForPrefix("help", session)).thenReturn(plugin); when(pluginManager.getPluginDescriptor(any(Plugin.class), anyList(), any())) .thenReturn(pd); - PluginDescriptor returned = (PluginDescriptor) invokeMethod(mojo, true, "lookupPluginDescriptor", pi); + Method lookupPluginDescriptor = setLookupPluginDescriptorAccessibility(); + PluginDescriptor returned = (PluginDescriptor) lookupPluginDescriptor.invoke(mojo, pi); assertEquals(pd, returned); @@ -245,20 +256,18 @@ public void testLookupPluginDescriptorPrefixWithoutVersion() throws Throwable { PluginVersionResult versionResult = mock(PluginVersionResult.class); MavenSession session = mock(MavenSession.class); when(session.getRepositorySession()).thenReturn(mock(RepositorySystemSession.class)); - writeDeclaredField(mojo, "mojoDescriptorCreator", mojoDescriptorCreator, true); - writeDeclaredField(mojo, "pluginVersionResolver", pluginVersionResolver, true); - writeDeclaredField(mojo, "pluginManager", pluginManager, true); - writeField(mojo, "session", session, true); + setFieldsOnMojo(mojo, mojoDescriptorCreator, pluginVersionResolver, pluginManager, session); MavenProject mavenProject = new MavenProject(); mavenProject.setPluginArtifactRepositories(Collections.emptyList()); - writeField(mojo, "project", mavenProject, true); + setParentFieldWithReflection(mojo, "project", mavenProject); when(mojoDescriptorCreator.findPluginForPrefix("help", session)).thenReturn(plugin); when(pluginVersionResolver.resolve(any(PluginVersionRequest.class))).thenReturn(versionResult); when(versionResult.getVersion()).thenReturn("1.0"); when(pluginManager.getPluginDescriptor(any(Plugin.class), anyList(), any())) .thenReturn(pd); - PluginDescriptor returned = (PluginDescriptor) invokeMethod(mojo, true, "lookupPluginDescriptor", pi); + Method lookupPluginDescriptor = setLookupPluginDescriptorAccessibility(); + PluginDescriptor returned = (PluginDescriptor) lookupPluginDescriptor.invoke(mojo, pi); assertEquals(pd, returned); verify(mojoDescriptorCreator).findPluginForPrefix("help", session); @@ -290,17 +299,15 @@ public void testLookupPluginDescriptorGAV() throws Throwable { MavenPluginManager pluginManager = mock(MavenPluginManager.class); MavenSession session = mock(MavenSession.class); when(session.getRepositorySession()).thenReturn(mock(RepositorySystemSession.class)); - writeDeclaredField(mojo, "mojoDescriptorCreator", mojoDescriptorCreator, true); - writeDeclaredField(mojo, "pluginVersionResolver", pluginVersionResolver, true); - writeDeclaredField(mojo, "pluginManager", pluginManager, true); - writeField(mojo, "session", session, true); + setFieldsOnMojo(mojo, mojoDescriptorCreator, pluginVersionResolver, pluginManager, session); MavenProject mavenProject = new MavenProject(); mavenProject.setPluginArtifactRepositories(Collections.emptyList()); - writeField(mojo, "project", mavenProject, true); + setParentFieldWithReflection(mojo, "project", mavenProject); when(pluginManager.getPluginDescriptor(any(Plugin.class), anyList(), any())) .thenReturn(pd); - PluginDescriptor returned = (PluginDescriptor) invokeMethod(mojo, true, "lookupPluginDescriptor", pi); + Method lookupPluginDescriptor = setLookupPluginDescriptorAccessibility(); + PluginDescriptor returned = (PluginDescriptor) lookupPluginDescriptor.invoke(mojo, pi); assertEquals(pd, returned); @@ -320,7 +327,8 @@ public void testLookupPluginDescriptorGMissingA() { PluginInfo pi = new PluginInfo(); pi.setGroupId("org.test"); try { - invokeMethod(mojo, true, "lookupPluginDescriptor", pi); + Method lookupPluginDescriptor = setLookupPluginDescriptorAccessibility(); + lookupPluginDescriptor.invoke(mojo, pi); fail(); } catch (InvocationTargetException e) { assertTrue(e.getTargetException().getMessage().startsWith("You must specify either")); @@ -335,7 +343,8 @@ public void testLookupPluginDescriptorAMissingG() { PluginInfo pi = new PluginInfo(); pi.setArtifactId("test"); try { - invokeMethod(mojo, true, "lookupPluginDescriptor", pi); + Method lookupPluginDescriptor = setLookupPluginDescriptorAccessibility(); + lookupPluginDescriptor.invoke(mojo, pi); fail(); } catch (InvocationTargetException e) { assertTrue(e.getTargetException().getMessage().startsWith("You must specify either")); @@ -343,4 +352,47 @@ public void testLookupPluginDescriptorAMissingG() { fail(e.getMessage()); } } + + private static void setParentFieldWithReflection( + final DescribeMojo mojo, final String fieldName, final Object value) + throws NoSuchFieldException, IllegalAccessException { + final Field field = mojo.getClass().getSuperclass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(mojo, value); + field.setAccessible(false); + } + + private static void setFieldWithReflection(final Object mojo, final String fieldName, final Object value) + throws NoSuchFieldException, IllegalAccessException { + final Field field = mojo.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(mojo, value); + field.setAccessible(false); + } + + private static void setFieldsOnMojo( + final DescribeMojo mojo, + final MojoDescriptorCreator mojoDescriptorCreator, + final PluginVersionResolver pluginVersionResolver, + final MavenPluginManager pluginManager, + final MavenSession session) + throws NoSuchFieldException, IllegalAccessException { + setFieldWithReflection(mojo, "mojoDescriptorCreator", mojoDescriptorCreator); + setFieldWithReflection(mojo, "pluginVersionResolver", pluginVersionResolver); + setFieldWithReflection(mojo, "pluginManager", pluginManager); + setParentFieldWithReflection(mojo, "session", session); + } + + private static Method setLookupPluginDescriptorAccessibility() throws NoSuchMethodException { + Method lookupPluginDescriptor = + DescribeMojo.class.getDeclaredMethod("lookupPluginDescriptor", PluginInfo.class); + lookupPluginDescriptor.setAccessible(true); + return lookupPluginDescriptor; + } + + private static Method setParsePluginLookupInfoAccessibility() throws NoSuchMethodException { + Method parsePluginLookupInfo = DescribeMojo.class.getDeclaredMethod("parsePluginLookupInfo"); + parsePluginLookupInfo.setAccessible(true); + return parsePluginLookupInfo; + } }