maven-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From micha...@apache.org
Subject svn commit: r1601206 [1/2] - in /maven/plugins/trunk/maven-project-info-reports-plugin: ./ src/main/java/org/apache/maven/report/projectinfo/ src/main/java/org/apache/maven/report/projectinfo/dependencies/ src/main/resources/ src/test/java/org/apache/m...
Date Sun, 08 Jun 2014 09:44:14 GMT
Author: michaelo
Date: Sun Jun  8 09:44:13 2014
New Revision: 1601206

URL: http://svn.apache.org/r1601206
Log:
[MPIR-295] Enhancements on dependency convergence report

Submitted by: Simon Wang <wangyf2010@gmail.com>
From: https://github.com/apache/maven-plugins/pull/23

Added:
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java   (with props)
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java   (with props)
Modified:
    maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependencyConvergenceReport.java
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_cs.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_de.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_es.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_fr.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_gl.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_hu.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ja.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ko.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_lt.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_no.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt_BR.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ru.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sk.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sv.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_tr.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_zh_CN.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_zh_TW.properties
    maven/plugins/trunk/maven-project-info-reports-plugin/src/test/java/org/apache/maven/report/projectinfo/DependencyConvergenceReportTest.java

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/pom.xml Sun Jun  8 09:44:13 2014
@@ -85,6 +85,10 @@ under the License.
     <contributor>
       <name>Gabriel Belingueres</name>
     </contributor>
+    <contributor>
+      <name>Simon Wang</name>
+      <email>wangyf2010@gmail.com</email>
+    </contributor>
   </contributors>
 
   <prerequisites>
@@ -186,6 +190,11 @@ under the License.
       <artifactId>maven-plugin-annotations</artifactId>
       <scope>provided</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-common-artifact-filters</artifactId>
+      <version>1.4</version>
+    </dependency>
 
     <!-- Wagon -->
     <dependency>

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependencyConvergenceReport.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependencyConvergenceReport.java?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependencyConvergenceReport.java (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/DependencyConvergenceReport.java Sun Jun  8 09:44:13 2014
@@ -19,30 +19,54 @@ package org.apache.maven.report.projecti
  * under the License.
  */
 
-import org.apache.maven.doxia.sink.Sink;
-import org.apache.maven.doxia.sink.SinkEventAttributeSet;
-import org.apache.maven.doxia.sink.SinkEventAttributes;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.reporting.MavenReportException;
-import org.codehaus.plexus.util.StringUtils;
-
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeMap;
 
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.sink.SinkEventAttributeSet;
+import org.apache.maven.doxia.sink.SinkEventAttributes;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.report.projectinfo.dependencies.DependencyVersionMap;
+import org.apache.maven.report.projectinfo.dependencies.SinkSerializingDependencyNodeVisitor;
+import org.apache.maven.reporting.MavenReportException;
+import org.apache.maven.shared.artifact.filter.StrictPatternIncludesArtifactFilter;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+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.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;
+
 /**
  * Generates the Dependency Convergence report for reactor builds.
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton </a>
+ * @author <a href="mailto:wangyf2010@gmail.com">Simon Wang </a>
  * @version $Id$
  * @since 2.0
  */
@@ -57,12 +81,40 @@ public class DependencyConvergenceReport
     // ----------------------------------------------------------------------
 
     /**
-     * The projects in the current build. The effective-POM for
-     * each of these projects will written.
+     * The projects in the current build. The effective POM for each of these projects will written.
      */
     @Parameter( property = "reactorProjects", required = true, readonly = true )
     private List<MavenProject> reactorProjects;
 
+    /**
+     * Dependency tree builder, will use it to build dependency tree.
+     */
+    @Component
+    DependencyTreeBuilder dependencyTreeBuilder;
+
+    /**
+     * Use it to build dependency(artifact) tree
+     */
+    @Component
+    ArtifactFactory factory;
+
+    /**
+     * Use it to get artifact metadata source for dependency tree building.
+     */
+    @Component
+    ArtifactMetadataSource metadataSource;
+
+    /**
+     * Artifact collector - takes a set of original artifacts and resolves all of the best versions to use along with
+     * their metadata.
+     */
+    @Component
+    ArtifactCollector collector;
+
+    ArtifactFilter filter = null;
+
+    private Map<MavenProject, DependencyNode> projectMap = new HashMap<MavenProject, DependencyNode>();
+
     // ----------------------------------------------------------------------
     // Public methods
     // ----------------------------------------------------------------------
@@ -82,8 +134,8 @@ public class DependencyConvergenceReport
     @Override
     public boolean canGenerateReport()
     {
-        // only generate the convergency report if we are running a reactor build
-        return reactorProjects.size() > 1;
+        // should generate the convergency report, even its single maven project.
+        return reactorProjects.size() >= 1;
     }
 
     // ----------------------------------------------------------------------
@@ -98,7 +150,16 @@ public class DependencyConvergenceReport
 
         sink.head();
         sink.title();
-        sink.text( getI18nString( locale, "title" ) );
+
+        if ( isReactorBuild() )
+        {
+            sink.text( getI18nString( locale, "reactor.title" ) );
+        }
+        else
+        {
+            sink.text( getI18nString( locale, "title" ) );
+        }
+
         sink.title_();
         sink.head_();
 
@@ -107,10 +168,19 @@ public class DependencyConvergenceReport
         sink.section1();
 
         sink.sectionTitle1();
-        sink.text( getI18nString( locale, "title" ) );
+
+        if ( isReactorBuild() )
+        {
+            sink.text( getI18nString( locale, "reactor.title" ) );
+        }
+        else
+        {
+            sink.text( getI18nString( locale, "title" ) );
+        }
+
         sink.sectionTitle1_();
 
-        Map<String, List<ReverseDependencyLink>> dependencyMap = getDependencyMap();
+        DependencyAnalyzeResult dependencyResult = analyzeDependencyTree();
 
         // legend
         generateLegend( locale, sink );
@@ -118,12 +188,12 @@ public class DependencyConvergenceReport
         sink.lineBreak();
 
         // stats
-        generateStats( locale, sink, dependencyMap );
+        generateStats( locale, sink, dependencyResult );
 
         sink.section1_();
 
         // convergence
-        generateConvergence( locale, sink, dependencyMap );
+        generateConvergence( locale, sink, dependencyResult );
 
         sink.body_();
         sink.flush();
@@ -135,21 +205,73 @@ public class DependencyConvergenceReport
     // ----------------------------------------------------------------------
 
     /**
+     * Get snapshots dependencies from all dependency map.
+     *
+     * @param dependencyMap
+     * @return snapshots dependencies
+     */
+    private List<ReverseDependencyLink> getSnapshotDependencies( Map<String, List<ReverseDependencyLink>> dependencyMap )
+    {
+        List<ReverseDependencyLink> snapshots = new ArrayList<ReverseDependencyLink>();
+        for ( Map.Entry<String, List<ReverseDependencyLink>> entry : dependencyMap.entrySet() )
+        {
+            List<ReverseDependencyLink> depList = entry.getValue();
+            Map<String, List<ReverseDependencyLink>> artifactMap = getSortedUniqueArtifactMap( depList );
+            for ( Map.Entry<String, List<ReverseDependencyLink>> artEntry : artifactMap.entrySet() )
+            {
+                String version = artEntry.getKey();
+                boolean isReactorProject = false;
+
+                Iterator<ReverseDependencyLink> iterator = artEntry.getValue().iterator();
+                // It if enough to check just the first dependency here, because
+                // the dependency is the same in all the RDLs in the List. It's the
+                // reactorProjects that are different.
+                ReverseDependencyLink rdl = null;
+                if ( iterator.hasNext() )
+                {
+                    rdl = iterator.next();
+                    if ( isReactorProject( rdl.getDependency() ) )
+                    {
+                        isReactorProject = true;
+                    }
+                }
+
+                if ( version.endsWith( "-SNAPSHOT" ) && !isReactorProject && rdl != null )
+                {
+                    snapshots.add( rdl );
+                }
+            }
+        }
+
+        return snapshots;
+    }
+
+    /**
      * Generate the convergence table for all dependencies
      *
      * @param locale
      * @param sink
-     * @param dependencyMap
+     * @param conflictingDependencyMap
      */
-    private void generateConvergence( Locale locale, Sink sink, Map<String, List<ReverseDependencyLink>> dependencyMap )
+    private void generateConvergence( Locale locale, Sink sink, DependencyAnalyzeResult result )
     {
         sink.section2();
 
         sink.sectionTitle2();
-        sink.text( getI18nString( locale, "convergence.caption" ) );
+
+        if ( isReactorBuild() )
+        {
+            sink.text( getI18nString( locale, "convergence.caption" ) );
+        }
+        else
+        {
+            sink.text( getI18nString( locale, "convergence.single.caption" ) );
+        }
+
         sink.sectionTitle2_();
 
-        for ( Map.Entry<String, List<ReverseDependencyLink>> entry : dependencyMap.entrySet() )
+        // print conflicting dependencies
+        for ( Map.Entry<String, List<ReverseDependencyLink>> entry : result.getConflicting().entrySet() )
         {
             String key = entry.getKey();
             List<ReverseDependencyLink> depList = entry.getValue();
@@ -164,6 +286,24 @@ public class DependencyConvergenceReport
             sink.section3_();
         }
 
+        // print out snapshots jars
+        for ( ReverseDependencyLink dependencyLink : result.getSnapshots() )
+        {
+            sink.section3();
+            sink.sectionTitle3();
+
+            Dependency dep = dependencyLink.getDependency();
+
+            sink.text( dep.getGroupId() + ":" + dep.getArtifactId() );
+            sink.sectionTitle3_();
+
+            List<ReverseDependencyLink> depList = new ArrayList<ReverseDependencyLink>();
+            depList.add( dependencyLink );
+            generateDependencyDetails( sink, depList );
+
+            sink.section3_();
+        }
+
         sink.section2_();
     }
 
@@ -181,15 +321,10 @@ public class DependencyConvergenceReport
 
         sink.tableRow();
 
-        sink.tableCell( );
-        if ( artifactMap.size() > 1 )
-        {
-            iconError( sink );
-        }
-        else
-        {
-            iconSuccess( sink );
-        }
+        sink.tableCell();
+
+        iconError( sink );
+
         sink.tableCell_();
 
         sink.tableCell();
@@ -199,7 +334,7 @@ public class DependencyConvergenceReport
         for ( String version : artifactMap.keySet() )
         {
             sink.tableRow();
-            sink.tableCell( new SinkEventAttributeSet( new String[] {SinkEventAttributes.WIDTH, "25%"} ) );
+            sink.tableCell( new SinkEventAttributeSet( new String[] { SinkEventAttributes.WIDTH, "25%" } ) );
             sink.text( version );
             sink.tableCell_();
 
@@ -217,35 +352,134 @@ public class DependencyConvergenceReport
         sink.table_();
     }
 
-    private void generateVersionDetails( Sink sink, Map<String, List<ReverseDependencyLink>> artifactMap,
-                                         String version )
+    /**
+     * Generate version details for a given dependency
+     *
+     * @param sink
+     * @param artifactMap
+     * @param version
+     */
+    private void generateVersionDetails( Sink sink, Map<String, List<ReverseDependencyLink>> artifactMap, String version )
     {
-        sink.numberedList( 1 ); // Use lower alpha numbering
+        sink.numberedList( 0 ); // Use lower alpha numbering
         List<ReverseDependencyLink> depList = artifactMap.get( version );
-        Collections.sort( depList, new ReverseDependencyLinkComparator() );
 
-        for ( ReverseDependencyLink rdl : depList )
+        List<DependencyNode> projectNodes = getProjectNodes( depList );
+
+        if (projectNodes == null || projectNodes.size() == 0){
+            getLog().warn( "Can't find project nodes for dependency list: " + depList.get( 0 ).getDependency() );
+            return;
+        }
+        Collections.sort( projectNodes, new DependencyNodeComparator() );
+
+        for ( DependencyNode projectNode : projectNodes )
         {
-            sink.numberedListItem();
-            if ( StringUtils.isNotEmpty( rdl.project.getUrl() ) )
-            {
-                sink.link( rdl.project.getUrl() );
+            if (isReactorBuild()){
+                sink.numberedListItem();
             }
-            sink.text( rdl.project.getGroupId() + ":" + rdl.project.getArtifactId() );
-            if ( StringUtils.isNotEmpty( rdl.project.getUrl() ) )
-            {
-                sink.link_();
+
+            showVersionDetails( projectNode, depList, sink );
+
+            if (isReactorBuild()){
+                sink.numberedListItem_();
             }
-            sink.numberedListItem_();
+
+            sink.lineBreak();
         }
+
         sink.numberedList_();
     }
 
+    private List<DependencyNode> getProjectNodes( List<ReverseDependencyLink> depList )
+    {
+        List<DependencyNode> projectNodes = new ArrayList<DependencyNode>();
+
+        for ( ReverseDependencyLink depLink : depList )
+        {
+            MavenProject project = depLink.getProject();
+            DependencyNode projectNode = this.projectMap.get( project );
+
+            if ( projectNode != null && !projectNodes.contains( projectNode ))
+            {
+                projectNodes.add( projectNode );
+            }
+        }
+        return projectNodes;
+    }
+
+    private void showVersionDetails( DependencyNode projectNode, List<ReverseDependencyLink> depList, Sink sink )
+    {
+        if (depList == null || depList.isEmpty() ){
+            return;
+        }
+
+        Dependency dependency = depList.get( 0 ).getDependency();
+        String key = dependency.getGroupId() + ":" + dependency.getArtifactId() + ":" + dependency.getType() + ":" + dependency.getVersion();
+
+        serializeDependencyTree(projectNode, key, sink);
+
+    }
+
+    /**
+     * Serializes the specified dependency tree to a string.
+     *
+     * @param rootNode the dependency tree root node to serialize
+     * @return the serialized dependency tree
+     */
+    private void serializeDependencyTree( DependencyNode rootNode, String key, Sink sink )
+    {
+        DependencyNodeVisitor visitor = getSerializingDependencyNodeVisitor( sink );
+
+        visitor = new BuildingDependencyNodeVisitor( visitor );
+
+        DependencyNodeFilter filter = createDependencyNodeFilter(key);
+
+        if ( filter != null )
+        {
+            CollectingDependencyNodeVisitor collectingVisitor = new CollectingDependencyNodeVisitor();
+            DependencyNodeVisitor firstPassVisitor = new FilteringDependencyNodeVisitor( collectingVisitor, filter );
+            rootNode.accept( firstPassVisitor );
+
+            DependencyNodeFilter secondPassFilter =
+                new AncestorOrSelfDependencyNodeFilter( collectingVisitor.getNodes() );
+            visitor = new FilteringDependencyNodeVisitor( visitor, secondPassFilter );
+        }
+
+        rootNode.accept( visitor );
+    }
+
+    /**
+     * Gets the dependency node filter to use when serializing the dependency graph.
+     *
+     * @return the dependency node filter, or <code>null</code> if none required
+     */
+    private DependencyNodeFilter createDependencyNodeFilter(String includes)
+    {
+        List<DependencyNodeFilter> filters = new ArrayList<DependencyNodeFilter>();
+
+        // filter includes
+        if ( includes != null )
+        {
+            List<String> 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 ) );
+        }
+
+        return filters.isEmpty() ? null : new AndDependencyNodeFilter( filters );
+    }
+
+    public DependencyNodeVisitor getSerializingDependencyNodeVisitor( Sink sink )
+    {
+        return new SinkSerializingDependencyNodeVisitor( sink );
+    }
+
     /**
-     * Produce a Map of relationships between dependencies (its version) and
-     * reactor projects.
+     * Produce a Map of relationships between dependencies (its version) and reactor projects. This is the structure of
+     * the Map:
      *
-     * This is the structure of the Map:
      * <pre>
      * +--------------------+----------------------------------+
      * | key                | value                            |
@@ -296,18 +530,7 @@ public class DependencyConvergenceReport
 
         sink.tableRow();
 
-        sink.tableCell( );
-        iconSuccess( sink );
-        sink.tableCell_();
         sink.tableCell();
-        sink.text( getI18nString( locale, "legend.shared" ) );
-        sink.tableCell_();
-
-        sink.tableRow_();
-
-        sink.tableRow();
-
-        sink.tableCell( );
         iconError( sink );
         sink.tableCell_();
         sink.tableCell();
@@ -326,18 +549,13 @@ public class DependencyConvergenceReport
      * @param sink
      * @param dependencyMap
      */
-    private void generateStats( Locale locale, Sink sink, Map<String, List<ReverseDependencyLink>> dependencyMap )
+    private void generateStats( Locale locale, Sink sink, DependencyAnalyzeResult result )
     {
-        int depCount = dependencyMap.size();
-        int artifactCount = 0;
-        int snapshotCount = 0;
+        int depCount = result.getDependencyCount();
 
-        for ( List<ReverseDependencyLink> depList : dependencyMap.values() )
-        {
-            Map<String, List<ReverseDependencyLink>> artifactMap = getSortedUniqueArtifactMap( depList );
-            snapshotCount += countSnapshots( artifactMap );
-            artifactCount += artifactMap.size();
-        }
+        int artifactCount = result.getArtifactCount();
+        int snapshotCount = result.getSnapshotCount();
+        int conflictingCount = result.getConflictingCount();
 
         int convergence = (int) ( ( (double) depCount / (double) artifactCount ) * PERCENTAGE );
 
@@ -349,35 +567,47 @@ public class DependencyConvergenceReport
         sink.bold_();
         sink.tableCaption_();
 
+        if ( isReactorBuild() )
+        {
+            sink.tableRow();
+            sink.tableHeaderCell();
+            sink.text( getI18nString( locale, "stats.modules" ) );
+            sink.tableHeaderCell_();
+            sink.tableCell();
+            sink.text( String.valueOf( reactorProjects.size() ) );
+            sink.tableCell_();
+            sink.tableRow_();
+        }
+
         sink.tableRow();
-        sink.tableHeaderCell( );
-        sink.text( getI18nString( locale, "stats.subprojects" ) );
+        sink.tableHeaderCell();
+        sink.text( getI18nString( locale, "stats.dependencies" ) );
         sink.tableHeaderCell_();
         sink.tableCell();
-        sink.text( String.valueOf( reactorProjects.size() ) );
+        sink.text( String.valueOf( depCount ) );
         sink.tableCell_();
         sink.tableRow_();
 
         sink.tableRow();
-        sink.tableHeaderCell( );
-        sink.text( getI18nString( locale, "stats.dependencies" ) );
+        sink.tableHeaderCell();
+        sink.text( getI18nString( locale, "stats.artifacts" ) );
         sink.tableHeaderCell_();
         sink.tableCell();
-        sink.text( String.valueOf( depCount ) );
+        sink.text( String.valueOf( artifactCount ) );
         sink.tableCell_();
         sink.tableRow_();
 
         sink.tableRow();
-        sink.tableHeaderCell( );
-        sink.text( getI18nString( locale, "stats.artifacts" ) );
+        sink.tableHeaderCell();
+        sink.text( getI18nString( locale, "stats.conflicting" ) );
         sink.tableHeaderCell_();
         sink.tableCell();
-        sink.text( String.valueOf( artifactCount ) );
+        sink.text( String.valueOf( conflictingCount ) );
         sink.tableCell_();
         sink.tableRow_();
 
         sink.tableRow();
-        sink.tableHeaderCell( );
+        sink.tableHeaderCell();
         sink.text( getI18nString( locale, "stats.snapshots" ) );
         sink.tableHeaderCell_();
         sink.tableCell();
@@ -386,7 +616,7 @@ public class DependencyConvergenceReport
         sink.tableRow_();
 
         sink.tableRow();
-        sink.tableHeaderCell( );
+        sink.tableHeaderCell();
         sink.text( getI18nString( locale, "stats.convergence" ) );
         sink.tableHeaderCell_();
         sink.tableCell();
@@ -400,13 +630,13 @@ public class DependencyConvergenceReport
         }
         sink.nonBreakingSpace();
         sink.bold();
-        sink.text( String.valueOf( convergence ) + "%" );
+        sink.text( String.valueOf( convergence ) + " %" );
         sink.bold_();
         sink.tableCell_();
         sink.tableRow_();
 
         sink.tableRow();
-        sink.tableHeaderCell( );
+        sink.tableHeaderCell();
         sink.text( getI18nString( locale, "stats.readyrelease" ) );
         sink.tableHeaderCell_();
         sink.tableCell();
@@ -442,35 +672,6 @@ public class DependencyConvergenceReport
         sink.table_();
     }
 
-    private int countSnapshots( Map<String, List<ReverseDependencyLink>> artifactMap )
-    {
-        int count = 0;
-        for ( Map.Entry<String, List<ReverseDependencyLink>> entry : artifactMap.entrySet() )
-        {
-            String version = entry.getKey();
-            boolean isReactorProject = false;
-
-            Iterator<ReverseDependencyLink> iterator = entry.getValue().iterator();
-            // It if enough to check just the first dependency here, because
-            // the dependency is the same in all the RDLs in the List. It's the
-            // reactorProjects that are different.
-            if ( iterator.hasNext() )
-            {
-                ReverseDependencyLink rdl = iterator.next();
-                if ( isReactorProject( rdl.getDependency() ) )
-                {
-                    isReactorProject = true;
-                }
-            }
-
-            if ( version.endsWith( "-SNAPSHOT" ) && !isReactorProject )
-            {
-                count++;
-            }
-        }
-        return count;
-    }
-
     /**
      * Check to see if the specified dependency is among the reactor projects.
      *
@@ -494,6 +695,11 @@ public class DependencyConvergenceReport
         return false;
     }
 
+    private boolean isReactorBuild()
+    {
+        return this.reactorProjects.size() > 1;
+    }
+
     private void iconSuccess( Sink sink )
     {
         sink.figure();
@@ -515,42 +721,224 @@ public class DependencyConvergenceReport
     }
 
     /**
-     * Produce a Map of relationships between dependencies
-     * (its groupId:artifactId) and reactor projects.
+     * Produce a DependencyAnalyzeResult, it contains conflicting dependencies map, snapshot dependencies map and all dependencies map.
+     * Map structure is the relationships between dependencies (its groupId:artifactId) and reactor projects. This is the
+     * structure of the Map:
      *
-     * This is the structure of the Map:
      * <pre>
-     * +--------------------+----------------------------------+
-     * | key                | value                            |
-     * +--------------------+----------------------------------+
-     * | groupId:artifactId | A List of ReverseDependencyLinks |
-     * | of a dependency    | which each look like this:       |
-     * |                    | +------------+-----------------+ |
-     * |                    | | dependency | reactor project | |
-     * |                    | +------------+-----------------+ |
-     * +--------------------+----------------------------------+
+     * +--------------------+----------------------------------+---------------|
+     * | key                | value                                            |
+     * +--------------------+----------------------------------+---------------|
+     * | groupId:artifactId | A List of ReverseDependencyLinks                 |
+     * | of a dependency    | which each look like this:                       |
+     * |                    | +------------+-----------------+-----------------|
+     * |                    | | dependency | reactor project | dependency node |
+     * |                    | +------------+-----------------+-----------------|
+     * +--------------------+--------------------------------------------------|
      * </pre>
      *
-     * @return A Map of relationships between dependencies and reactor projects
+     * @return DependencyAnalyzeResult contains conflicting dependencies map, snapshot dependencies map and all dependencies map.
+     * @throws MavenReportException
      */
-    private Map<String, List<ReverseDependencyLink>> getDependencyMap()
+    private DependencyAnalyzeResult analyzeDependencyTree()
+        throws MavenReportException
     {
-        Map<String, List<ReverseDependencyLink>> dependencyMap = new TreeMap<String, List<ReverseDependencyLink>>();
+        Map<String, List<ReverseDependencyLink>> conflictingDependencyMap =
+            new TreeMap<String, List<ReverseDependencyLink>>();
+        Map<String, List<ReverseDependencyLink>> allDependencies = new TreeMap<String, List<ReverseDependencyLink>>();
 
         for ( MavenProject reactorProject : reactorProjects )
         {
-            for (Dependency dep : (Iterable<Dependency>) reactorProject.getDependencies()) {
-                String key = dep.getGroupId() + ":" + dep.getArtifactId();
-                List<ReverseDependencyLink> depList = dependencyMap.get(key);
-                if (depList == null) {
-                    depList = new ArrayList<ReverseDependencyLink>();
-                }
-                depList.add(new ReverseDependencyLink(dep, reactorProject));
-                dependencyMap.put(key, depList);
+            DependencyNode node = getNode( reactorProject );
+
+            this.projectMap.put( reactorProject, node );
+
+            getConflictingDependencyMap( conflictingDependencyMap, reactorProject, node );
+
+            getAllDependencyMap( allDependencies, reactorProject, node );
+        }
+
+        return populateDependencyAnalyzeResult( conflictingDependencyMap, allDependencies );
+    }
+
+    /**
+     * Produce DependencyAnalyzeResult base on conflicting dependencies map, all dependencies map.
+     *
+     * @param conflictingDependencyMap
+     * @param allDependencies
+     * @return DependencyAnalyzeResult contains conflicting dependencies map, snapshot dependencies map and all dependencies map.
+     */
+    private DependencyAnalyzeResult populateDependencyAnalyzeResult( Map<String, List<ReverseDependencyLink>> conflictingDependencyMap,
+                                                                     Map<String, List<ReverseDependencyLink>> allDependencies )
+    {
+        DependencyAnalyzeResult dependencyResult = new DependencyAnalyzeResult();
+
+        dependencyResult.setAll( allDependencies );
+        dependencyResult.setConflicting( conflictingDependencyMap );
+
+        List<ReverseDependencyLink> snapshots = getSnapshotDependencies( allDependencies );
+        dependencyResult.setSnapshots( snapshots );
+        return dependencyResult;
+    }
+
+    /**
+     * Get conflicting dependency map base on specified dependency node.
+     *
+     * @param conflictingDependencyMap
+     * @param reactorProject
+     * @param node
+     */
+    private void getConflictingDependencyMap( Map<String, List<ReverseDependencyLink>> conflictingDependencyMap,
+                                              MavenProject reactorProject, DependencyNode node )
+    {
+        DependencyVersionMap visitor = new DependencyVersionMap();
+        visitor.setUniqueVersions( true );
+
+        node.accept( visitor );
+
+        for ( List<DependencyNode> nodes : visitor.getConflictedVersionNumbers() )
+        {
+            DependencyNode dependencyNode = nodes.get( 0 );
+
+            String key = dependencyNode.getArtifact().getGroupId() + ":" + dependencyNode.getArtifact().getArtifactId();
+
+            List<ReverseDependencyLink> dependencyList = conflictingDependencyMap.get( key );
+            if ( dependencyList == null )
+            {
+                dependencyList = new ArrayList<ReverseDependencyLink>();
             }
+
+            dependencyList.add( new ReverseDependencyLink( toDependency( dependencyNode.getArtifact() ),
+                                                           reactorProject ) );
+
+            for ( DependencyNode workNode : nodes.subList( 1, nodes.size() ) )
+            {
+                dependencyList.add( new ReverseDependencyLink( toDependency( workNode.getArtifact() ), reactorProject) );
+            }
+
+            conflictingDependencyMap.put( key, dependencyList );
         }
+    }
+
+    /**
+     * Get all dependencies (both directive & transitive dependencies) by specified dependency node.
+     *
+     * @param allDependencies
+     * @param reactorProject
+     * @param node
+     */
+    private void getAllDependencyMap( Map<String, List<ReverseDependencyLink>> allDependencies,
+                                      MavenProject reactorProject, DependencyNode node )
+    {
+        Set<Artifact> artifacts = getAllDescendants( node );
 
-        return dependencyMap;
+        for ( Artifact art : artifacts )
+        {
+            String key = art.getGroupId() + ":" + art.getArtifactId();
+
+            List<ReverseDependencyLink> reverseDepependencies = allDependencies.get( key );
+            if ( reverseDepependencies == null )
+            {
+                reverseDepependencies = new ArrayList<ReverseDependencyLink>();
+            }
+
+            if ( !containsDependency( reverseDepependencies, art ) )
+            {
+                reverseDepependencies.add( new ReverseDependencyLink( toDependency( art ), reactorProject ) );
+            }
+
+            allDependencies.put( key, reverseDepependencies );
+        }
+    }
+
+    /**
+     * Convert Artifact to Dependency
+     *
+     * @param artifact
+     * @return Dependency object
+     */
+    private Dependency toDependency( Artifact artifact )
+    {
+        Dependency dependency = new Dependency();
+        dependency.setGroupId( artifact.getGroupId() );
+        dependency.setArtifactId( artifact.getArtifactId() );
+        dependency.setVersion( artifact.getVersion() );
+        dependency.setClassifier( artifact.getClassifier() );
+        dependency.setScope( artifact.getScope() );
+
+        return dependency;
+    }
+
+    /**
+     * To check whether dependency list contains a given artifact.
+     *
+     * @param reverseDependencies
+     * @param art
+     * @return contains:true; Not contains:false;
+     */
+    private boolean containsDependency( List<ReverseDependencyLink> reverseDependencies, Artifact art )
+    {
+
+        for ( ReverseDependencyLink revDependency : reverseDependencies )
+        {
+            Dependency dep = revDependency.getDependency();
+            if ( dep.getGroupId().equals( art.getGroupId() ) && dep.getArtifactId().equals( art.getArtifactId() )
+                && dep.getVersion().equals( art.getVersion() ) )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Get root node of dependency tree for a given project
+     *
+     * @param project
+     * @return root node of dependency tree
+     * @throws MavenReportException
+     */
+    private DependencyNode getNode( MavenProject project )
+        throws MavenReportException
+    {
+        try
+        {
+            DependencyNode node =
+                (DependencyNode) dependencyTreeBuilder.buildDependencyTree( project, localRepository, factory,
+                                                                            metadataSource, filter, collector );
+
+            return node;
+        }
+        catch ( DependencyTreeBuilderException e )
+        {
+            throw new MavenReportException( "Could not build dependency tree: " + e.getMessage(), e );
+        }
+    }
+
+    /**
+     * Get all descendants nodes for a given dependency node.
+     *
+     * @param node
+     * @return set of descendants artifacts.
+     */
+    private Set<Artifact> getAllDescendants( DependencyNode node )
+    {
+        Set<Artifact> children = null;
+        if ( node.getChildren() != null )
+        {
+            children = new HashSet<Artifact>();
+            for ( DependencyNode depNode : node.getChildren() )
+            {
+                children.add( depNode.getArtifact() );
+                Set<Artifact> subNodes = getAllDescendants( depNode );
+                if ( subNodes != null )
+                {
+                    children.addAll( subNodes );
+                }
+            }
+        }
+        return children;
     }
 
     /**
@@ -588,13 +976,78 @@ public class DependencyConvergenceReport
     /**
      * Internal ReverseDependencyLink comparator
      */
-    static class ReverseDependencyLinkComparator
-        implements Comparator<ReverseDependencyLink>
+    static class DependencyNodeComparator
+        implements Comparator<DependencyNode>
     {
         /** {@inheritDoc} */
-        public int compare( ReverseDependencyLink p1, ReverseDependencyLink p2 )
+        public int compare( DependencyNode p1, DependencyNode p2 )
         {
-            return p1.getProject().getId().compareTo( p2.getProject().getId() );
+            return p1.getArtifact().getId().compareTo( p2.getArtifact().getId() );
         }
     }
+
+    /**
+     * Internal object
+     */
+    private class DependencyAnalyzeResult
+    {
+        Map<String, List<ReverseDependencyLink>> all;
+
+        List<ReverseDependencyLink> snapshots;
+
+        Map<String, List<ReverseDependencyLink>> conflicting;
+
+        public void setAll( Map<String, List<ReverseDependencyLink>> all )
+        {
+            this.all = all;
+        }
+
+        public List<ReverseDependencyLink> getSnapshots()
+        {
+            return snapshots;
+        }
+
+        public void setSnapshots( List<ReverseDependencyLink> snapshots )
+        {
+            this.snapshots = snapshots;
+        }
+
+        public Map<String, List<ReverseDependencyLink>> getConflicting()
+        {
+            return conflicting;
+        }
+
+        public void setConflicting( Map<String, List<ReverseDependencyLink>> conflicting )
+        {
+            this.conflicting = conflicting;
+        }
+
+        public int getDependencyCount()
+        {
+            return all.size();
+        }
+
+        public int getSnapshotCount()
+        {
+            return this.snapshots.size();
+        }
+
+        public int getConflictingCount()
+        {
+            return this.conflicting.size();
+        }
+
+        public int getArtifactCount()
+        {
+            int artifactCount = 0;
+            for ( List<ReverseDependencyLink> depList : this.all.values() )
+            {
+                Map<String, List<ReverseDependencyLink>> artifactMap = getSortedUniqueArtifactMap( depList );
+                artifactCount += artifactMap.size();
+            }
+
+            return artifactCount;
+        }
+    }
+
 }

Added: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java?rev=1601206&view=auto
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java (added)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java Sun Jun  8 09:44:13 2014
@@ -0,0 +1,153 @@
+package org.apache.maven.report.projectinfo.dependencies;
+
+/*
+ * 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.
+ */
+/**
+ * @author Simon Wang
+ * @version $Id$
+ * @since 2.8
+ */
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+
+
+
+public class DependencyVersionMap implements DependencyNodeVisitor
+{
+    private boolean uniqueVersions;
+
+    private Map<String, List<DependencyNode>> idsToNode;
+
+    // ----------------------------------------------------------------------
+    // Public methods
+    // ----------------------------------------------------------------------
+
+    public DependencyVersionMap()
+    {
+        idsToNode = new HashMap<String, List<DependencyNode>>();
+    }
+
+    public void setUniqueVersions( boolean uniqueVersions )
+    {
+        this.uniqueVersions = uniqueVersions;
+    }
+
+    public boolean visit( DependencyNode node )
+    {
+        addDependency( node );
+        return !containsConflicts( node );
+    }
+
+    public boolean endVisit( DependencyNode node )
+    {
+        return true;
+    }
+
+    /**
+     * Get conflicting nodes groups
+     *
+     * @return conflicting nodes groups
+     */
+    public List<List<DependencyNode>> getConflictedVersionNumbers()
+    {
+        List<List<DependencyNode>> output = new ArrayList<List<DependencyNode>>();
+        for ( List<DependencyNode> nodes : idsToNode.values() )
+        {
+            if ( containsConflicts( nodes ) )
+            {
+                output.add( nodes );
+            }
+        }
+        return output;
+    }
+
+    // ----------------------------------------------------------------------
+    // Private methods
+    // ----------------------------------------------------------------------
+
+    private void addDependency( DependencyNode node )
+    {
+        String key = constructKey( node );
+        List<DependencyNode> nodes = idsToNode.get( key );
+        if ( nodes == null )
+        {
+            nodes = new ArrayList<DependencyNode>();
+            idsToNode.put( key, nodes );
+        }
+        nodes.add( node );
+    }
+
+    private String constructKey( DependencyNode node )
+    {
+        return constructKey( node.getArtifact() );
+    }
+
+    private String constructKey( Artifact artifact )
+    {
+        return artifact.getGroupId() + ":" + artifact.getArtifactId();
+    }
+
+    private String getVersion( Artifact artifact )
+    {
+        return uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
+    }
+
+    private boolean containsConflicts( DependencyNode node )
+    {
+        return containsConflicts( node.getArtifact() );
+    }
+
+    private boolean containsConflicts( Artifact artifact )
+    {
+        return containsConflicts( idsToNode.get( constructKey( artifact ) ) );
+    }
+
+    /**
+     * Check whether given dependency nodes contains conflicts
+     *
+     * @param nodes
+     * @return contains:true; not contains:false;
+     */
+    private boolean containsConflicts( List<DependencyNode> nodes )
+    {
+        String version = null;
+        for ( DependencyNode node : nodes )
+        {
+            if ( version == null )
+            {
+                version = getVersion( node.getArtifact() );
+            }
+            else
+            {
+                if ( version.compareTo( getVersion( node.getArtifact() ) ) != 0 )
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+}
\ No newline at end of file

Propchange: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/DependencyVersionMap.java
------------------------------------------------------------------------------
    svn:keywords = Id

Added: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java?rev=1601206&view=auto
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java (added)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java Sun Jun  8 09:44:13 2014
@@ -0,0 +1,212 @@
+package org.apache.maven.report.projectinfo.dependencies;
+
+/*
+ * 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.List;
+
+import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
+
+
+
+/**
+ * A dependency node visitor that serializes visited nodes to a sink writer.
+ * It's used to serialize tree in project information report page.
+ *
+ * @author <a href="mailto:wangyf2010@gmail.com">Simon Wang</a>
+ */
+public class SinkSerializingDependencyNodeVisitor
+    implements DependencyNodeVisitor
+{
+    // classes ----------------------------------------------------------------
+
+    /**
+     * Provides tokens to use when serializing the dependency tree.
+     */
+    private class TreeTokens
+    {
+        private final Sink sink;
+
+        public TreeTokens( Sink sink )
+        {
+            this.sink = sink;
+        }
+
+        public void addNodeIndent( boolean last )
+        {
+            if (last){
+                sink.text( "\\-" );
+                sink.nonBreakingSpace();
+            }else{
+                sink.text( "+-" );
+                sink.nonBreakingSpace();
+            }
+        }
+
+        public void fillIndent( boolean last )
+        {
+            if (last){
+                sink.nonBreakingSpace();
+                sink.nonBreakingSpace();
+                sink.nonBreakingSpace();
+            }else{
+                sink.text( "|" );
+                sink.nonBreakingSpace();
+                sink.nonBreakingSpace();
+            }
+        }
+    }
+
+    // fields -----------------------------------------------------------------
+
+    /**
+     * The writer to serialize to.
+     */
+    private final Sink sink;
+
+    /**
+     * The tokens to use when serializing the dependency tree.
+     */
+    private final TreeTokens tokens ;
+
+    /**
+     * The depth of the currently visited dependency node.
+     */
+    private int depth;
+
+    // constructors -----------------------------------------------------------
+
+    /**
+     * Creates a dependency node visitor that serializes visited nodes to the specified writer using the specified
+     * tokens.
+     *
+     * @param sink
+     *            the writer to serialize to
+     * @param tokens
+     *            the tokens to use when serializing the dependency tree
+     */
+    public SinkSerializingDependencyNodeVisitor( Sink sink )
+    {
+        this.sink = sink;
+        this.tokens = new TreeTokens(sink);
+        depth = 0;
+    }
+
+    // DependencyNodeVisitor methods ------------------------------------------
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean visit( DependencyNode node )
+    {
+        indent( node );
+
+        sink.text( node.toNodeString() );
+        sink.lineBreak();
+
+        depth++;
+
+        return true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean endVisit( DependencyNode node )
+    {
+        depth--;
+
+        return true;
+    }
+
+    // private methods --------------------------------------------------------
+
+    /**
+     * Writes the necessary tokens to indent the specified dependency node to this visitor's writer.
+     *
+     * @param node
+     *            the dependency node to indent
+     */
+    private void indent( DependencyNode node )
+    {
+        for ( int i = 1; i < depth; i++ )
+        {
+            tokens.fillIndent( isLast( node, i ) );
+        }
+
+        if ( depth > 0 )
+        {
+            tokens.addNodeIndent( isLast( node ) );
+        }
+    }
+
+    /**
+     * Gets whether the specified dependency node is the last of its siblings.
+     *
+     * @param node
+     *            the dependency node to check
+     * @return <code>true</code> if the specified dependency node is the last of its last siblings
+     */
+    private boolean isLast( DependencyNode node )
+    {
+        // TODO: remove node argument and calculate from visitor calls only
+
+        DependencyNode parent = node.getParent();
+
+        boolean last;
+
+        if ( parent == null )
+        {
+            last = true;
+        }
+        else
+        {
+            List<DependencyNode> siblings = parent.getChildren();
+
+            last = ( siblings.indexOf( node ) == siblings.size() - 1 );
+        }
+
+        return last;
+    }
+
+    /**
+     * Gets whether the specified dependency node ancestor is the last of its siblings.
+     *
+     * @param node
+     *            the dependency node whose ancestor to check
+     * @param ancestorDepth
+     *            the depth of the ancestor of the specified dependency node to check
+     * @return <code>true</code> if the specified dependency node ancestor is the last of its siblings
+     */
+    private boolean isLast( DependencyNode node, int ancestorDepth )
+    {
+        // TODO: remove node argument and calculate from visitor calls only
+
+        int distance = depth - ancestorDepth;
+
+        while ( distance-- > 0 )
+        {
+            node = node.getParent();
+        }
+
+        return isLast( node );
+    }
+}

Propchange: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/java/org/apache/maven/report/projectinfo/dependencies/SinkSerializingDependencyNodeVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report.properties Sun Jun  8 09:44:13 2014
@@ -96,24 +96,28 @@ report.dependencies.unamed              
 report.dependencies.transitive.intro                               = The following is a list of transitive dependencies for this project. Transitive dependencies are the dependencies of the project dependencies.
 report.dependencies.transitive.nolist                              = No transitive dependencies are required for this project.
 report.dependencies.transitive.title                               = Project Transitive Dependencies
-report.dependency-convergence.convergence.caption                  = Dependencies used in sub-projects
+report.dependency-convergence.convergence.caption                  = Dependencies used in modules
+report.dependency-convergence.convergence.single.caption           = Dependencies used in this project
 report.dependency-convergence.description                          = This document presents the convergence of dependency versions across the entire project, and its sub modules.
 report.dependency-convergence.legend                               = Legend:
-report.dependency-convergence.legend.different                     = At least one project has a differing version of the dependency.
-report.dependency-convergence.legend.shared                        = All projects share one version of the dependency.
+report.dependency-convergence.legend.different                     = At least one dependency has a differing version of the dependency or has SNAPSHOT dependencies.
+report.dependency-convergence.legend.shared                        = All modules/dependencies share one version of the dependency.
 report.dependency-convergence.name                                 = Dependency Convergence
+report.dependency-convergence.reactor.name                         = Reactor Dependency Convergence
+report.dependency-convergence.reactor.title                        = Reactor Dependency Convergence
 report.dependency-convergence.stats.artifacts                      = Number of unique artifacts (NOA):
 report.dependency-convergence.stats.caption                        = Statistics:
 report.dependency-convergence.stats.convergence                    = Convergence (NOD/NOA):
 report.dependency-convergence.stats.dependencies                   = Number of dependencies (NOD):
-report.dependency-convergence.stats.readyrelease                   = Ready for Release (100% Convergence and no SNAPSHOTS):
+report.dependency-convergence.stats.readyrelease                   = Ready for release (100 % convergence and no SNAPSHOTS):
 report.dependency-convergence.stats.readyrelease.error             = Error
-report.dependency-convergence.stats.readyrelease.error.convergence = You do not have 100% convergence.
+report.dependency-convergence.stats.readyrelease.error.convergence = You do not have 100 % convergence.
 report.dependency-convergence.stats.readyrelease.error.snapshots   = You have SNAPSHOT dependencies.
 report.dependency-convergence.stats.readyrelease.success           = Success
+report.dependency-convergence.stats.conflicting                    = Number of version-conflicting artifacts (NOC):
 report.dependency-convergence.stats.snapshots                      = Number of SNAPSHOT artifacts (NOS):
-report.dependency-convergence.stats.subprojects                    = Number of sub-projects:
-report.dependency-convergence.title                                = Reactor Dependency Convergence
+report.dependency-convergence.stats.modules                        = Number of modules:
+report.dependency-convergence.title                                = Dependency Convergence
 report.dependency-info.name                                        = Dependency Information
 report.dependency-info.title                                       = Dependency Information
 report.dependency-info.description                                 = This document describes how to to include this project as a dependency using various dependency management tools.

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_cs.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_cs.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_cs.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_cs.properties Sun Jun  8 09:44:13 2014
@@ -110,7 +110,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = M\u00e1te sn\u00edmkov\u00e9 z\u00e1vislosti.
 report.dependency-convergence.stats.readyrelease.success           = \u00dasp\u011bch
 report.dependency-convergence.stats.snapshots                      = Po\u010det sn\u00edmkov\u00fdch artefakt\u016f (NOS):
-report.dependency-convergence.stats.subprojects                    = Po\u010det podprojekt\u016f:
+report.dependency-convergence.stats.modules                        = Po\u010det podprojekt\u016f:
 report.dependency-convergence.title                                = Reaktor sbli\u017eov\u00e1n\u00ed z\u00e1vislost\u00ed
 report.dependency-info.name                                        = Informace o z\u00e1vislosti
 report.dependency-info.title                                       = Informace o z\u00e1vislosti

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_de.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_de.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_de.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_de.properties Sun Jun  8 09:44:13 2014
@@ -93,30 +93,34 @@ report.dependencies.repo.locations.colum
 report.dependencies.repo.locations.title                           = Archiv-Orte der Abh\u00e4ngigkeiten
 report.dependencies.title                                          = Abh\u00e4ngigkeiten
 report.dependencies.unamed                                         = Namenlos
-report.dependencies.transitive.intro                               = Es folgen die transitiven Abh\u00e4ngigkeiten dieses Projektes. Transitive Abh\u00e4ngigkeiten sind Abh\u00e4ngigkeiten der nicht transitiven Abh\u00e4ngigkeiten:
+report.dependencies.transitive.intro                               = Es folgen die transitiven Abh\u00e4ngigkeiten dieses Projektes. Transitive Abh\u00e4ngigkeiten sind Abh\u00e4ngigkeiten der Projektabh\u00e4ngigkeiten:
 report.dependencies.transitive.nolist                              = Dieses Projekt hat keine transitiven Abh\u00e4ngigkeiten.
 report.dependencies.transitive.title                               = Transitive Abh\u00e4ngigkeiten dieses Projektes
-report.dependency-convergence.convergence.caption                  = In Unter-Projekten verwendete Abh\u00e4ngigkeiten
+report.dependency-convergence.convergence.caption                  = In Modulen verwendete Abh\u00e4ngigkeiten
+report.dependency-convergence.convergence.single.caption           = In diesem Projekt verwendete Abh\u00e4ngigkeiten
 report.dependency-convergence.description                          = Dieses Dokument informiert \u00fcber die Konvergenz der Versionen von Abh\u00e4ngigkeiten des gesamten Projektes inklusive seiner Module.
 report.dependency-convergence.legend                               = Legende:
-report.dependency-convergence.legend.different                     = Mindestens ein Projekt verwendet eine andere Version der Abh\u00e4ngigkeit.
-report.dependency-convergence.legend.shared                        = Alle Projekte verwenden dieselbe Version der Abh\u00e4ngigkeit.
+report.dependency-convergence.legend.different                     = Mindestens eine Abh\u00e4ngigkeit verwendet eine andere Version der Abh\u00e4ngigkeit oder hat SNAPSHOT-Abh\u00e4ngigkeiten.
+report.dependency-convergence.legend.shared                        = Alle Module/Abh\u00e4ngigkeiten verwenden dieselbe Version der Abh\u00e4ngigkeit.
 report.dependency-convergence.name                                 = Konvergenz der Abh\u00e4ngigkeiten
+report.dependency-convergence.reactor.name                         = Konvergenz der Reaktorabh\u00e4ngigkeiten
+report.dependency-convergence.reactor.title                        = Konvergenz der Reaktorabh\u00e4ngigkeiten
 report.dependency-convergence.stats.artifacts                      = Anzahl eindeutiger Artefakte (NOA):
 report.dependency-convergence.stats.caption                        = Statistik:
 report.dependency-convergence.stats.convergence                    = Konvergenz (NOD/NOA):
 report.dependency-convergence.stats.dependencies                   = Anzahl Abh\u00e4ngigkeiten (NOD):
-report.dependency-convergence.stats.readyrelease                   = Bereit zur Ver\u00f6ffentlichung (100% Konvergenz und keine SNAPSHOTS):
+report.dependency-convergence.stats.readyrelease                   = Bereit zur Ver\u00f6ffentlichung (100 % Konvergenz und keine SNAPSHOTS):
 report.dependency-convergence.stats.readyrelease.error             = Fehler
-report.dependency-convergence.stats.readyrelease.error.convergence = Keine 100% Konvergenz.
-report.dependency-convergence.stats.readyrelease.error.snapshots   = SNAPSHOT Abh\u00e4ngigkeiten.
+report.dependency-convergence.stats.readyrelease.error.convergence = Keine 100 %ige Konvergenz.
+report.dependency-convergence.stats.readyrelease.error.snapshots   = SNAPSHOT-Abh\u00e4ngigkeiten.
 report.dependency-convergence.stats.readyrelease.success           = Erfolg
+report.dependency-convergence.stats.conflicting                    = Anzahl Artefakte mit Versionskonflikten (NOC):
 report.dependency-convergence.stats.snapshots                      = Anzahl SNAPSHOT-Artefakte (NOS):
-report.dependency-convergence.stats.subprojects                    = Anzahl Unter-Projekte:
+report.dependency-convergence.stats.modules                        = Anzahl Module:
+report.dependency-convergence.title                                = Konvergenz der Abh\u00e4ngigkeiten
 report.dependency-info.name                                        = Abh\u00e4ngigkeiten Information
 report.dependency-info.title                                       = Abh\u00e4ngigkeiten Information
 report.dependency-info.description                                 = In diesem Dokument sind Informationen enthalten, wie dieses Projekt als Abh\u00e4ngigkeit zu anderen Dependency-Management-Tools hinzugef\u00fcgt werden kann.
-report.dependency-convergence.title                                = Reaktor-Abh\u00e4ngigkeitskonvergenz
 report.index.nodescription                                         = Derzeit existiert keine Beschreibung f\u00fcr dieses Projekt.
 report.index.title                                                 = Willkommen bei
 report.issuetracking.bugzilla.intro                                = Dieses Projekt verwendet {Bugzilla, http://www.bugzilla.org/}.

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_es.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_es.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_es.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_es.properties Sun Jun  8 09:44:13 2014
@@ -110,7 +110,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Tienes dependencias SNAPSHOT.
 report.dependency-convergence.stats.readyrelease.success           = \u00c9xito
 report.dependency-convergence.stats.snapshots                      = N\u00famero de Artefactos SNAPSHOT  (NDS):
-report.dependency-convergence.stats.subprojects                    = N\u00famero de Subproyectos:
+report.dependency-convergence.stats.modules                        = N\u00famero de Subproyectos:
 report.dependency-convergence.title                                = Convergencia de Dependencias en el Reactor
 report.dependency-info.name                                        = Informaci\u00f3n de Dependencias
 report.dependency-info.title                                       = Informaci\u00f3n de Dependencias

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_fr.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_fr.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_fr.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_fr.properties Sun Jun  8 09:44:13 2014
@@ -110,7 +110,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Vous avez des d\u00e9pendances de type SNAPSHOT.
 report.dependency-convergence.stats.readyrelease.success           = Succ\u00e8s
 report.dependency-convergence.stats.snapshots                      = Nombre d'artefacts SNAPSHOT (NOS):
-report.dependency-convergence.stats.subprojects                    = Nombre de sous-projets:
+report.dependency-convergence.stats.modules                        = Nombre de sous-projets:
 report.dependency-convergence.title                                = R\u00e9action de la convergence des d\u00e9pendances
 report.dependency-info.name                                        = Informations de d\u00e9pendance
 report.dependency-info.title                                       = Informations de d\u00e9pendance

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_gl.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_gl.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_gl.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_gl.properties Sun Jun  8 09:44:13 2014
@@ -104,7 +104,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Tes dependencias SNAPSHOT.
 report.dependency-convergence.stats.readyrelease.success           = \u00c9xito
 report.dependency-convergence.stats.snapshots                      = N\u00famero de Artefactos SNAPSHOT  (NDS):
-report.dependency-convergence.stats.subprojects                    = N\u00famero de Subproxectos:
+report.dependency-convergence.stats.modules                        = N\u00famero de Subproxectos:
 report.dependency-convergence.title                                = Converxencia de Dependecias no Reactor
 report.index.nodescription                                         = A\u00EDnda non se escribiu unha descrici\u00F3n para este proxecto.
 report.index.title                                                 = Benvido a

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_hu.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_hu.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_hu.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_hu.properties Sun Jun  8 09:44:13 2014
@@ -76,7 +76,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Nincsenek SNAPSHOT f\u00fcgg\u0151s\u00e9gek.
 report.dependency-convergence.stats.readyrelease.success           = Siker
 report.dependency-convergence.stats.snapshots                      = Snapshot-ok sz\u00e1ma(Number of SNAPSHOT artifacts, NOS)
-report.dependency-convergence.stats.subprojects                    = Al-projektek sz\u00e1ma
+report.dependency-convergence.stats.modules                        = Al-projektek sz\u00e1ma
 report.dependency-convergence.title                                = F\u00fcgg\u0151s\u00e9gek
 report.index.nodescription                                         = A projektr\u0151l nincs le\u00edr\u00e1s.
 report.index.title                                                 = A projektr\u0151l

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ja.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ja.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ja.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ja.properties Sun Jun  8 09:44:13 2014
@@ -76,7 +76,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = \u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u4F9D\u5B58\u95A2\u4FC2\u304C\u4F7F\u308F\u308C\u3066\u3044\u307E\u3059\u3002
 report.dependency-convergence.stats.readyrelease.success           = \u6210\u529F
 report.dependency-convergence.stats.snapshots                      = \u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u30A2\u30FC\u30C6\u30A3\u30D5\u30A1\u30AF\u30C8\u306E\u6570 (NOS):
-report.dependency-convergence.stats.subprojects                    = \u30B5\u30D6\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u6570:
+report.dependency-convergence.stats.modules                        = \u30B5\u30D6\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u6570:
 report.dependency-convergence.title                                = \u30EA\u30A2\u30AF\u30BF\u306E\u4F9D\u5B58\u95A2\u4FC2\u306E\u4E00\u81F4\u5EA6
 report.index.nodescription                                         = \u3053\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066\u306E\u8AAC\u660E\u306F\u73FE\u5728\u7528\u610F\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
 report.index.title                                                 = \u3053\u306E\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306B\u3064\u3044\u3066

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ko.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ko.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ko.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ko.properties Sun Jun  8 09:44:13 2014
@@ -98,7 +98,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = \uc2a4\ub0c5\uc0f7 \uc758\uc874\ubb3c\uc774 \uc788\uc2b5\ub2c8\ub2e4.
 report.dependency-convergence.stats.readyrelease.success           = \uc131\uacf5
 report.dependency-convergence.stats.snapshots                      = \uc2a4\ub0c5\uc0f7 \uc0b0\ucd9c\ubb3c \uac1c\uc218 (NOS):
-report.dependency-convergence.stats.subprojects                    = \ud558\uc704 \ud504\ub85c\uc81d\ud2b8 \uac1c\uc218:
+report.dependency-convergence.stats.modules                        = \ud558\uc704 \ud504\ub85c\uc81d\ud2b8 \uac1c\uc218:
 report.dependency-convergence.title                                = \ubc18\uc751\uc790 \uc758\uc874\ubb3c \uc9d1\uc911 (Reactor Dependency Convergence)
 report.index.nodescription                                         = \uc774 \ud504\ub85c\uc81d\ud2b8\uc640 \uad00\ub828\ub41c \uc124\uba85\uc774 \ud604\uc7ac \uc5c6\uc2b5\ub2c8\ub2e4.
 report.index.title                                                 = \uc815\ubcf4

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_lt.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_lt.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_lt.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_lt.properties Sun Jun  8 09:44:13 2014
@@ -107,7 +107,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = J\u016bs turite SNAPSHOT priklausomybi\u0173.
 report.dependency-convergence.stats.readyrelease.success           = S\u0117kmingai
 report.dependency-convergence.stats.snapshots                      = SNAPSHOT artefakt\u0173 skai\u010dius (NOS):
-report.dependency-convergence.stats.subprojects                    = Sub-project\u0173 skai\u010dius:
+report.dependency-convergence.stats.modules                        = Sub-project\u0173 skai\u010dius:
 report.dependency-convergence.title                                = Reaktori\u0173 priklausomybi\u0173 konvergencijos
 report.index.nodescription                                         = \u0160iuo metu n\u0117ra apra\u0161ymo, susijusio su \u0161iuo projektu.
 report.index.title                                                 = Apie

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_no.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_no.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_no.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_no.properties Sun Jun  8 09:44:13 2014
@@ -78,7 +78,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Du har SNAPSHOT avhengigheter
 report.dependency-convergence.stats.readyrelease.success           = Suksess
 report.dependency-convergence.stats.snapshots                      = Antall SNAPSHOT artifakter (NOS):
-report.dependency-convergence.stats.subprojects                    = Antall sub prosjekter:
+report.dependency-convergence.stats.modules                        = Antall sub prosjekter:
 report.dependency-convergence.title                                = Reactor Avhengighets sammenfall
 report.index.nodescription                                         = Det er for \u00F8yeblikket inegn beskrivelse forbundet med dette prosjektet.
 report.index.title                                                 = Om

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt.properties Sun Jun  8 09:44:13 2014
@@ -109,7 +109,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Tem depend\u00eancias SNAPSHOT.
 report.dependency-convergence.stats.readyrelease.success           = Sucesso
 report.dependency-convergence.stats.snapshots                      = Numero de artefactos SNAPSHOT (NOS):
-report.dependency-convergence.stats.subprojects                    = Numero de subprojectos:
+report.dependency-convergence.stats.modules                        = Numero de subprojectos:
 report.dependency-convergence.title                                = Converg\u00eancia da Vers\u00e3o da Depend\u00eancia
 report.index.nodescription                                         = Actualmente, n\u00e3o h\u00e1 uma descri\u00e7\u00e3o atribu\u00edda a este projecto.
 report.index.title                                                 = Sobre

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt_BR.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt_BR.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt_BR.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_pt_BR.properties Sun Jun  8 09:44:13 2014
@@ -108,7 +108,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Voc\u00ea tem depend\u00eancias SNAPSHOT.
 report.dependency-convergence.stats.readyrelease.success           = Sucesso
 report.dependency-convergence.stats.snapshots                      = Numero de artefatos SNAPSHOT (NOS):
-report.dependency-convergence.stats.subprojects                    = Numero de subprojetos:
+report.dependency-convergence.stats.modules                        = Numero de subprojetos:
 report.dependency-convergence.title                                = Converg\u00eancia de vers\u00e3o de depend\u00eancia
 report.dependencyManagement.column.artifactId                      = ArtifactId
 report.dependencyManagement.column.classifier                      = Classificador

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ru.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ru.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ru.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_ru.properties Sun Jun  8 09:44:13 2014
@@ -109,7 +109,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = \u0423 \u0412\u0430\u0441 \u0438\u043c\u0435\u044e\u0442\u0441\u044f SNAPSHOT \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.
 report.dependency-convergence.stats.readyrelease.success           = \u0423\u0441\u043f\u0435\u0445
 report.dependency-convergence.stats.snapshots                      = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e SNAPSHOT \u0430\u0440\u0442\u0438\u0444\u0430\u043a\u0442\u043e\u0432 (NOS):
-report.dependency-convergence.stats.subprojects                    = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u0431-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:
+report.dependency-convergence.stats.modules                        = \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u0431-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432:
 report.dependency-convergence.title                                = \u0420\u0435\u0430\u043a\u0442\u043e\u0440 \u041a\u043e\u043d\u0432\u0435\u0440\u0433\u0435\u043d\u0446\u0438\u0438 \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439
 report.index.nodescription                                         = \u0423 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u043a\u0430 \u043d\u0435\u0442.
 report.index.title                                                 = \u0421\u043f\u0440\u0430\u0432\u043a\u0430

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sk.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sk.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sk.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sk.properties Sun Jun  8 09:44:13 2014
@@ -98,7 +98,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = M\u00e1te SNAPSHOT z\u00e1vislosti.
 report.dependency-convergence.stats.readyrelease.success           = V poriadku
 report.dependency-convergence.stats.snapshots                      = Po\u010det SNAPSHOT artefaktov (PSA)
-report.dependency-convergence.stats.subprojects                    = Po\u010det podprojektov
+report.dependency-convergence.stats.modules                        = Po\u010det podprojektov
 report.dependency-convergence.title                                = Konvergencia z\u00e1vislost\u00ed
 report.index.nodescription                                         = Projekt nem\u00e1 moment\u00e1lne \u017eiadny popis.
 report.index.title                                                 = Inform\u00e1cie

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sv.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sv.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sv.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_sv.properties Sun Jun  8 09:44:13 2014
@@ -108,7 +108,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = Det finns beroenden p\u00e5 SNAPSHOTs.
 report.dependency-convergence.stats.readyrelease.success           = Framg\u00e5ng
 report.dependency-convergence.stats.snapshots                      = Antal SNAPSHOT artefakter (Number of SNAPSHOTs, NOS):
-report.dependency-convergence.stats.subprojects                    = Antal underprojekt:
+report.dependency-convergence.stats.modules                        = Antal underprojekt:
 report.dependency-convergence.title                                = Beroendekonvergens fr\u00e5n Reactor
 report.dependency-info.name                                        = Beroendeinformation
 report.dependency-info.title                                       = Beroendeinformation

Modified: maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_tr.properties
URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_tr.properties?rev=1601206&r1=1601205&r2=1601206&view=diff
==============================================================================
--- maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_tr.properties (original)
+++ maven/plugins/trunk/maven-project-info-reports-plugin/src/main/resources/project-info-report_tr.properties Sun Jun  8 09:44:13 2014
@@ -98,7 +98,7 @@ report.dependency-convergence.stats.read
 report.dependency-convergence.stats.readyrelease.error.snapshots   = You have SNAPSHOT dependencies.
 report.dependency-convergence.stats.readyrelease.success           = Success
 report.dependency-convergence.stats.snapshots                      = Number of SNAPSHOT artifacts (NOS):
-report.dependency-convergence.stats.subprojects                    = Number of sub-projects:
+report.dependency-convergence.stats.modules                        = Number of sub-projects:
 report.dependency-convergence.title                                = Reactor Dependency Convergence
 report.index.nodescription                                         = There is currently no description associated with this project.
 report.index.title                                                 = About



Mime
View raw message