From b3d769ac685620a07213640abb727dc2c77ca0ab Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Thu, 20 Apr 2017 23:41:32 -0400 Subject: [PATCH 1/8] Expose which dependency classes are used and where --- .../DefaultProjectDependencyAnalyzer.java | 115 ++++++++++++++---- .../DependencyAnalyzerWithUsages.java | 42 +++++++ .../dependency/analyzer/DependencyUsage.java | 104 ++++++++++++++++ .../analyzer/ProjectDependencyAnalysis.java | 81 ++++++++++-- .../asm/ASMDependencyAnalyzerWithUsages.java | 55 +++++++++ .../asm/DependencyClassFileVisitor.java | 23 +++- 6 files changed, 383 insertions(+), 37 deletions(-) create mode 100644 maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java create mode 100644 maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java create mode 100644 maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java index f0e92c409..a2294538c 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java @@ -24,10 +24,13 @@ import java.net.URL; import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -57,7 +60,7 @@ public class DefaultProjectDependencyAnalyzer * DependencyAnalyzer */ @Requirement - private DependencyAnalyzer dependencyAnalyzer; + private DependencyAnalyzerWithUsages dependencyAnalyzer; // ProjectDependencyAnalyzer methods -------------------------------------- @@ -71,20 +74,21 @@ public ProjectDependencyAnalysis analyze( MavenProject project ) { Map> artifactClassMap = buildArtifactClassMap( project ); - Set dependencyClasses = buildDependencyClasses( project ); + Set dependencyUsages = buildDependencyUsages( project ); Set declaredArtifacts = buildDeclaredArtifacts( project ); - Set usedArtifacts = buildUsedArtifacts( artifactClassMap, dependencyClasses ); + Map> usedArtifacts = buildArtifactToUsageMap( artifactClassMap, + dependencyUsages ); - Set usedDeclaredArtifacts = new LinkedHashSet( declaredArtifacts ); - usedDeclaredArtifacts.retainAll( usedArtifacts ); + Map> usedDeclaredArtifacts = buildMutableCopy( usedArtifacts ); + usedDeclaredArtifacts.keySet().retainAll( declaredArtifacts ); - Set usedUndeclaredArtifacts = new LinkedHashSet( usedArtifacts ); - usedUndeclaredArtifacts = removeAll( usedUndeclaredArtifacts, declaredArtifacts ); + Map> usedUndeclaredArtifacts = buildMutableCopy( usedArtifacts ); + removeAll( usedUndeclaredArtifacts.keySet(), declaredArtifacts ); Set unusedDeclaredArtifacts = new LinkedHashSet( declaredArtifacts ); - unusedDeclaredArtifacts = removeAll( unusedDeclaredArtifacts, usedArtifacts ); + removeAll( unusedDeclaredArtifacts, usedArtifacts.keySet() ); return new ProjectDependencyAnalysis( usedDeclaredArtifacts, usedUndeclaredArtifacts, unusedDeclaredArtifacts ); @@ -101,32 +105,22 @@ public ProjectDependencyAnalysis analyze( MavenProject project ) * * @param start initial set * @param remove set to exclude - * @return set with remove excluded */ - private Set removeAll( Set start, Set remove ) + private static void removeAll( Set start, Set remove ) { - Set results = new LinkedHashSet( start.size() ); - - for ( Artifact artifact : start ) + for ( Iterator iterator = start.iterator(); iterator.hasNext(); ) { - boolean found = false; + Artifact artifact = iterator.next(); for ( Artifact artifact2 : remove ) { if ( artifact.getDependencyConflictId().equals( artifact2.getDependencyConflictId() ) ) { - found = true; + iterator.remove(); break; } } - - if ( !found ) - { - results.add( artifact ); - } } - - return results; } protected Map> buildArtifactClassMap( MavenProject project ) @@ -194,16 +188,29 @@ protected Set buildDependencyClasses( MavenProject project ) { Set dependencyClasses = new HashSet(); + for ( DependencyUsage usage : buildDependencyUsages( project ) ) + { + dependencyClasses.add( usage.getDependencyClass() ); + } + + return dependencyClasses; + } + + protected Set buildDependencyUsages( MavenProject project ) + throws IOException + { + Set dependencyUsages = new HashSet(); + String outputDirectory = project.getBuild().getOutputDirectory(); - dependencyClasses.addAll( buildDependencyClasses( outputDirectory ) ); + dependencyUsages.addAll( buildDependencyUsages( outputDirectory ) ); String testOutputDirectory = project.getBuild().getTestOutputDirectory(); - dependencyClasses.addAll( buildDependencyClasses( testOutputDirectory ) ); + dependencyUsages.addAll( buildDependencyUsages( testOutputDirectory ) ); - return dependencyClasses; + return dependencyUsages; } - private Set buildDependencyClasses( String path ) + private Set buildDependencyUsages( String path ) throws IOException { URL url = new File( path ).toURI().toURL(); @@ -242,6 +249,31 @@ protected Set buildUsedArtifacts( Map> artifactC return usedArtifacts; } + protected Map> buildArtifactToUsageMap( Map> artifactClassMap, + Set dependencyUsages ) + { + Map> dependencyClassToUsages = buildDependencyClassToUsageMap( dependencyUsages ); + + Map> artifactToUsages = new HashMap>(); + + for ( Entry> entry : dependencyClassToUsages.entrySet() ) + { + Artifact artifact = findArtifactForClassName( artifactClassMap, entry.getKey() ); + + if ( artifact != null ) + { + if ( !artifactToUsages.containsKey( artifact ) ) + { + artifactToUsages.put( artifact, new HashSet() ); + } + + artifactToUsages.get( artifact ).addAll( entry.getValue() ); + } + } + + return artifactToUsages; + } + protected Artifact findArtifactForClassName( Map> artifactClassMap, String className ) { for ( Map.Entry> entry : artifactClassMap.entrySet() ) @@ -254,4 +286,35 @@ protected Artifact findArtifactForClassName( Map> artifact return null; } + + private Map> buildDependencyClassToUsageMap( Set dependencyUsages ) + { + Map> dependencyClassToUsages = new HashMap>(); + + for ( DependencyUsage dependencyUsage : dependencyUsages ) + { + String dependencyClass = dependencyUsage.getDependencyClass(); + + if ( !dependencyClassToUsages.containsKey( dependencyClass ) ) + { + dependencyClassToUsages.put( dependencyClass, new HashSet() ); + } + + dependencyClassToUsages.get( dependencyClass ).add( dependencyUsage ); + } + + return dependencyClassToUsages; + } + + private Map> buildMutableCopy( Map> map ) + { + Map> copy = new LinkedHashMap>(); + + for ( Entry> entry : map.entrySet() ) + { + copy.put( entry.getKey(), new LinkedHashSet( entry.getValue() ) ); + } + + return copy; + } } diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java new file mode 100644 index 000000000..a29ada168 --- /dev/null +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java @@ -0,0 +1,42 @@ +package org.apache.maven.shared.dependency.analyzer; + +/* + * 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.IOException; +import java.net.URL; +import java.util.Set; + +/** + * Gets the set of dependency usages for a library given either as a jar file or an exploded directory. + * + * @author Jonathan Haber + * @version $Id$ + */ +public interface DependencyAnalyzerWithUsages +{ + // fields ----------------------------------------------------------------- + + String ROLE = DependencyAnalyzerWithUsages.class.getName(); + + // public methods --------------------------------------------------------- + + Set analyze( URL url ) + throws IOException; +} diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java new file mode 100644 index 000000000..1203db258 --- /dev/null +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java @@ -0,0 +1,104 @@ +package org.apache.maven.shared.dependency.analyzer; + +/* + * 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. + */ + +/** + * Usage of a dependency class by a project class. + * + * @author Jonathan Haber + * @version $Id$ + */ +public class DependencyUsage +{ + // fields ----------------------------------------------------------------- + + private final String dependencyClass; + + private final String usedBy; + + // constructors ----------------------------------------------------------- + + public DependencyUsage( String dependencyClass, String usedBy ) + { + this.dependencyClass = dependencyClass; + this.usedBy = usedBy; + } + + // public methods --------------------------------------------------------- + + + public String getDependencyClass() + { + return dependencyClass; + } + + public String getUsedBy() + { + return usedBy; + } + + // Object methods --------------------------------------------------------- + + /* + * @see java.lang.Object#hashCode() + */ + public int hashCode() + { + int hashCode = dependencyClass.hashCode(); + hashCode = ( hashCode * 37 ) + usedBy.hashCode(); + + return hashCode; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object object ) + { + if ( object instanceof DependencyUsage ) + { + DependencyUsage usage = (DependencyUsage) object; + + return getDependencyClass().equals( usage.getDependencyClass() ) + && getUsedBy().equals( usage.getUsedBy() ); + } + + return false; + } + + /* + * @see java.lang.Object#toString() + */ + public String toString() + { + StringBuilder buffer = new StringBuilder(); + + buffer.append( "dependencyClass=" ).append( getDependencyClass() ); + buffer.append( "," ); + buffer.append( "usedBy=" ).append( getUsedBy() ); + + buffer.insert( 0, "[" ); + buffer.insert( 0, getClass().getName() ); + + buffer.append( "]" ); + + return buffer.toString(); + } +} diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java index ebfdec243..830536d4d 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysis.java @@ -21,9 +21,13 @@ import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.apache.maven.artifact.Artifact; @@ -38,9 +42,9 @@ public class ProjectDependencyAnalysis { // fields ----------------------------------------------------------------- - private final Set usedDeclaredArtifacts; + private final Map> usedDeclaredArtifacts; - private final Set usedUndeclaredArtifacts; + private final Map> usedUndeclaredArtifacts; private final Set unusedDeclaredArtifacts; @@ -48,11 +52,18 @@ public class ProjectDependencyAnalysis public ProjectDependencyAnalysis() { - this( null, null, null ); + this( (Set) null, null, null ); } public ProjectDependencyAnalysis( Set usedDeclaredArtifacts, Set usedUndeclaredArtifacts, Set unusedDeclaredArtifacts ) + { + this( toMap( usedDeclaredArtifacts ), toMap( usedUndeclaredArtifacts ), unusedDeclaredArtifacts ); + } + + public ProjectDependencyAnalysis( Map> usedDeclaredArtifacts, + Map> usedUndeclaredArtifacts, + Set unusedDeclaredArtifacts ) { this.usedDeclaredArtifacts = safeCopy( usedDeclaredArtifacts ); this.usedUndeclaredArtifacts = safeCopy( usedUndeclaredArtifacts ); @@ -65,6 +76,14 @@ public ProjectDependencyAnalysis( Set usedDeclaredArtifacts, Set getUsedDeclaredArtifacts() + { + return usedDeclaredArtifacts.keySet(); + } + + /** + * Used and declared artifacts mapped to usages. + */ + public Map> getUsedDeclaredArtifactToUsageMap() { return usedDeclaredArtifacts; } @@ -73,6 +92,14 @@ public Set getUsedDeclaredArtifacts() * Used but not declared artifacts. */ public Set getUsedUndeclaredArtifacts() + { + return usedUndeclaredArtifacts.keySet(); + } + + /** + * Used but not declared artifacts mapped to usages. + */ + public Map> getUsedUndeclaredArtifactToUsageMap() { return usedUndeclaredArtifacts; } @@ -123,7 +150,9 @@ public ProjectDependencyAnalysis forceDeclaredDependenciesUsage( String[] forceU Set forced = new HashSet( Arrays.asList( forceUsedDependencies ) ); Set forcedUnusedDeclared = new HashSet( unusedDeclaredArtifacts ); - Set forcedUsedDeclared = new HashSet( usedDeclaredArtifacts ); + Map> forcedUsedDeclared = new HashMap>( + usedDeclaredArtifacts + ); for ( Iterator iter = forcedUnusedDeclared.iterator(); iter.hasNext(); ) { @@ -133,7 +162,10 @@ public ProjectDependencyAnalysis forceDeclaredDependenciesUsage( String[] forceU { // ok, change artifact status from unused-declared to used-declared iter.remove(); - forcedUsedDeclared.add( artifact ); + if ( !forcedUsedDeclared.containsKey( artifact ) ) + { + forcedUsedDeclared.put( artifact, Collections.emptySet() ); + } } } @@ -141,7 +173,7 @@ public ProjectDependencyAnalysis forceDeclaredDependenciesUsage( String[] forceU { // trying to force dependencies as used-declared which were not declared or already detected as used Set used = new HashSet(); - for ( Artifact artifact : usedDeclaredArtifacts ) + for ( Artifact artifact : usedDeclaredArtifacts.keySet() ) { String id = artifact.getGroupId() + ':' + artifact.getArtifactId(); if ( forced.remove( id ) ) @@ -242,9 +274,40 @@ public String toString() // private methods -------------------------------------------------------- - private Set safeCopy( Set set ) + private Set safeCopy( Set set ) + { + return ( set == null ) ? Collections.emptySet() + : Collections.unmodifiableSet( new LinkedHashSet( set ) ); + } + + private Map> safeCopy( Map> map ) + { + Map> copy = new LinkedHashMap>(); + + for ( Entry> entry : map.entrySet() ) + { + copy.put( entry.getKey(), safeCopy( entry.getValue() ) ); + } + + return Collections.unmodifiableMap( copy ); + } + + private static Map> toMap( Set set ) { - return ( set == null ) ? Collections.emptySet() - : Collections.unmodifiableSet( new LinkedHashSet( set ) ); + if ( set == null ) + { + return Collections.>emptyMap(); + } + else + { + Map> map = new HashMap>(); + + for ( Artifact artifact : set ) + { + map.put( artifact, Collections.emptySet() ); + } + + return map; + } } } diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java new file mode 100644 index 000000000..dcde18257 --- /dev/null +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java @@ -0,0 +1,55 @@ +package org.apache.maven.shared.dependency.analyzer.asm; + +/* + * 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.IOException; +import java.net.URL; +import java.util.Set; + +import org.apache.maven.shared.dependency.analyzer.ClassFileVisitorUtils; +import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzerWithUsages; +import org.apache.maven.shared.dependency.analyzer.DependencyUsage; +import org.codehaus.plexus.component.annotations.Component; + +/** + * ASMDependencyAnalyzerWithUsages + * + * @author Jonathan Haber + * @version $Id$ + */ +@Component( role = DependencyAnalyzerWithUsages.class ) +public class ASMDependencyAnalyzerWithUsages + implements DependencyAnalyzerWithUsages +{ + // DependencyAnalyzerWithUsages methods --------------------------------------------- + + /* + * @see org.apache.maven.shared.dependency.analyzer.DependencyAnalyzerWithUsages#analyze(java.net.URL) + */ + public Set analyze( URL url ) + throws IOException + { + DependencyClassFileVisitor visitor = new DependencyClassFileVisitor(); + + ClassFileVisitorUtils.accept( url, visitor ); + + return visitor.getDependencyUsages(); + } +} diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java index 1c594aeb9..225451119 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/DependencyClassFileVisitor.java @@ -20,6 +20,7 @@ */ import org.apache.maven.shared.dependency.analyzer.ClassFileVisitor; +import org.apache.maven.shared.dependency.analyzer.DependencyUsage; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -29,6 +30,7 @@ import java.io.IOException; import java.io.InputStream; +import java.util.HashSet; import java.util.Set; /** @@ -44,7 +46,9 @@ public class DependencyClassFileVisitor { // fields ----------------------------------------------------------------- - private final ResultCollector resultCollector = new ResultCollector(); + private final Set dependencies = new HashSet(); + + private final Set dependencyUsages = new HashSet(); // constructors ----------------------------------------------------------- @@ -60,6 +64,7 @@ public DependencyClassFileVisitor() */ public void visitClass( String className, InputStream in ) { + ResultCollector resultCollector = new ResultCollector(); try { ClassReader reader = new ClassReader( in ); @@ -89,6 +94,12 @@ public void visitClass( String className, InputStream in ) // this happens when the class isn't valid. System.out.println( "Unable to process: " + className ); } + + for ( String dependencyClass : resultCollector.getDependencies() ) + { + dependencies.add( dependencyClass ); + dependencyUsages.add( new DependencyUsage( dependencyClass, className ) ); + } } // public methods --------------------------------------------------------- @@ -98,6 +109,14 @@ public void visitClass( String className, InputStream in ) */ public Set getDependencies() { - return resultCollector.getDependencies(); + return dependencies; + } + + /** + * @return the set of dependency usages for visited class files + */ + public Set getDependencyUsages() + { + return dependencyUsages; } } From 17fd6599d4ef174e787b734eeba3dd28736af25a Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Fri, 21 Apr 2017 09:51:18 -0400 Subject: [PATCH 2/8] Remove static --- .../dependency/analyzer/DefaultProjectDependencyAnalyzer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java index a2294538c..c6883b0b8 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java @@ -106,7 +106,7 @@ public ProjectDependencyAnalysis analyze( MavenProject project ) * @param start initial set * @param remove set to exclude */ - private static void removeAll( Set start, Set remove ) + private void removeAll( Set start, Set remove ) { for ( Iterator iterator = start.iterator(); iterator.hasNext(); ) { From 5bce590f6135f8b02689b8a910f7377ad2ffd20a Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Sun, 16 Jun 2019 22:37:55 -0400 Subject: [PATCH 3/8] Implement code review suggestions --- .../DefaultProjectDependencyAnalyzer.java | 4 +- .../analyzer/DependencyAnalyzer.java | 3 + .../DependencyAnalyzerWithUsages.java | 42 ---------- .../dependency/analyzer/DependencyUsage.java | 1 - .../analyzer/asm/ASMDependencyAnalyzer.java | 14 ++++ .../asm/ASMDependencyAnalyzerWithUsages.java | 55 ------------- .../DefaultProjectDependencyAnalyzerTest.java | 78 +++++++++++++++---- 7 files changed, 83 insertions(+), 114 deletions(-) delete mode 100644 maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java delete mode 100644 maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java index c6883b0b8..5480fb9da 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java @@ -60,7 +60,7 @@ public class DefaultProjectDependencyAnalyzer * DependencyAnalyzer */ @Requirement - private DependencyAnalyzerWithUsages dependencyAnalyzer; + private DependencyAnalyzer dependencyAnalyzer; // ProjectDependencyAnalyzer methods -------------------------------------- @@ -215,7 +215,7 @@ private Set buildDependencyUsages( String path ) { URL url = new File( path ).toURI().toURL(); - return dependencyAnalyzer.analyze( url ); + return dependencyAnalyzer.analyzeWithUsages( url ); } protected Set buildDeclaredArtifacts( MavenProject project ) diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java index 5de91e978..542ba0b7a 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzer.java @@ -39,4 +39,7 @@ public interface DependencyAnalyzer Set analyze( URL url ) throws IOException; + + Set analyzeWithUsages( URL url ) + throws IOException; } diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java deleted file mode 100644 index a29ada168..000000000 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyAnalyzerWithUsages.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.apache.maven.shared.dependency.analyzer; - -/* - * 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.IOException; -import java.net.URL; -import java.util.Set; - -/** - * Gets the set of dependency usages for a library given either as a jar file or an exploded directory. - * - * @author Jonathan Haber - * @version $Id$ - */ -public interface DependencyAnalyzerWithUsages -{ - // fields ----------------------------------------------------------------- - - String ROLE = DependencyAnalyzerWithUsages.class.getName(); - - // public methods --------------------------------------------------------- - - Set analyze( URL url ) - throws IOException; -} diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java index 1203db258..e973133df 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DependencyUsage.java @@ -23,7 +23,6 @@ * Usage of a dependency class by a project class. * * @author Jonathan Haber - * @version $Id$ */ public class DependencyUsage { diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java index facad0967..c36aa853b 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzer.java @@ -25,6 +25,7 @@ import org.apache.maven.shared.dependency.analyzer.ClassFileVisitorUtils; import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzer; +import org.apache.maven.shared.dependency.analyzer.DependencyUsage; import org.codehaus.plexus.component.annotations.Component; /** @@ -51,4 +52,17 @@ public Set analyze( URL url ) return visitor.getDependencies(); } + + /* + * @see org.apache.maven.shared.dependency.analyzer.DependencyAnalyzer#analyze(java.net.URL) + */ + public Set analyzeWithUsages( URL url ) + throws IOException + { + DependencyClassFileVisitor visitor = new DependencyClassFileVisitor(); + + ClassFileVisitorUtils.accept( url, visitor ); + + return visitor.getDependencyUsages(); + } } diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java deleted file mode 100644 index dcde18257..000000000 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/asm/ASMDependencyAnalyzerWithUsages.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.apache.maven.shared.dependency.analyzer.asm; - -/* - * 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.IOException; -import java.net.URL; -import java.util.Set; - -import org.apache.maven.shared.dependency.analyzer.ClassFileVisitorUtils; -import org.apache.maven.shared.dependency.analyzer.DependencyAnalyzerWithUsages; -import org.apache.maven.shared.dependency.analyzer.DependencyUsage; -import org.codehaus.plexus.component.annotations.Component; - -/** - * ASMDependencyAnalyzerWithUsages - * - * @author Jonathan Haber - * @version $Id$ - */ -@Component( role = DependencyAnalyzerWithUsages.class ) -public class ASMDependencyAnalyzerWithUsages - implements DependencyAnalyzerWithUsages -{ - // DependencyAnalyzerWithUsages methods --------------------------------------------- - - /* - * @see org.apache.maven.shared.dependency.analyzer.DependencyAnalyzerWithUsages#analyze(java.net.URL) - */ - public Set analyze( URL url ) - throws IOException - { - DependencyClassFileVisitor visitor = new DependencyClassFileVisitor(); - - ClassFileVisitorUtils.accept( url, visitor ); - - return visitor.getDependencyUsages(); - } -} diff --git a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java index 1e2466b08..2a1ef4d65 100644 --- a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java +++ b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java @@ -5,11 +5,25 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.commons.lang3.JavaVersion; import org.apache.commons.lang3.SystemUtils; +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.project.MavenProject; +import org.apache.maven.shared.invoker.InvocationRequest; +import org.apache.maven.shared.invoker.InvocationResult; +import org.apache.maven.shared.test.plugin.BuildTool; +import org.apache.maven.shared.test.plugin.ProjectTool; +import org.apache.maven.shared.test.plugin.RepositoryTool; +import org.apache.maven.shared.test.plugin.TestToolsException; +import org.codehaus.plexus.PlexusTestCase; /* * Licensed to the Apache Software Foundation (ASF) under one @@ -30,20 +44,6 @@ * under the License. */ -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.project.MavenProject; -import org.apache.maven.shared.invoker.InvocationRequest; -import org.apache.maven.shared.invoker.InvocationResult; -import org.apache.maven.shared.test.plugin.BuildTool; -import org.apache.maven.shared.test.plugin.ProjectTool; -import org.apache.maven.shared.test.plugin.RepositoryTool; -import org.apache.maven.shared.test.plugin.TestToolsException; -import org.codehaus.plexus.PlexusTestCase; - /** * Tests DefaultProjectDependencyAnalyzer. * @@ -116,6 +116,8 @@ public void testJarWithNoDependencies() ProjectDependencyAnalysis expectedAnalysis = new ProjectDependencyAnalysis(); assertEquals( expectedAnalysis, actualAnalysis ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedDeclaredArtifactToUsageMap() ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedUndeclaredArtifactToUsageMap() ); } public void testJava8methodRefs() @@ -141,6 +143,18 @@ public void testJava8methodRefs() new ProjectDependencyAnalysis( usedDeclaredArtifacts, new HashSet(), new HashSet() ); assertEquals( expectedAnalysis, actualAnalysis ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedUndeclaredArtifactToUsageMap() ); + + Map> actualDependencyUsageMap = + actualAnalysis.getUsedDeclaredArtifactToUsageMap(); + + Set expectedCommonsIoUsage = + Collections.singleton( new DependencyUsage( "org.apache.commons.io.FileUtils", "inlinedStaticReference.Project" ) ); + Set expectedCommonsLangUsage = + Collections.singleton( new DependencyUsage( "org.apache.commons.lang.CharUtils", "inlinedStaticReference.Project" ) ); + + assertEquals( expectedCommonsIoUsage, actualDependencyUsageMap.get( project1 ) ); + assertEquals( expectedCommonsLangUsage, actualDependencyUsageMap.get( project2 ) ); } public void testInlinedStaticReference() @@ -165,6 +179,15 @@ public void testInlinedStaticReference() new ProjectDependencyAnalysis( usedDeclaredArtifacts, new HashSet(), new HashSet() ); assertEquals( expectedAnalysis, actualAnalysis ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedUndeclaredArtifactToUsageMap() ); + + Map> actualDependencyUsageMap = + actualAnalysis.getUsedDeclaredArtifactToUsageMap(); + + Set expectedDom4jUsage = + Collections.singleton( new DependencyUsage( "org.dom4j.Node", "inlinedStaticReference.Project" ) ); + + assertEquals( expectedDom4jUsage, actualDependencyUsageMap.get( project1 ) ); } public void testJarWithCompileDependency() @@ -189,6 +212,15 @@ public void testJarWithCompileDependency() ProjectDependencyAnalysis expectedAnalysis = new ProjectDependencyAnalysis( usedDeclaredArtifacts, null, null ); assertEquals( expectedAnalysis, actualAnalysis ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedUndeclaredArtifactToUsageMap() ); + + Map> actualDependencyUsageMap = + actualAnalysis.getUsedDeclaredArtifactToUsageMap(); + + Set expectedDependency1Usage = + Collections.singleton( new DependencyUsage( "jarWithCompileDependency.project1.Project1", "jarWithCompileDependency.project2.Project2" ) ); + + assertEquals( expectedDependency1Usage, actualDependencyUsageMap.get( project1 ) ); } public void testForceDeclaredDependenciesUsage() @@ -253,6 +285,15 @@ public void testJarWithTestDependency() } assertEquals( expectedAnalysis, actualAnalysis ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedUndeclaredArtifactToUsageMap() ); + + Map> actualDependencyUsageMap = + actualAnalysis.getUsedDeclaredArtifactToUsageMap(); + + Set expectedDependency1Usage = + Collections.singleton( new DependencyUsage( "jarWithTestDependency.project1.Project1", "jarWithTestDependency.project2.Project2" ) ); + + assertEquals( expectedDependency1Usage, actualDependencyUsageMap.get( project1 ) ); } public void testJarWithXmlTransitiveDependency() @@ -300,6 +341,15 @@ public void testMultimoduleProject() ProjectDependencyAnalysis expectedAnalysis = new ProjectDependencyAnalysis( usedDeclaredArtifacts, null, null ); assertEquals( expectedAnalysis, actualAnalysis ); + assertEquals( Collections.emptyMap(), actualAnalysis.getUsedUndeclaredArtifactToUsageMap() ); + + Map> actualDependencyUsageMap = + actualAnalysis.getUsedDeclaredArtifactToUsageMap(); + + Set expectedTestModule1Usage = + Collections.singleton( new DependencyUsage( "foo.Main", "bar.Main" ) ); + + assertEquals( expectedTestModule1Usage, actualDependencyUsageMap.get( junit ) ); } // private methods -------------------------------------------------------- From bf7c5c9538d9766ed2e46afcb8d5de9c58103010 Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Sun, 16 Jun 2019 22:42:14 -0400 Subject: [PATCH 4/8] Update this test to check the new fields as well --- .../dependency/analyzer/ProjectDependencyAnalysisTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java index 8c1e3e94f..d3f81455d 100644 --- a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java +++ b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/ProjectDependencyAnalysisTest.java @@ -19,7 +19,9 @@ * under the License. */ +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.apache.maven.artifact.Artifact; @@ -41,14 +43,18 @@ public class ProjectDependencyAnalysisTest public void testConstructor() { Set usedDeclaredArtifacts = new HashSet(); + Map> usedDeclaredArtifactToUsageMap = new HashMap>(); Set usedUndeclaredArtifacts = new HashSet(); + Map> usedUndeclaredArtifactToUsageMap = new HashMap>(); Set unusedDeclaredArtifacts = new HashSet(); ProjectDependencyAnalysis analysis = new ProjectDependencyAnalysis( usedDeclaredArtifacts, usedUndeclaredArtifacts, unusedDeclaredArtifacts ); assertEquals( usedDeclaredArtifacts, analysis.getUsedDeclaredArtifacts() ); + assertEquals( usedDeclaredArtifactToUsageMap, analysis.getUsedDeclaredArtifactToUsageMap() ); assertEquals( usedUndeclaredArtifacts, analysis.getUsedUndeclaredArtifacts() ); + assertEquals( usedUndeclaredArtifactToUsageMap, analysis.getUsedUndeclaredArtifactToUsageMap() ); assertEquals( unusedDeclaredArtifacts, analysis.getUnusedDeclaredArtifacts() ); } } From db7df44bec7b223fbe3b8a8b40eb867d8309605c Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Sun, 16 Jun 2019 22:53:51 -0400 Subject: [PATCH 5/8] Revert import reorganizing --- .../DefaultProjectDependencyAnalyzerTest.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java index 2a1ef4d65..57ed93ec6 100644 --- a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java +++ b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java @@ -9,22 +9,6 @@ import java.util.Properties; import java.util.Set; -import org.apache.commons.lang3.JavaVersion; -import org.apache.commons.lang3.SystemUtils; -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.project.MavenProject; -import org.apache.maven.shared.invoker.InvocationRequest; -import org.apache.maven.shared.invoker.InvocationResult; -import org.apache.maven.shared.test.plugin.BuildTool; -import org.apache.maven.shared.test.plugin.ProjectTool; -import org.apache.maven.shared.test.plugin.RepositoryTool; -import org.apache.maven.shared.test.plugin.TestToolsException; -import org.codehaus.plexus.PlexusTestCase; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -44,6 +28,22 @@ * under the License. */ +import org.apache.commons.lang3.JavaVersion; +import org.apache.commons.lang3.SystemUtils; +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.project.MavenProject; +import org.apache.maven.shared.invoker.InvocationRequest; +import org.apache.maven.shared.invoker.InvocationResult; +import org.apache.maven.shared.test.plugin.BuildTool; +import org.apache.maven.shared.test.plugin.ProjectTool; +import org.apache.maven.shared.test.plugin.RepositoryTool; +import org.apache.maven.shared.test.plugin.TestToolsException; +import org.codehaus.plexus.PlexusTestCase; + /** * Tests DefaultProjectDependencyAnalyzer. * From dc4040f9751123210849efca8ca74f89878e3240 Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Sun, 16 Jun 2019 22:55:00 -0400 Subject: [PATCH 6/8] Revert more import reorganizing --- .../analyzer/DefaultProjectDependencyAnalyzerTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java index 57ed93ec6..a1976647e 100644 --- a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java +++ b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java @@ -9,6 +9,9 @@ import java.util.Properties; import java.util.Set; +import org.apache.commons.lang3.JavaVersion; +import org.apache.commons.lang3.SystemUtils; + /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -28,8 +31,6 @@ * under the License. */ -import org.apache.commons.lang3.JavaVersion; -import org.apache.commons.lang3.SystemUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DefaultArtifact; import org.apache.maven.artifact.handler.ArtifactHandler; From e703881b9aabe255b279d6e3d2e3e519f396fae4 Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Mon, 17 Jun 2019 08:31:13 -0400 Subject: [PATCH 7/8] Remove unused methods --- .../DefaultProjectDependencyAnalyzer.java | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java index 5480fb9da..35b26ebd9 100644 --- a/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java +++ b/maven-dependency-analyzer/src/main/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzer.java @@ -183,19 +183,6 @@ else if ( file != null && file.isDirectory() ) return artifactClassMap; } - protected Set buildDependencyClasses( MavenProject project ) - throws IOException - { - Set dependencyClasses = new HashSet(); - - for ( DependencyUsage usage : buildDependencyUsages( project ) ) - { - dependencyClasses.add( usage.getDependencyClass() ); - } - - return dependencyClasses; - } - protected Set buildDependencyUsages( MavenProject project ) throws IOException { @@ -231,24 +218,6 @@ protected Set buildDeclaredArtifacts( MavenProject project ) return declaredArtifacts; } - protected Set buildUsedArtifacts( Map> artifactClassMap, - Set dependencyClasses ) - { - Set usedArtifacts = new HashSet(); - - for ( String className : dependencyClasses ) - { - Artifact artifact = findArtifactForClassName( artifactClassMap, className ); - - if ( artifact != null ) - { - usedArtifacts.add( artifact ); - } - } - - return usedArtifacts; - } - protected Map> buildArtifactToUsageMap( Map> artifactClassMap, Set dependencyUsages ) { From 0e09e78587978f6c734feb9438245b2171b5954f Mon Sep 17 00:00:00 2001 From: Jonathan Haber Date: Mon, 17 Jun 2019 08:51:41 -0400 Subject: [PATCH 8/8] Make test assertions more robust --- .../DefaultProjectDependencyAnalyzerTest.java | 55 +++++++++++++------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java index a1976647e..7feaff23e 100644 --- a/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java +++ b/maven-dependency-analyzer/src/test/java/org/apache/maven/shared/dependency/analyzer/DefaultProjectDependencyAnalyzerTest.java @@ -3,6 +3,7 @@ import java.io.File; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -149,13 +150,14 @@ public void testJava8methodRefs() Map> actualDependencyUsageMap = actualAnalysis.getUsedDeclaredArtifactToUsageMap(); - Set expectedCommonsIoUsage = - Collections.singleton( new DependencyUsage( "org.apache.commons.io.FileUtils", "inlinedStaticReference.Project" ) ); - Set expectedCommonsLangUsage = - Collections.singleton( new DependencyUsage( "org.apache.commons.lang.CharUtils", "inlinedStaticReference.Project" ) ); + Map> expectedDependencyUsageMap = + new HashMap>(); + expectedDependencyUsageMap.put( project1, createDependencyUsage( + "org.apache.commons.io.FileUtils", "inlinedStaticReference.Project" ) ); + expectedDependencyUsageMap.put( project2, createDependencyUsage( + "org.apache.commons.lang.CharUtils", "inlinedStaticReference.Project" ) ); - assertEquals( expectedCommonsIoUsage, actualDependencyUsageMap.get( project1 ) ); - assertEquals( expectedCommonsLangUsage, actualDependencyUsageMap.get( project2 ) ); + assertEquals( expectedDependencyUsageMap, actualDependencyUsageMap ); } public void testInlinedStaticReference() @@ -185,10 +187,12 @@ public void testInlinedStaticReference() Map> actualDependencyUsageMap = actualAnalysis.getUsedDeclaredArtifactToUsageMap(); - Set expectedDom4jUsage = - Collections.singleton( new DependencyUsage( "org.dom4j.Node", "inlinedStaticReference.Project" ) ); + Map> expectedDependencyUsageMap = + new HashMap>(); + expectedDependencyUsageMap.put( project1, createDependencyUsage( + "org.dom4j.Node", "inlinedStaticReference.Project" ) ); - assertEquals( expectedDom4jUsage, actualDependencyUsageMap.get( project1 ) ); + assertEquals( expectedDependencyUsageMap, actualDependencyUsageMap ); } public void testJarWithCompileDependency() @@ -218,10 +222,12 @@ public void testJarWithCompileDependency() Map> actualDependencyUsageMap = actualAnalysis.getUsedDeclaredArtifactToUsageMap(); - Set expectedDependency1Usage = - Collections.singleton( new DependencyUsage( "jarWithCompileDependency.project1.Project1", "jarWithCompileDependency.project2.Project2" ) ); + Map> expectedDependencyUsageMap = + new HashMap>(); + expectedDependencyUsageMap.put( project1, createDependencyUsage( + "jarWithCompileDependency.project1.Project1", "jarWithCompileDependency.project2.Project2" ) ); - assertEquals( expectedDependency1Usage, actualDependencyUsageMap.get( project1 ) ); + assertEquals( expectedDependencyUsageMap, actualDependencyUsageMap ); } public void testForceDeclaredDependenciesUsage() @@ -291,10 +297,17 @@ public void testJarWithTestDependency() Map> actualDependencyUsageMap = actualAnalysis.getUsedDeclaredArtifactToUsageMap(); - Set expectedDependency1Usage = - Collections.singleton( new DependencyUsage( "jarWithTestDependency.project1.Project1", "jarWithTestDependency.project2.Project2" ) ); + Map> expectedDependencyUsageMap = + new HashMap>(); + expectedDependencyUsageMap.put( project1, createDependencyUsage( + "jarWithTestDependency.project1.Project1", "jarWithTestDependency.project2.Project2" ) ); + if ( SystemUtils.isJavaVersionAtLeast( JavaVersion.JAVA_1_8 ) ) + { + expectedDependencyUsageMap.put( junit, createDependencyUsage( + "junit.runner.TestRunListener", "jarWithTestDependency.project2.Project2" ) ); + } - assertEquals( expectedDependency1Usage, actualDependencyUsageMap.get( project1 ) ); + assertEquals( expectedDependencyUsageMap, actualDependencyUsageMap ); } public void testJarWithXmlTransitiveDependency() @@ -347,10 +360,12 @@ public void testMultimoduleProject() Map> actualDependencyUsageMap = actualAnalysis.getUsedDeclaredArtifactToUsageMap(); - Set expectedTestModule1Usage = - Collections.singleton( new DependencyUsage( "foo.Main", "bar.Main" ) ); + Map> expectedDependencyUsageMap = + new HashMap>(); + expectedDependencyUsageMap.put( junit, createDependencyUsage( + "foo.Main", "bar.Main" ) ); - assertEquals( expectedTestModule1Usage, actualDependencyUsageMap.get( junit ) ); + assertEquals( expectedDependencyUsageMap, actualDependencyUsageMap ); } // private methods -------------------------------------------------------- @@ -393,4 +408,8 @@ private Artifact createArtifact( String groupId, String artifactId, String type, return new DefaultArtifact( groupId, artifactId, versionRange, scope, type, null, handler ); } + + private Set createDependencyUsage( String dependencyClass, String usedBy ) { + return Collections.singleton( new DependencyUsage( dependencyClass, usedBy ) ); + } }