This is an automated email from the ASF dual-hosted git repository.

khmarbaise pushed a commit to branch MDEP-831
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git

commit 5ca88bc815fc7d001f39fbeffcf2f1534ebc0266
Author: Karl Heinz Marbaise <khmarba...@apache.org>
AuthorDate: Tue Oct 18 14:20:39 2022 +0200

    [MDEP-831] - Remove not used dependencies / Replace parts
    - Removed commons-collection4 replaced with own implementation.
    - Removed commons-io as well.
    - Removed plexus-io as well.
    - Removed commons-beanutils.
---
 pom.xml                                            |  35 +---
 .../plugins/dependency/DisplayAncestorsMojo.java   |   3 +-
 .../dependency/analyze/AbstractAnalyzeMojo.java    | 180 +++++++++++----------
 .../dependency/analyze/AnalyzeDuplicateMojo.java   |  25 ++-
 .../maven/plugins/dependency/analyze/Util.java     |  58 +++++++
 .../resolvers/ResolveDependencySourcesMojo.java    |   6 +-
 .../dependency/AbstractDependencyMojoTestCase.java |  18 +--
 .../maven/plugins/dependency/DirectoryUtil.java    |  59 +++++++
 .../maven/plugins/dependency/analyze/UtilTest.java | 113 +++++++++++++
 .../fromDependencies/TestCopyDependenciesMojo.java |   7 +-
 .../utils/filters/TestDestFileFilter.java          |  11 +-
 .../utils/filters/TestMarkerFileFilter.java        |  12 +-
 .../utils/filters/TestResolveMarkerFileFilter.java |   6 +-
 .../markers/TestDefaultMarkerFileHandler.java      |   9 +-
 .../utils/markers/TestUnpackMarkerFileHandler.java |  14 +-
 15 files changed, 375 insertions(+), 181 deletions(-)

diff --git a/pom.xml b/pom.xml
index b3de43a3..5b052336 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,11 +166,6 @@ under the License.
       <artifactId>maven-reporting-impl</artifactId>
       <version>3.2.0</version>
     </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.11.0</version>
-    </dependency>
 
     <!-- plexus -->
     <dependency>
@@ -183,12 +178,6 @@ under the License.
       <artifactId>plexus-utils</artifactId>
       <version>3.4.2</version>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-io</artifactId>
-      <version>3.4.0</version>
-    </dependency>
-
     <!-- shared -->
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
@@ -216,18 +205,6 @@ under the License.
       <version>3.3.4</version>
     </dependency>
 
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-      <version>3.12.0</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-collections4</artifactId>
-      <version>4.2</version>
-    </dependency>
-
     <!-- dependencies to annotations -->
     <dependency>
       <groupId>org.apache.maven.plugin-tools</groupId>
@@ -273,6 +250,12 @@ under the License.
       <version>4.13.2</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <version>3.23.1</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.maven.plugin-testing</groupId>
       <artifactId>maven-plugin-testing-harness</artifactId>
@@ -318,12 +301,6 @@ under the License.
       <version>${slf4j.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>commons-beanutils</groupId>
-      <artifactId>commons-beanutils</artifactId>
-      <version>1.9.4</version>
-    </dependency>
-
   </dependencies>
 
   <build>
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java 
b/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java
index 4c2ea9ea..08823a02 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/DisplayAncestorsMojo.java
@@ -19,7 +19,6 @@ package org.apache.maven.plugins.dependency;
  * under the License.
  */
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -62,7 +61,7 @@ public class DisplayAncestorsMojo
         }
         else
         {
-            getLog().info( String.format( Locale.US, "Ancestor POMs: %s", 
StringUtils.join( ancestors, " <- " ) ) );
+            getLog().info( String.format( Locale.US, "Ancestor POMs: %s", 
String.join( " <- ", ancestors ) ) );
         }
 
     }
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
 
b/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
index e069bd46..15560d44 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/analyze/AbstractAnalyzeMojo.java
@@ -28,9 +28,9 @@ import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.plugin.AbstractMojo;
@@ -492,24 +492,22 @@ public abstract class AbstractAnalyzeMojo
         if ( artifacts.isEmpty() )
         {
             getLog().info( "   None" );
+            return;
         }
-        else
+        for ( Artifact artifact : artifacts )
         {
-            for ( Artifact artifact : artifacts )
-            {
-                // called because artifact will set the version to -SNAPSHOT 
only if I do this. MNG-2961
-                artifact.isSnapshot();
-
-                if ( warn )
-                {
-                    logDependencyWarning( "   " + artifact );
-                }
-                else
-                {
-                    getLog().info( "   " + artifact );
-                }
+            // called because artifact will set the version to -SNAPSHOT only 
if I do this. MNG-2961
+            artifact.isSnapshot();
 
+            if ( warn )
+            {
+                logDependencyWarning( "   " + artifact );
+            }
+            else
+            {
+                getLog().info( "   " + artifact );
             }
+
         }
     }
 
@@ -518,32 +516,31 @@ public abstract class AbstractAnalyzeMojo
         if ( artifacts.isEmpty() )
         {
             getLog().info( "   None" );
+            return;
         }
-        else
+
+        for ( Map.Entry<Artifact, Set<String>> entry : artifacts.entrySet() )
         {
-            for ( Map.Entry<Artifact, Set<String>> entry : 
artifacts.entrySet() )
-            {
-                // called because artifact will set the version to -SNAPSHOT 
only if I do this. MNG-2961
-                entry.getKey().isSnapshot();
+            // called because artifact will set the version to -SNAPSHOT only 
if I do this. MNG-2961
+            entry.getKey().isSnapshot();
 
-                if ( warn )
+            if ( warn )
+            {
+                logDependencyWarning( "   " + entry.getKey() );
+                for ( String clazz : entry.getValue() )
                 {
-                    logDependencyWarning( "   " + entry.getKey() );
-                    for ( String clazz : entry.getValue() )
-                    {
-                        logDependencyWarning( "      class " + clazz );
-                    }
+                    logDependencyWarning( "      class " + clazz );
                 }
-                else
+            }
+            else
+            {
+                getLog().info( "   " + entry.getKey() );
+                for ( String clazz : entry.getValue() )
                 {
-                    getLog().info( "   " + entry.getKey() );
-                    for ( String clazz : entry.getValue() )
-                    {
-                        getLog().info( "      class " + clazz );
-                    }
+                    getLog().info( "      class " + clazz );
                 }
-
             }
+
         }
     }
 
@@ -561,78 +558,83 @@ public abstract class AbstractAnalyzeMojo
 
     private void writeDependencyXML( Set<Artifact> artifacts )
     {
-        if ( !artifacts.isEmpty() )
+        if ( artifacts.isEmpty() )
         {
-            getLog().info( "Add the following to your pom to correct the 
missing dependencies: " );
+            return;
+        }
 
-            StringWriter out = new StringWriter();
-            PrettyPrintXMLWriter writer = new PrettyPrintXMLWriter( out );
+        getLog().info( "Add the following to your pom to correct the missing 
dependencies: " );
 
-            for ( Artifact artifact : artifacts )
-            {
-                // called because artifact will set the version to -SNAPSHOT 
only if I do this. MNG-2961
-                artifact.isSnapshot();
+        StringWriter out = new StringWriter();
+        PrettyPrintXMLWriter writer = new PrettyPrintXMLWriter( out );
 
-                writer.startElement( "dependency" );
-                writer.startElement( "groupId" );
-                writer.writeText( artifact.getGroupId() );
-                writer.endElement();
-                writer.startElement( "artifactId" );
-                writer.writeText( artifact.getArtifactId() );
-                writer.endElement();
-                writer.startElement( "version" );
-                writer.writeText( artifact.getBaseVersion() );
-                if ( !StringUtils.isBlank( artifact.getClassifier() ) )
-                {
-                    writer.startElement( "classifier" );
-                    writer.writeText( artifact.getClassifier() );
-                    writer.endElement();
-                }
+        for ( Artifact artifact : artifacts )
+        {
+            // called because artifact will set the version to -SNAPSHOT only 
if I do this. MNG-2961
+            artifact.isSnapshot();
+
+            writer.startElement( "dependency" );
+            writer.startElement( "groupId" );
+            writer.writeText( artifact.getGroupId() );
+            writer.endElement();
+            writer.startElement( "artifactId" );
+            writer.writeText( artifact.getArtifactId() );
+            writer.endElement();
+            writer.startElement( "version" );
+            writer.writeText( artifact.getBaseVersion() );
+
+            if ( Objects.nonNull( artifact.getClassifier() ) && 
!artifact.getClassifier().isEmpty() )
+            {
+                writer.startElement( "classifier" );
+                writer.writeText( artifact.getClassifier() );
                 writer.endElement();
+            }
+            writer.endElement();
 
-                if ( !Artifact.SCOPE_COMPILE.equals( artifact.getScope() ) )
-                {
-                    writer.startElement( "scope" );
-                    writer.writeText( artifact.getScope() );
-                    writer.endElement();
-                }
+            if ( !Artifact.SCOPE_COMPILE.equals( artifact.getScope() ) )
+            {
+                writer.startElement( "scope" );
+                writer.writeText( artifact.getScope() );
                 writer.endElement();
             }
-
-            getLog().info( System.lineSeparator() + out.getBuffer() );
+            writer.endElement();
         }
+
+        getLog().info( System.lineSeparator() + out.getBuffer() );
     }
 
     private void writeScriptableOutput( Set<Artifact> artifacts )
     {
-        if ( !artifacts.isEmpty() )
+        if ( artifacts.isEmpty() )
         {
-            getLog().info( "Missing dependencies: " );
-            String pomFile = baseDir.getAbsolutePath() + File.separatorChar + 
"pom.xml";
-            StringBuilder buf = new StringBuilder();
+            return;
+        }
 
-            for ( Artifact artifact : artifacts )
-            {
-                // called because artifact will set the version to -SNAPSHOT 
only if I do this. MNG-2961
-                artifact.isSnapshot();
-
-                //CHECKSTYLE_OFF: LineLength
-                buf.append( scriptableFlag )
-                   .append( ":" )
-                   .append( pomFile )
-                   .append( ":" )
-                   .append( artifact.getDependencyConflictId() )
-                   .append( ":" )
-                   .append( artifact.getClassifier() )
-                   .append( ":" )
-                   .append( artifact.getBaseVersion() )
-                   .append( ":" )
-                   .append( artifact.getScope() )
-                   .append( System.lineSeparator() );
-                //CHECKSTYLE_ON: LineLength
-            }
-            getLog().info( System.lineSeparator() + buf );
+        getLog().info( "Missing dependencies: " );
+        String pomFile = baseDir.getAbsolutePath() + File.separatorChar + 
"pom.xml";
+        StringBuilder buf = new StringBuilder();
+
+        for ( Artifact artifact : artifacts )
+        {
+            // called because artifact will set the version to -SNAPSHOT only 
if I do this. MNG-2961
+            artifact.isSnapshot();
+
+            //CHECKSTYLE_OFF: LineLength
+            buf.append( scriptableFlag )
+               .append( ":" )
+               .append( pomFile )
+               .append( ":" )
+               .append( artifact.getDependencyConflictId() )
+               .append( ":" )
+               .append( artifact.getClassifier() )
+               .append( ":" )
+               .append( artifact.getBaseVersion() )
+               .append( ":" )
+               .append( artifact.getScope() )
+               .append( System.lineSeparator() );
+            //CHECKSTYLE_ON: LineLength
         }
+        getLog().info( System.lineSeparator() + buf );
     }
 
     private List<Artifact> filterDependencies( Set<Artifact> artifacts, 
String[] excludes )
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
 
b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
index 552f4981..5bff63c3 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/analyze/AnalyzeDuplicateMojo.java
@@ -27,8 +27,8 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@@ -49,13 +49,13 @@ import 
org.codehaus.plexus.util.xml.pull.XmlPullParserException;
  */
 @Mojo( name = "analyze-duplicate", aggregator = false, threadSafe = true )
 public class AnalyzeDuplicateMojo
-    extends AbstractMojo
+        extends AbstractMojo
 {
     public static final String MESSAGE_DUPLICATE_DEP_IN_DEPENDENCIES =
-        "List of duplicate dependencies defined in <dependencies/> in your 
pom.xml:\n";
+            "List of duplicate dependencies defined in <dependencies/> in your 
pom.xml:\n";
 
     public static final String MESSAGE_DUPLICATE_DEP_IN_DEPMGMT =
-        "List of duplicate dependencies defined in <dependencyManagement/> in 
your pom.xml:\n";
+            "List of duplicate dependencies defined in <dependencyManagement/> 
in your pom.xml:\n";
 
     /**
      * Skip plugin execution completely.
@@ -76,7 +76,7 @@ public class AnalyzeDuplicateMojo
      */
     @Override
     public void execute()
-        throws MojoExecutionException, MojoFailureException
+            throws MojoExecutionException, MojoFailureException
     {
         if ( skip )
         {
@@ -105,7 +105,7 @@ public class AnalyzeDuplicateMojo
         if ( model.getDependencyManagement() != null && 
model.getDependencyManagement().getDependencies() != null )
         {
             duplicateDependenciesManagement =
-                findDuplicateDependencies( 
model.getDependencyManagement().getDependencies() );
+                    findDuplicateDependencies( 
model.getDependencyManagement().getDependencies() );
         }
 
         if ( getLog().isInfoEnabled() )
@@ -151,15 +151,10 @@ public class AnalyzeDuplicateMojo
 
     private Set<String> findDuplicateDependencies( List<Dependency> 
modelDependencies )
     {
-        List<String> modelDependencies2 = new ArrayList<>();
-        for ( Dependency dep : modelDependencies )
-        {
-            modelDependencies2.add( dep.getManagementKey() );
-        }
-
-        // @formatter:off
+        List<String> modelDependencies2 =
+                modelDependencies.stream().map( Dependency::getManagementKey 
).collect( Collectors.toCollection(
+                        ArrayList::new ) );
         return new LinkedHashSet<>(
-                CollectionUtils.disjunction( modelDependencies2, new 
LinkedHashSet<>( modelDependencies2 ) ) );
-        // @formatter:on
+                Util.symmetricDifference( modelDependencies2, new 
LinkedHashSet<>( modelDependencies2 ) ) );
     }
 }
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/analyze/Util.java 
b/src/main/java/org/apache/maven/plugins/dependency/analyze/Util.java
new file mode 100644
index 00000000..84a1e0fc
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/dependency/analyze/Util.java
@@ -0,0 +1,58 @@
+package org.apache.maven.plugins.dependency.analyze;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.summingInt;
+import static java.util.stream.Collectors.toList;
+
+class Util
+{
+
+    static <O> Collection<O> symmetricDifference( Collection<O> elementsOne,
+                                                  Collection<O> elementsTwo )
+    {
+        Set<O> hashSet = new HashSet<>( elementsOne );
+        hashSet.addAll( elementsTwo );
+
+        Map<O, Integer> cardinalityOne =
+                elementsOne.stream().collect( groupingBy( identity(), 
summingInt( e -> 1 ) ) );
+        Map<O, Integer> cardinalityTwo =
+                elementsTwo.stream().collect( groupingBy( identity(), 
summingInt( e -> 1 ) ) );
+
+        return hashSet.stream().flatMap( item ->
+        {
+            int cardOne = cardinalityOne.getOrDefault( item, 0 );
+            int cardTwo = cardinalityTwo.getOrDefault( item, 0 );
+            int max = Math.max( cardOne, cardTwo );
+            int min = Math.min( cardOne, cardTwo );
+            return Collections.nCopies( max - min, item ).stream();
+        } ).collect( collectingAndThen( toList(), 
Collections::unmodifiableList ) );
+    }
+
+}
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependencySourcesMojo.java
 
b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependencySourcesMojo.java
index 95d16880..48bb5639 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependencySourcesMojo.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolveDependencySourcesMojo.java
@@ -19,7 +19,8 @@ package org.apache.maven.plugins.dependency.resolvers;
  * under the License.
  */
 
-import org.apache.commons.lang3.StringUtils;
+import java.util.Objects;
+
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
@@ -49,7 +50,8 @@ public class ResolveDependencySourcesMojo
     protected void doExecute()
         throws MojoExecutionException
     {
-        if ( StringUtils.isEmpty( this.classifier ) )
+
+        if ( Objects.isNull( this.classifier ) || this.classifier.isEmpty() )
         {
             this.classifier = SOURCE_CLASSIFIER;
         }
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTestCase.java
 
b/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTestCase.java
index c985594d..f08531b6 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTestCase.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTestCase.java
@@ -20,18 +20,16 @@ package org.apache.maven.plugins.dependency;
  */
 
 import java.io.File;
-import java.io.IOException;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.plugin.LegacySupport;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
 import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.LocalRepositoryManager;
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 
 public abstract class AbstractDependencyMojoTestCase
     extends AbstractMojoTestCase
@@ -54,7 +52,7 @@ public abstract class AbstractDependencyMojoTestCase
         super.setUp();
         testDir = new File( getBasedir(), "target" + File.separatorChar + 
"unit-tests" + File.separatorChar + testDirStr
             + File.separatorChar );
-        FileUtils.deleteDirectory( testDir );
+        DirectoryUtil.deleteDirectories( testDir );
         assertFalse( testDir.exists() );
 
         stubFactory = new DependencyArtifactStubFactory( this.testDir, 
createFiles, flattenedPath );
@@ -64,15 +62,7 @@ public abstract class AbstractDependencyMojoTestCase
     {
         if ( testDir != null )
         {
-            try
-            {
-                FileUtils.deleteDirectory( testDir );
-            }
-            catch ( IOException e )
-            {
-                e.printStackTrace();
-                fail( "Trying to remove directory:" + testDir + 
System.lineSeparator() + e.toString() );
-            }
+            DirectoryUtil.deleteDirectories( testDir );
             assertFalse( testDir.exists() );
         }
     }
@@ -82,7 +72,7 @@ public abstract class AbstractDependencyMojoTestCase
     {
         mojo.copyFile( artifact, destFile );
     }
-    
+
 
     protected void installLocalRepository( LegacySupport legacySupport )
         throws ComponentLookupException
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/DirectoryUtil.java 
b/src/test/java/org/apache/maven/plugins/dependency/DirectoryUtil.java
new file mode 100644
index 00000000..fa737a63
--- /dev/null
+++ b/src/test/java/org/apache/maven/plugins/dependency/DirectoryUtil.java
@@ -0,0 +1,59 @@
+package org.apache.maven.plugins.dependency;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Comparator;
+import java.util.stream.Stream;
+
+public final class DirectoryUtil
+{
+    public static void deleteDirectories( File directory )
+    {
+        Path path = Paths.get( directory.getAbsolutePath() );
+        deleteDirectories( path );
+    }
+
+    public static void deleteDirectories( Path directory )
+    {
+        if ( !Files.exists( directory ) )
+        {
+            return;
+        }
+
+        try ( Stream<Path> dirs = Files.walk( directory ) )
+        {
+            dirs.filter( Files::exists )
+                    .sorted( Comparator.reverseOrder() )
+                    .map( Path::toFile )
+                    .forEach( File::delete );
+        }
+        catch ( IOException e )
+        {
+            throw new RuntimeException( e );
+        }
+
+    }
+
+}
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/analyze/UtilTest.java 
b/src/test/java/org/apache/maven/plugins/dependency/analyze/UtilTest.java
new file mode 100644
index 00000000..c28956af
--- /dev/null
+++ b/src/test/java/org/apache/maven/plugins/dependency/analyze/UtilTest.java
@@ -0,0 +1,113 @@
+package org.apache.maven.plugins.dependency.analyze;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class UtilTest
+{
+
+    @Test
+    public void two_lists_one_with_duplicates()
+    {
+        List<String> s1 = new ArrayList<>();
+        s1.add( "1" );
+        s1.add( "2" );
+        s1.add( "2" );
+        s1.add( "3" );
+        List<String> s2 = new ArrayList<>();
+        s2.add( "3" );
+        s2.add( "4" );
+        Collection<String> result = Util.symmetricDifference( s1, s2 );
+
+        assertThat( result ).containsExactly( "1", "2", "2", "4" );
+    }
+
+    @Test
+    public void two_different_sets_with_commons_elements()
+    {
+        Set<String> s1 = new HashSet<>();
+        s1.add( "1" );
+        s1.add( "2" );
+        s1.add( "3" );
+        s1.add( "4" );
+        s1.add( "5" );
+        Set<String> s2 = new HashSet<>();
+        s2.add( "2" );
+        s2.add( "4" );
+        s2.add( "6" );
+        Collection<String> result = Util.symmetricDifference( s1, s2 );
+
+        assertThat( result ).containsExactly( "1", "3", "5", "6" );
+    }
+
+    @Test
+    public void second_set_only()
+    {
+        Set<String> s1 = new HashSet<>();
+        s1.add( "1" );
+        s1.add( "2" );
+        s1.add( "3" );
+        s1.add( "4" );
+        s1.add( "5" );
+        Set<String> s2 = new HashSet<>();
+        s2.add( "3" );
+        s2.add( "5" );
+        Collection<String> result = Util.symmetricDifference( s1, s2 );
+
+        assertThat( result ).containsExactly( "1", "2", "4" );
+    }
+
+    @Test
+    public void list_with_duplicate()
+    {
+        List<String> s1 = new ArrayList<>();
+        s1.add( "1" );
+        s1.add( "2" );
+        s1.add( "2" );
+
+        Collection<String> result = Util.symmetricDifference( s1, new 
LinkedHashSet<>( s1 ) );
+
+        assertThat( result ).containsExactly( "2" );
+    }
+
+    @Test
+    public void list_with_tripple_entries()
+    {
+        List<String> s1 = new ArrayList<>();
+        s1.add( "1" );
+        s1.add( "2" );
+        s1.add( "2" );
+        s1.add( "2" );
+
+        Collection<String> result = Util.symmetricDifference( s1, new 
LinkedHashSet<>( s1 ) );
+
+        assertThat( result ).containsExactly( "2", "2" );
+    }
+}
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
 
b/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
index 842e6614..9f512f63 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/fromDependencies/TestCopyDependenciesMojo.java
@@ -22,6 +22,7 @@ package org.apache.maven.plugins.dependency.fromDependencies;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
@@ -35,7 +36,6 @@ import 
org.apache.maven.plugins.dependency.AbstractDependencyMojoTestCase;
 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
 import 
org.apache.maven.plugins.dependency.utils.markers.DefaultFileMarkerHandler;
 import org.apache.maven.project.MavenProject;
-import org.codehaus.plexus.util.StringUtils;
 
 public class TestCopyDependenciesMojo
     extends AbstractDependencyMojoTestCase
@@ -455,11 +455,12 @@ public class TestCopyDependenciesMojo
             String useClassifier = artifact.getClassifier();
             String useType = artifact.getType();
 
-            if ( StringUtils.isNotEmpty( testClassifier ) )
+
+            if ( Objects.nonNull( testClassifier ) && 
!testClassifier.isEmpty() )
             {
                 useClassifier = "-" + testClassifier;
                 // type is only used if classifier is used.
-                if ( StringUtils.isNotEmpty( testType ) )
+                if ( Objects.nonNull( testType ) && !testType.isEmpty() )
                 {
                     useType = testType;
                 }
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
 
b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
index aacaae2e..19da9e9f 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestDestFileFilter.java
@@ -25,14 +25,13 @@ import java.util.HashSet;
 import java.util.Set;
 
 import junit.framework.TestCase;
-
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
-import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
-import org.apache.maven.plugins.dependency.utils.DependencyUtil;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.testing.SilentLog;
+import org.apache.maven.plugins.dependency.DirectoryUtil;
+import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
+import org.apache.maven.plugins.dependency.utils.DependencyUtil;
 import 
org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
 
 /**
@@ -55,7 +54,7 @@ public class TestDestFileFilter
         super.setUp();
 
         outputFolder = new File( "target/markers/" );
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
 
         this.fact = new DependencyArtifactStubFactory( outputFolder, false );
@@ -65,7 +64,7 @@ public class TestDestFileFilter
     protected void tearDown()
         throws IOException
     {
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
     }
 
     public File createFile( Artifact artifact )
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
 
b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
index 8069c9d5..3fb414ec 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestMarkerFileFilter.java
@@ -26,9 +26,9 @@ import java.util.Set;
 
 import junit.framework.TestCase;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.dependency.DirectoryUtil;
 import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
 import 
org.apache.maven.plugins.dependency.utils.markers.DefaultFileMarkerHandler;
 import org.apache.maven.plugin.logging.Log;
@@ -55,7 +55,7 @@ public class TestMarkerFileFilter
         super.setUp();
 
         outputFolder = new File( "target/markers/" );
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
 
         this.fact = new DependencyArtifactStubFactory( outputFolder, false );
@@ -65,7 +65,7 @@ public class TestMarkerFileFilter
     protected void tearDown()
         throws IOException
     {
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
     }
 
     public void testMarkerFile()
@@ -99,7 +99,7 @@ public class TestMarkerFileFilter
         result = filter.filter( artifacts );
         assertEquals( 2, result.size() );
         assertTrue( handler.clearMarker() );
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
     }
 
@@ -119,7 +119,7 @@ public class TestMarkerFileFilter
         assertEquals( 2, result.size() );
 
         assertTrue( handler.clearMarker() );
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
     }
 
@@ -157,7 +157,7 @@ public class TestMarkerFileFilter
         assertFalse( handler.isMarkerSet() );
         snap.getFile().delete();
         release.getFile().delete();
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
     }
 
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
 
b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
index 4c36fe43..fbf822c9 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/utils/filters/TestResolveMarkerFileFilter.java
@@ -29,9 +29,9 @@ import java.util.Set;
 
 import junit.framework.TestCase;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.dependency.DirectoryUtil;
 import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
 import 
org.apache.maven.plugins.dependency.utils.markers.SourcesFileMarkerHandler;
 import org.apache.maven.plugin.logging.Log;
@@ -58,7 +58,7 @@ public class TestResolveMarkerFileFilter
         super.setUp();
 
         outputFolder = new File( "target/markers/" );
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
 
         this.fact = new DependencyArtifactStubFactory( outputFolder, false );
@@ -68,7 +68,7 @@ public class TestResolveMarkerFileFilter
     protected void tearDown()
         throws IOException
     {
-        FileUtils.deleteDirectory( outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
     }
 
     public void testResolveFile()
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
 
b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
index 4d328cba..d7e544e2 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestDefaultMarkerFileHandler.java
@@ -25,17 +25,16 @@ import java.util.ArrayList;
 import java.util.List;
 
 import junit.framework.TestCase;
-
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
 import org.apache.maven.artifact.versioning.VersionRange;
 import org.apache.maven.plugin.MojoExecutionException;
-import 
org.apache.maven.plugins.dependency.testUtils.stubs.StubDefaultFileMarkerHandler;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.testing.SilentLog;
+import org.apache.maven.plugins.dependency.DirectoryUtil;
+import 
org.apache.maven.plugins.dependency.testUtils.stubs.StubDefaultFileMarkerHandler;
 
 /**
  * @author brianf
@@ -66,14 +65,14 @@ public class TestDefaultMarkerFileHandler
         artifacts.add( artifact );
 
         outputFolder = new File( "target/markers/" );
-        FileUtils.deleteDirectory( this.outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
     }
 
     protected void tearDown()
         throws IOException
     {
-        FileUtils.deleteDirectory( this.outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
     }
 
     public void testSetMarker()
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
 
b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
index 8501b217..c3a92b9c 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/utils/markers/TestUnpackMarkerFileHandler.java
@@ -24,15 +24,15 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.dependency.fromConfiguration.ArtifactItem;
-import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
-import 
org.apache.maven.plugins.dependency.testUtils.stubs.StubUnpackFileMarkerHandler;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.plugin.testing.SilentLog;
+import org.apache.maven.plugins.dependency.DirectoryUtil;
+import org.apache.maven.plugins.dependency.fromConfiguration.ArtifactItem;
+import 
org.apache.maven.plugins.dependency.testUtils.DependencyArtifactStubFactory;
+import 
org.apache.maven.plugins.dependency.testUtils.stubs.StubUnpackFileMarkerHandler;
 
 public class TestUnpackMarkerFileHandler
     extends AbstractMojoTestCase
@@ -54,7 +54,7 @@ public class TestUnpackMarkerFileHandler
 
         testDir = new File( getBasedir(), "target" + File.separatorChar + 
"unit-tests" + File.separatorChar
             + "unpack-markers" + File.separatorChar );
-        FileUtils.deleteDirectory( testDir );
+        DirectoryUtil.deleteDirectories( testDir );
         assertFalse( testDir.exists() );
 
         stubFactory = new DependencyArtifactStubFactory( this.testDir, false );
@@ -77,14 +77,14 @@ public class TestUnpackMarkerFileHandler
         artifactItems.add( artifactItem );
 
         outputFolder = new File( "target/markers/" );
-        FileUtils.deleteDirectory( this.outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
         assertFalse( outputFolder.exists() );
     }
 
     protected void tearDown()
         throws IOException
     {
-        FileUtils.deleteDirectory( this.outputFolder );
+        DirectoryUtil.deleteDirectories( outputFolder );
     }
 
     /**


Reply via email to