added toNodeString() and dependent APIs

git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1364446 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java
index 9b6b4a3..bf16f3a 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyNode.java
@@ -32,9 +32,9 @@
  */
 public interface DependencyNode
 {
-    public Artifact getArtifact();
+    Artifact getArtifact();
 
-    public List<DependencyNode> getChildren();
+    List<DependencyNode> getChildren();
 
     /**
      * Applies the specified dependency node visitor to this dependency node and its children.
@@ -44,12 +44,41 @@
      * @return the visitor result of ending the visit to this node
      * @since 1.1
      */
-    public boolean accept( DependencyNodeVisitor visitor );
+    boolean accept( DependencyNodeVisitor visitor );
 
     /**
      * Gets the parent dependency node of this dependency node.
      * 
      * @return the parent dependency node
      */
-    public DependencyNode getParent();
+    DependencyNode getParent();
+
+    /**
+     * Gets the version or version range for the dependency before dependency management was applied (if any).
+     * 
+     * @return The dependency version before dependency management or {@code null} if the version was not managed.
+     */
+    String getPremanagedVersion();
+
+    /**
+     * Gets the scope for the dependency before dependency management was applied (if any).
+     * 
+     * @return The dependency scope before dependency management or {@code null} if the scope was not managed.
+     */
+    String getPremanagedScope();
+
+    /**
+     * A constraint on versions for a dependency. A constraint can either consist of one or more version ranges or a single
+     * version.
+     * 
+     * @return The constraint on the dependency.
+     */
+    String getVersionConstraint();
+
+    /**
+     * Returns a string representation of this dependency node.
+     * 
+     * @return the string representation
+     */
+    String toNodeString();
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
index 7cd1fd2..810099b 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
@@ -13,12 +13,22 @@
 
     private final DependencyNode parent;
 
+    private final String premanagedVersion;
+
+    private final String premanagedScope;
+
+    private final String versionConstraint;
+
     private List<DependencyNode> children;
 
-    public DefaultDependencyNode( DependencyNode parent, Artifact artifact )
+    public DefaultDependencyNode( DependencyNode parent, Artifact artifact, String premanagedVersion,
+                                  String premanagedScope, String versionConstraint )
     {
         this.parent = parent;
         this.artifact = artifact;
+        this.premanagedVersion = premanagedVersion;
+        this.premanagedScope = premanagedScope;
+        this.versionConstraint = versionConstraint;
     }
 
     /**
@@ -64,4 +74,99 @@
     {
         return parent;
     }
+
+    public String getPremanagedVersion()
+    {
+        return premanagedVersion;
+    }
+
+    public String getPremanagedScope()
+    {
+        return premanagedScope;
+    }
+
+    public String getVersionConstraint()
+    {
+        return versionConstraint;
+    }
+
+    public String toNodeString()
+    {
+        StringBuffer buffer = new StringBuffer();
+
+        buffer.append( artifact );
+        
+        ItemAppender appender = new ItemAppender( buffer, " (", "; ", ")" );
+
+        if ( getPremanagedVersion() != null )
+        {
+            appender.append( "version managed from ", getPremanagedVersion() );
+        }
+            
+        if ( getPremanagedScope() != null )
+        {
+            appender.append( "scope managed from ", getPremanagedScope() );
+        }
+        
+        if ( getVersionConstraint() != null )
+        {
+            appender.append( "version selected from constraint ", getVersionConstraint() );
+        }
+        
+        appender.flush();
+
+        return buffer.toString();
+    }
+
+    /**
+     * Utility class to concatenate a number of parameters with separator tokens.   
+     */
+    private static class ItemAppender
+    {
+        private StringBuffer buffer;
+        
+        private String startToken;
+        
+        private String separatorToken;
+        
+        private String endToken;
+        
+        private boolean appended;
+        
+        public ItemAppender( StringBuffer buffer, String startToken, String separatorToken, String endToken )
+        {
+            this.buffer = buffer;
+            this.startToken = startToken;
+            this.separatorToken = separatorToken;
+            this.endToken = endToken;
+            
+            appended = false;
+        }
+
+        public ItemAppender append( String item1, String item2 )
+        {
+            appendToken();
+            
+            buffer.append( item1 ).append( item2 );
+            
+            return this;
+        }
+        
+        public void flush()
+        {
+            if ( appended )
+            {
+                buffer.append( endToken );
+                
+                appended = false;
+            }
+        }
+        
+        private void appendToken()
+        {
+            buffer.append( appended ? separatorToken : startToken );
+            
+            appended = true;
+        }
+    }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
index d40b56d..3787f9a 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
@@ -64,7 +64,15 @@
                                                 org.apache.maven.shared.dependency.tree.DependencyNode node,
                                                 ArtifactFilter filter )
     {
-        DefaultDependencyNode current = new DefaultDependencyNode( parent, node.getArtifact() );
+        String versionSelectedFromRange = null;
+        if ( node.getVersionSelectedFromRange() != null )
+        {
+            versionSelectedFromRange = node.getVersionSelectedFromRange().toString();
+        }
+
+        DefaultDependencyNode current =
+            new DefaultDependencyNode( parent, node.getArtifact(), node.getPremanagedVersion(),
+                                       node.getPremanagedScope(), versionSelectedFromRange );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.apache.maven.shared.dependency.tree.DependencyNode child : node.getChildren() )
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
index 315fa85..30219f0 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
@@ -41,6 +41,7 @@
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.sonatype.aether.graph.Dependency;
+import org.sonatype.aether.version.VersionConstraint;
 
 /**
  * Wrapper around Maven 3 dependency resolver.
@@ -111,7 +112,9 @@
     private DependencyNode buildDependencyNode( DependencyNode parent, org.sonatype.aether.graph.DependencyNode node,
                                                 Artifact artifact, ArtifactFilter filter )
     {
-        DefaultDependencyNode current = new DefaultDependencyNode( parent, artifact );
+        DefaultDependencyNode current =
+            new DefaultDependencyNode( parent, artifact, node.getPremanagedVersion(), node.getPremanagedScope(),
+                                       getVersionSelectedFromRange( node.getVersionConstraint() ) );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
@@ -128,4 +131,29 @@
 
         return current;
     }
+
+    private String getVersionSelectedFromRange( VersionConstraint constraint )
+    {
+        if ( constraint == null )
+        {
+            return null;
+        }
+
+        if ( constraint.getVersion() != null )
+        {
+            return constraint.getVersion().toString();
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for ( org.sonatype.aether.version.VersionRange range : constraint.getRanges() )
+        {
+            if ( sb.length() > 0 )
+            {
+                sb.append( ',' );
+            }
+            sb.append( range );
+        }
+
+        return sb.toString();
+    }
 }