You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ma...@apache.org on 2007/07/02 17:51:51 UTC
svn commit: r552517 - in /maven/plugins/trunk/maven-dependency-plugin:
pom.xml src/main/java/org/apache/maven/plugin/dependency/TreeMojo.java
Author: markh
Date: Mon Jul 2 08:51:50 2007
New Revision: 552517
URL: http://svn.apache.org/viewvc?view=rev&rev=552517
Log:
o Moved maven-dependency-tree to 1.1-SNAPSHOT for node states, visitors and filters
o Updated to use SerializingDependencyNodeVisitor for serialization
o Added various new parameters to dependency:tree to support:
- scope filtering
- node state filtering
- artifact includes/excludes filtering
Modified:
maven/plugins/trunk/maven-dependency-plugin/pom.xml
maven/plugins/trunk/maven-dependency-plugin/src/main/java/org/apache/maven/plugin/dependency/TreeMojo.java
Modified: maven/plugins/trunk/maven-dependency-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-dependency-plugin/pom.xml?view=diff&rev=552517&r1=552516&r2=552517
==============================================================================
--- maven/plugins/trunk/maven-dependency-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-dependency-plugin/pom.xml Mon Jul 2 08:51:50 2007
@@ -179,7 +179,12 @@
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-dependency-tree</artifactId>
- <version>1.0</version>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-common-artifact-filters</artifactId>
+ <version>1.0-alpha-2-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Modified: maven/plugins/trunk/maven-dependency-plugin/src/main/java/org/apache/maven/plugin/dependency/TreeMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-dependency-plugin/src/main/java/org/apache/maven/plugin/dependency/TreeMojo.java?view=diff&rev=552517&r1=552516&r2=552517
==============================================================================
--- maven/plugins/trunk/maven-dependency-plugin/src/main/java/org/apache/maven/plugin/dependency/TreeMojo.java (original)
+++ maven/plugins/trunk/maven-dependency-plugin/src/main/java/org/apache/maven/plugin/dependency/TreeMojo.java Mon Jul 2 08:51:50 2007
@@ -24,20 +24,37 @@
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
-import java.util.Iterator;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.artifact.filter.StrictPatternExcludesArtifactFilter;
+import org.apache.maven.shared.artifact.filter.StrictPatternIncludesArtifactFilter;
import org.apache.maven.shared.dependency.tree.DependencyNode;
-import org.apache.maven.shared.dependency.tree.DependencyTree;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+import org.apache.maven.shared.dependency.tree.filter.AncestorOrSelfDependencyNodeFilter;
+import org.apache.maven.shared.dependency.tree.filter.AndDependencyNodeFilter;
+import org.apache.maven.shared.dependency.tree.filter.ArtifactDependencyNodeFilter;
+import org.apache.maven.shared.dependency.tree.filter.DependencyNodeFilter;
+import org.apache.maven.shared.dependency.tree.filter.StateDependencyNodeFilter;
+import org.apache.maven.shared.dependency.tree.traversal.BuildingDependencyNodeVisitor;
+import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor;
+import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+import org.apache.maven.shared.dependency.tree.traversal.FilteringDependencyNodeVisitor;
+import org.apache.maven.shared.dependency.tree.traversal.SerializingDependencyNodeVisitor;
+import org.apache.maven.shared.dependency.tree.traversal.SerializingDependencyNodeVisitor.TreeTokens;
/**
* Displays the dependency tree for this project.
@@ -50,18 +67,6 @@
*/
public class TreeMojo extends AbstractMojo
{
- // constants --------------------------------------------------------------
-
- /**
- * The indentation string to use when serialising the dependency tree.
- */
- private static final String INDENT = " ";
-
- /**
- * The newline string to use when serialising the dependency tree.
- */
- private static final String NEWLINE = System.getProperty( "line.separator" );
-
// fields -----------------------------------------------------------------
/**
@@ -126,6 +131,54 @@
*/
private File output;
+ /**
+ * The computed dependency tree root node of the Maven project.
+ */
+ private DependencyNode rootNode;
+
+ /**
+ * The scope to filter by when resolving the dependency tree, or <code>null</code> to include dependencies from
+ * all scopes.
+ *
+ * @parameter expression="${scope}"
+ */
+ private String scope;
+
+ /**
+ * Whether to include omitted nodes in the serialized dependency tree.
+ *
+ * @parameter expression="${verbose}" default-value="false"
+ */
+ private boolean verbose;
+
+ /**
+ * The token set name to use when outputting the dependency tree. Possible values are <code>whitespace</code>,
+ * <code>standard</code> or <code>extended</code>, which use whitespace, standard or extended ASCII sets
+ * respectively.
+ *
+ * @parameter expression="${tokens}" default-value="standard"
+ */
+ private String tokens;
+
+ /**
+ * A comma-separated list of artifacts to filter the serialized dependency tree by, or <code>null</code> not to
+ * filter the dependency tree. The artifact syntax is defined by <code>StrictPatternIncludesArtifactFilter</code>.
+ *
+ * @see StrictPatternIncludesArtifactFilter
+ * @parameter expression="${includes}"
+ */
+ private String includes;
+
+ /**
+ * A comma-separated list of artifacts to filter from the serialized dependency tree, or <code>null</code> not to
+ * filter any artifacts from the dependency tree. The artifact syntax is defined by
+ * <code>StrictPatternExcludesArtifactFilter</code>.
+ *
+ * @see StrictPatternExcludesArtifactFilter
+ * @parameter expression="${excludes}"
+ */
+ private String excludes;
+
// Mojo methods -----------------------------------------------------------
/*
@@ -133,13 +186,16 @@
*/
public void execute() throws MojoExecutionException, MojoFailureException
{
+ ArtifactFilter artifactFilter = createResolvingArtifactFilter();
+
try
{
- DependencyTree dependencyTree =
+ // TODO: fix DependencyTreeBuilder to apply filter
+ rootNode =
dependencyTreeBuilder.buildDependencyTree( project, localRepository, artifactFactory,
- artifactMetadataSource, artifactCollector );
+ artifactMetadataSource, artifactFilter, artifactCollector );
- String dependencyTreeString = serialiseDependencyTree( dependencyTree );
+ String dependencyTreeString = serialiseDependencyTree( rootNode );
if ( output != null )
{
@@ -162,51 +218,159 @@
}
}
+ // public methods ---------------------------------------------------------
+
+ /**
+ * Gets the Maven project used by this mojo.
+ *
+ * @return the Maven project
+ */
+ public MavenProject getProject()
+ {
+ return project;
+ }
+
+ /**
+ * Gets the computed dependency tree root node for the Maven project.
+ *
+ * @return the dependency tree root node
+ */
+ public DependencyNode getDependencyTree()
+ {
+ return rootNode;
+ }
+
// private methods --------------------------------------------------------
/**
+ * Gets the artifact filter to use when resolving the dependency tree.
+ *
+ * @return the artifact filter
+ */
+ private ArtifactFilter createResolvingArtifactFilter()
+ {
+ ArtifactFilter filter;
+
+ // filter scope
+ if ( scope != null )
+ {
+ getLog().debug( "+ Resolving dependency tree for scope '" + scope + "'" );
+
+ filter = new ScopeArtifactFilter( scope );
+ }
+ else
+ {
+ filter = null;
+ }
+
+ return filter;
+ }
+
+ /**
* Serialises the specified dependency tree to a string.
*
- * @param tree
- * the dependency tree to serialise
+ * @param rootNode
+ * the dependency tree root node to serialise
* @return the serialised dependency tree
*/
- private String serialiseDependencyTree( DependencyTree tree )
+ private String serialiseDependencyTree( DependencyNode rootNode )
{
- StringBuffer buffer = new StringBuffer();
+ StringWriter writer = new StringWriter();
+ TreeTokens treeTokens = toTreeTokens( tokens );
+
+ DependencyNodeVisitor visitor = new SerializingDependencyNodeVisitor( writer, treeTokens );
- serialiseDependencyNode( tree.getRootNode(), buffer );
+ // TODO: remove the need for this when the serializer can calculate last nodes from visitor calls only
+ visitor = new BuildingDependencyNodeVisitor( visitor );
+
+ DependencyNodeFilter filter = createDependencyNodeFilter();
+
+ if ( filter != null )
+ {
+ CollectingDependencyNodeVisitor collectingVisitor = new CollectingDependencyNodeVisitor();
+ DependencyNodeVisitor firstPassVisitor = new FilteringDependencyNodeVisitor( collectingVisitor, filter );
+ rootNode.accept( firstPassVisitor );
- return buffer.toString();
+ DependencyNodeFilter secondPassFilter = new AncestorOrSelfDependencyNodeFilter( collectingVisitor.getNodes() );
+ visitor = new FilteringDependencyNodeVisitor( visitor, secondPassFilter );
+ }
+
+ rootNode.accept( visitor );
+
+ return writer.toString();
}
/**
- * Serialises the specified dependency node and it's children to the specified string buffer.
+ * Gets the tree tokens instance for the specified name.
*
- * @param node
- * the dependency node to log
- * @param buffer
- * the string buffer to serialise to
+ * @param tokens
+ * the tree tokens name
+ * @return the <code>TreeTokens</code> instance
*/
- private void serialiseDependencyNode( DependencyNode node, StringBuffer buffer )
+ private TreeTokens toTreeTokens( String tokens )
{
- // serialise node
+ TreeTokens treeTokens;
- for ( int i = 0; i < node.getDepth(); i++ )
+ if ( "whitespace".equals( tokens ) )
{
- buffer.append( INDENT );
+ getLog().debug( "+ Using whitespace tree tokens" );
+
+ treeTokens = SerializingDependencyNodeVisitor.WHITESPACE_TOKENS;
}
+ else if ( "extended".equals( tokens ) )
+ {
+ getLog().debug( "+ Using extended tree tokens" );
- buffer.append( node.getArtifact() ).append( NEWLINE );
+ treeTokens = SerializingDependencyNodeVisitor.EXTENDED_TOKENS;
+ }
+ else
+ {
+ treeTokens = SerializingDependencyNodeVisitor.STANDARD_TOKENS;
+ }
- // serialise children
+ return treeTokens;
+ }
- for ( Iterator iterator = node.getChildren().iterator(); iterator.hasNext(); )
+ /**
+ * Gets the dependency node filter to use when serializing the dependency tree.
+ *
+ * @return the dependency node filter, or <code>null</code> if none required
+ */
+ private DependencyNodeFilter createDependencyNodeFilter()
+ {
+ List filters = new ArrayList();
+
+ // filter node states
+ if ( !verbose )
{
- DependencyNode child = (DependencyNode) iterator.next();
+ getLog().debug( "+ Filtering omitted nodes from dependency tree" );
- serialiseDependencyNode( child, buffer );
+ filters.add( StateDependencyNodeFilter.INCLUDED );
}
+
+ // filter includes
+ if ( includes != null )
+ {
+ List patterns = Arrays.asList( includes.split( "," ) );
+
+ getLog().debug( "+ Filtering dependency tree by artifact include patterns: " + patterns );
+
+ ArtifactFilter artifactFilter = new StrictPatternIncludesArtifactFilter( patterns );
+ filters.add( new ArtifactDependencyNodeFilter( artifactFilter ) );
+ }
+
+ // filter excludes
+ if ( excludes != null )
+ {
+ List patterns = Arrays.asList( excludes.split( "," ) );
+
+ getLog().debug( "+ Filtering dependency tree by artifact exclude patterns: " + patterns );
+
+ ArtifactFilter artifactFilter = new StrictPatternExcludesArtifactFilter( patterns );
+ filters.add( new ArtifactDependencyNodeFilter( artifactFilter ) );
+ }
+
+ return filters.isEmpty() ? null : new AndDependencyNodeFilter( filters );
}
/**
@@ -265,7 +429,7 @@
{
getLog().info( line );
}
-
+
reader.close();
}
}