You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by jo...@apache.org on 2007/06/14 17:25:48 UTC

svn commit: r547277 [3/16] - in /maven/archiva/trunk: archiva-base/ archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ archiva-base/archiva-dependency-graph/ archiva-base/archiva-depende...

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,81 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.walk.BaseVisitor;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphVisitor;
+
+/**
+ * GraphCopier 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class GraphCopier
+    extends BaseVisitor
+    implements DependencyGraphVisitor
+{
+    protected DependencyGraph copiedGraph;
+
+    public DependencyGraph getGraph()
+    {
+        return copiedGraph;
+    }
+
+    public void setGraph( DependencyGraph graph )
+    {
+        this.copiedGraph = graph;
+    }
+
+    public void discoverNode( DependencyGraphNode node )
+    {
+        if ( copiedGraph == null )
+        {
+            copiedGraph = new DependencyGraph( node );
+        }
+    }
+
+    /**
+     * Be sure to override and NOT call this method in your sub class,
+     * if you want to copy edges based on some kind of criteria.
+     */
+    public void discoverEdge( DependencyGraphEdge edge )
+    {
+        copyEdge( edge );
+    }
+
+    public void copyEdge( DependencyGraphEdge edge )
+    {
+        DependencyGraphNode nodeFrom = graph.getNode( edge.getNodeFrom() );
+        DependencyGraphNode nodeTo = graph.getNode( edge.getNodeTo() );
+
+        this.copiedGraph.addNode( nodeFrom );
+        this.copiedGraph.addNode( nodeTo );
+        this.copiedGraph.addEdge( edge );
+    }
+
+    public void reset()
+    {
+        this.copiedGraph = null;
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/GraphCopier.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,53 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.PotentialCyclicEdgeProducer;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+
+/**
+ * PopulateDependencyManagementTask 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="populate-dependency-management"
+ *      instantiation-strategy="per-lookup"
+ */
+public class PopulateDependencyManagementTask
+    implements GraphTask, PotentialCyclicEdgeProducer
+{
+    public void executeTask( DependencyGraph graph )
+    {
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+        DependencyManagementApplier depManApplier = new DependencyManagementApplier();
+        walker.visit( graph, depManApplier );
+    }
+
+    public String getTaskId()
+    {
+        return "populate-dependency-management";
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateDependencyManagementTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,92 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphBuilder;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphUtils;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.GraphTaskException;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+
+/**
+ * PopulateGraphMasterTask - will perform a resolve / depman apply loop until the graph is fully populated. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="populate-graph"
+ *      instantiation-strategy="per-lookup"
+ */
+public class PopulateGraphMasterTask
+    implements GraphTask
+{
+    private DependencyGraphBuilder builder;
+
+    private ResolveGraphTask resolveGraphTask = new ResolveGraphTask();
+
+    private DependencyManagementApplier depManApplier = new DependencyManagementApplier();
+
+    public void executeTask( DependencyGraph graph )
+        throws GraphTaskException
+    {
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+
+        boolean done = false;
+        int maxiters = 5;
+
+        while ( !done )
+        {
+            resolveGraphTask.executeTask( graph );
+            walker.visit( graph, depManApplier );
+
+            if ( !depManApplier.hasCreatedNodes() || ( maxiters < 0 ) )
+            {
+                done = true;
+                break;
+            }
+
+            maxiters--;
+        }
+
+        DependencyGraphUtils.cleanupOrphanedNodes( graph );
+    }
+
+    public String getTaskId()
+    {
+        return "populate-graph";
+    }
+
+    public DependencyGraphBuilder getBuilder()
+    {
+        return builder;
+    }
+
+    public void setBuilder( DependencyGraphBuilder builder )
+    {
+        this.builder = builder;
+        this.resolveGraphTask.setBuilder( builder );
+        this.depManApplier.setBuilder( builder );
+    }
+
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/PopulateGraphMasterTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,35 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+import org.apache.commons.collections.functors.TruePredicate;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+
+/**
+ * ReduceEnabledEdgesTask 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="reduce-enabled-edges"
+ *      instantiation-strategy="per-lookup"
+ */
+public class ReduceEnabledEdgesTask
+    implements GraphTask
+{
+    public void executeTask( DependencyGraph graph )
+    {
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+        walker.setEdgePredicate( TruePredicate.getInstance() );
+        ReduceEnabledEdgesVisitor reduceEnabledEdgesResolver = new ReduceEnabledEdgesVisitor();
+        walker.visit( graph, reduceEnabledEdgesResolver );
+    }
+
+    public String getTaskId()
+    {
+        return "reduce-enabled-edges";
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,42 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphVisitor;
+
+/**
+ * Removes all disabled edges from the graph. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ReduceEnabledEdgesVisitor
+    extends AbstractReduceEdgeVisitor
+    implements DependencyGraphVisitor
+{
+    public void discoverEdge( DependencyGraphEdge edge )
+    {
+        if ( edge.isDisabled() )
+        {
+            super.graph.removeEdge( edge );
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceEnabledEdgesVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,50 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+
+/**
+ * ReduceScopeTask 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="reduce-scope"
+ *      instantiation-strategy="per-lookup"
+ */
+public class ReduceScopeTask
+    implements GraphTask
+{
+    private String scope;
+
+    public ReduceScopeTask( String scope )
+    {
+        this.scope = scope;
+    }
+
+    public void executeTask( DependencyGraph graph )
+    {
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+        ReduceScopeVisitor reduceScopeResolver = new ReduceScopeVisitor( this.scope );
+        walker.visit( graph, reduceScopeResolver );
+    }
+
+    public String getScope()
+    {
+        return scope;
+    }
+
+    public void setScope( String scope )
+    {
+        this.scope = scope;
+    }
+
+    public String getTaskId()
+    {
+        return "reduce-scope";
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,51 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.commons.collections.Predicate;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.functors.EdgeWithinScopePredicate;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphVisitor;
+
+/**
+ * ReduceScopeVisitor 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ReduceScopeVisitor
+    extends AbstractReduceEdgeVisitor
+    implements DependencyGraphVisitor
+{
+    private Predicate scopedPredicate;
+
+    public ReduceScopeVisitor( String scope )
+    {
+        scopedPredicate = new EdgeWithinScopePredicate( scope );
+    }
+
+    public void discoverEdge( DependencyGraphEdge edge )
+    {
+        if ( !scopedPredicate.evaluate( edge ) )
+        {
+            super.graph.removeEdge( edge );
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceScopeVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,53 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkBreadthFirstSearch;
+
+/**
+ * ReduceTransitiveEdgesTask 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="reduce-transitive-edges"
+ *      instantiation-strategy="per-lookup"
+ */
+public class ReduceTransitiveEdgesTask
+    implements GraphTask
+{
+
+    public void executeTask( DependencyGraph graph )
+    {
+        DependencyGraphWalker walker = new WalkBreadthFirstSearch();
+        ReduceTransitiveEdgesVisitor reduceTransitiveEdgesResolver = new ReduceTransitiveEdgesVisitor();
+        walker.visit( graph, reduceTransitiveEdgesResolver );
+    }
+
+    public String getTaskId()
+    {
+        return "reduce-transitive-edges";
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,161 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphKeys;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphVisitor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Perform a transitive reduction of the graph. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ReduceTransitiveEdgesVisitor
+    extends AbstractReduceEdgeVisitor
+    implements DependencyGraphVisitor
+{
+    class EdgeInfo
+    {
+        public DependencyGraphEdge edge;
+
+        public int depth = Integer.MAX_VALUE;
+    }
+
+    class EdgeInfoDepthComparator
+        implements Comparator
+    {
+        public int compare( Object obj0, Object obj1 )
+        {
+            EdgeInfo edgeInfo0 = (EdgeInfo) obj0;
+            EdgeInfo edgeInfo1 = (EdgeInfo) obj1;
+
+            return edgeInfo0.depth - edgeInfo1.depth;
+        }
+    }
+
+    /**
+     * A Map of &lt;(Node To) ArtifactReference, Map of &lt;(Node From) ArtifactReference, EdgeInfo&gt;&gt;
+     */
+    private Map /*<ArtifactReference,<ArtifactReference,EdgeInfo>>*/nodeDistanceMap = new HashMap();
+
+    private int currentDepth;
+
+    public void discoverGraph( DependencyGraph graph )
+    {
+        super.discoverGraph( graph );
+        nodeDistanceMap.clear();
+        currentDepth = 0;
+    }
+
+    public void discoverEdge( DependencyGraphEdge edge )
+    {
+        /* WARNING: it is unwise to remove the edge at this point.
+         *          as modifying the graph as it's being walked is dangerous.
+         *          
+         * Just record the edge's current depth.
+         */
+
+        String nodeTo = DependencyGraphKeys.toKey( edge.getNodeTo() );
+        String nodeFrom = DependencyGraphKeys.toKey( edge.getNodeFrom() );
+
+        // Get sub-map
+        Map edgeInfoMap = (Map) nodeDistanceMap.get( nodeTo );
+
+        // Create sub-map if not present (yet)
+        if ( edgeInfoMap == null )
+        {
+            edgeInfoMap = new HashMap();
+            nodeDistanceMap.put( nodeTo, edgeInfoMap );
+        }
+
+        // Get sub-map-value.
+        EdgeInfo edgeInfo = (EdgeInfo) edgeInfoMap.get( nodeFrom );
+
+        if ( edgeInfo == null )
+        {
+            // Create a new edgeinfo.
+            edgeInfo = new EdgeInfo();
+            edgeInfo.edge = edge;
+            edgeInfo.depth = currentDepth;
+            edgeInfoMap.put( nodeFrom, edgeInfo );
+        }
+        // test the current depth, if it is less than previous depth, save it
+        else if ( currentDepth < edgeInfo.depth )
+        {
+            edgeInfo.depth = currentDepth;
+            edgeInfoMap.put( nodeFrom, edgeInfo );
+        }
+
+        nodeDistanceMap.put( nodeTo, edgeInfoMap );
+    }
+
+    public void discoverNode( DependencyGraphNode node )
+    {
+        super.discoverNode( node );
+        currentDepth++;
+
+    }
+
+    public void finishNode( DependencyGraphNode node )
+    {
+        super.finishNode( node );
+        currentDepth--;
+    }
+
+    public void finishGraph( DependencyGraph graph )
+    {
+        super.finishGraph( graph );
+
+        // Now we prune/remove the edges that are transitive in nature.
+
+        Comparator edgeInfoDepthComparator = new EdgeInfoDepthComparator();
+
+        Iterator it = nodeDistanceMap.values().iterator();
+        while ( it.hasNext() )
+        {
+            Map edgeInfoMap = (Map) it.next();
+
+            if ( edgeInfoMap.size() > 1 )
+            {
+                List edgeInfos = new ArrayList();
+                edgeInfos.addAll( edgeInfoMap.values() );
+                Collections.sort( edgeInfos, edgeInfoDepthComparator );
+
+                for ( int i = 1; i < edgeInfos.size(); i++ )
+                {
+                    EdgeInfo edgeInfo = (EdgeInfo) edgeInfos.get( i );
+                    graph.removeEdge( edgeInfo.edge );
+                }
+            }
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ReduceTransitiveEdgesVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,98 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.map.MultiValueMap;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphKeys;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.PotentialCyclicEdgeProducer;
+import org.apache.maven.archiva.dependency.graph.functors.ToArtifactReferenceTransformer;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * RefineConflictsTask 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="refine-conflicts"
+ *      instantiation-strategy="per-lookup"
+ */
+public class RefineConflictsTask
+    implements GraphTask, PotentialCyclicEdgeProducer
+{
+
+    public void executeTask( DependencyGraph graph )
+    {
+        Iterator it;
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+        RefineConflictsVisitor refineConflictsVisitor = new RefineConflictsVisitor();
+        
+        MultiValueMap depMap = new MultiValueMap();
+
+        // Identify deps that need to be resolved.
+        it = graph.getNodes().iterator();
+        while ( it.hasNext() )
+        {
+            DependencyGraphNode node = (DependencyGraphNode) it.next();
+            String key = DependencyGraphKeys.toManagementKey( node.getArtifact() );
+            // This will add this node to the specified key, not replace a previous one.
+            depMap.put( key, node );
+        }
+
+        // Process those depMap entries with more than 1 value. 
+        ToArtifactReferenceTransformer nodeToArtifact = new ToArtifactReferenceTransformer();
+
+        it = depMap.entrySet().iterator();
+        while ( it.hasNext() )
+        {
+            Map.Entry entry = (Entry) it.next();
+            Collection nodes = (Collection) entry.getValue();
+            if ( nodes.size() > 1 )
+            {
+                List conflictingArtifacts = new ArrayList();
+                conflictingArtifacts.addAll( nodes );
+                CollectionUtils.transform( conflictingArtifacts, nodeToArtifact );
+
+                refineConflictsVisitor.resetConflictingArtifacts();
+                refineConflictsVisitor.addAllConflictingArtifacts( conflictingArtifacts );
+                walker.visit( graph, refineConflictsVisitor );
+            }
+        }
+    }
+
+    public String getTaskId()
+    {
+        return "refine-conflicts";
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,303 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.comparators.ReverseComparator;
+import org.apache.commons.collections.functors.NotPredicate;
+import org.apache.commons.collections.list.TypedList;
+import org.apache.maven.archiva.common.utils.VersionComparator;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphKeys;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphUtils;
+import org.apache.maven.archiva.dependency.graph.walk.BaseVisitor;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphVisitor;
+import org.apache.maven.archiva.model.ArtifactReference;
+
+import java.util.ArrayList;
+import java.util.Collection;
+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.Map;
+import java.util.Set;
+
+/**
+ * RefineConflictsVisitor 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class RefineConflictsVisitor
+    extends BaseVisitor
+    implements DependencyGraphVisitor
+{
+    class DepthComparator
+        implements Comparator
+    {
+        public int compare( Object obj0, Object obj1 )
+        {
+            NodeLocation nodeLoc0 = (NodeLocation) obj0;
+            NodeLocation nodeLoc1 = (NodeLocation) obj1;
+
+            return nodeLoc0.depth - nodeLoc1.depth;
+        }
+    }
+
+    class NodeLocation
+    {
+        public ArtifactReference artifact;
+
+        public DependencyGraphEdge edge;
+
+        public int depth;
+
+        public NodeLocation( ArtifactReference artifact, DependencyGraphEdge edge, int depth )
+        {
+            this.artifact = artifact;
+            this.edge = edge;
+            this.depth = depth;
+        }
+    }
+
+    class NodeLocationPredicate
+        implements Predicate
+    {
+        private ArtifactReference artifact;
+
+        public NodeLocationPredicate( ArtifactReference artifact )
+        {
+            this.artifact = artifact;
+        }
+
+        public NodeLocationPredicate( DependencyGraphNode node )
+        {
+            this( node.getArtifact() );
+        }
+
+        public boolean evaluate( Object object )
+        {
+            boolean satisfies = false;
+
+            if ( object instanceof NodeLocation )
+            {
+                NodeLocation nodeloc = (NodeLocation) object;
+                satisfies = nodeloc.artifact.equals( artifact );
+            }
+
+            return satisfies;
+        }
+
+    }
+
+    class NodeLocationVersionComparator
+        implements Comparator
+    {
+        public int compare( Object o1, Object o2 )
+        {
+            if ( o1 == null && o2 == null )
+            {
+                return 0;
+            }
+
+            if ( o1 == null && o2 != null )
+            {
+                return 1;
+            }
+
+            if ( o1 != null && o2 == null )
+            {
+                return -1;
+            }
+
+            if ( ( o1 instanceof NodeLocation ) && ( o2 instanceof NodeLocation ) )
+            {
+                String version1 = ( (NodeLocation) o1 ).artifact.getVersion();
+                String version2 = ( (NodeLocation) o2 ).artifact.getVersion();
+
+                VersionComparator.getInstance().compare( version1, version2 );
+            }
+
+            return 0;
+        }
+    }
+
+    class DistantNodeLocationPredicate
+        implements Predicate
+    {
+        private int cutoff;
+
+        public DistantNodeLocationPredicate( int distantCutoff )
+        {
+            this.cutoff = distantCutoff;
+        }
+
+        public boolean evaluate( Object object )
+        {
+            boolean satisfies = false;
+
+            if ( object instanceof NodeLocation )
+            {
+                NodeLocation nodeloc = (NodeLocation) object;
+                satisfies = ( nodeloc.depth >= this.cutoff );
+            }
+
+            return satisfies;
+        }
+    }
+
+    private List conflictingArtifacts;
+
+    private Map foundNodesMap = new HashMap();
+
+    private int currentDepth = 0;
+
+    private DependencyGraph currentGraph;
+
+    public RefineConflictsVisitor()
+    {
+        conflictingArtifacts = TypedList.decorate( new ArrayList(), ArtifactReference.class );
+    }
+
+    public void discoverGraph( DependencyGraph graph )
+    {
+        super.discoverGraph( graph );
+        this.currentGraph = graph;
+        this.foundNodesMap.clear();
+    }
+
+    public void discoverNode( DependencyGraphNode node )
+    {
+        super.discoverNode( node );
+
+        currentDepth++;
+
+        List edgesFrom = currentGraph.getEdgesFrom( node );
+        Iterator it = edgesFrom.iterator();
+        while ( it.hasNext() )
+        {
+            DependencyGraphEdge edge = (DependencyGraphEdge) it.next();
+            if ( this.conflictingArtifacts.contains( edge.getNodeTo() ) )
+            {
+                String nodeKey = DependencyGraphKeys.toKey( edge.getNodeTo() );
+                // Check for existing NodeLocation with same key
+                NodeLocation nodeloc = (NodeLocation) this.foundNodesMap.get( nodeKey );
+
+                if ( ( nodeloc == null ) || ( currentDepth < nodeloc.depth ) )
+                {
+                    nodeloc = new NodeLocation( edge.getNodeTo(), edge, currentDepth );
+                    this.foundNodesMap.put( nodeKey, nodeloc );
+                }
+            }
+        }
+    }
+
+    public void finishGraph( DependencyGraph graph )
+    {
+        super.finishGraph( graph );
+
+        if ( MapUtils.isEmpty( this.foundNodesMap ) )
+        {
+            return;
+        }
+
+        // Find winning node.
+        ArtifactReference winningArtifact = findWinningArtifact( this.foundNodesMap.values() );
+        DependencyGraphNode winningNode = graph.getNode( winningArtifact );
+
+        // Gather up Losing Nodes.
+        Set losingNodes = new HashSet();
+        Predicate losersPredicate = NotPredicate.getInstance( new NodeLocationPredicate( winningArtifact ) );
+        CollectionUtils.select( this.foundNodesMap.values(), losersPredicate, losingNodes );
+
+        // Swing losing nodes to winning node.
+        Iterator it = losingNodes.iterator();
+        while ( it.hasNext() )
+        {
+            NodeLocation losingNodeLoc = (NodeLocation) it.next();
+            DependencyGraphNode losingNode = graph.getNode( losingNodeLoc.artifact );
+            DependencyGraphUtils.collapseNodes( graph, losingNode, winningNode );
+        }
+    }
+
+    private ArtifactReference findWinningArtifact( Collection nodes )
+    {
+        List remainingNodes = new ArrayList();
+        remainingNodes.addAll( nodes );
+
+        /* .\ Filter by Depth \.____________________________________________________ */
+
+        // Sort by depth.
+        Collections.sort( remainingNodes, new DepthComparator() );
+
+        // Determine 'closest' node depth.
+        NodeLocation nearestNode = (NodeLocation) remainingNodes.get( 0 );
+        int nearest = nearestNode.depth;
+
+        // Filter out distant nodes. 
+        Predicate distantLocations = new DistantNodeLocationPredicate( nearest );
+        CollectionUtils.filter( remainingNodes, distantLocations );
+
+        // Do we have 1 node left?
+        if ( remainingNodes.size() == 1 )
+        {
+            // A winner!
+            NodeLocation nodeloc = (NodeLocation) remainingNodes.get( 0 );
+            return nodeloc.artifact;
+        }
+
+        /* .\ Filter by Newest Version \.___________________________________________ */
+
+        // We have 2 or more nodes that are equal distance from the root.
+        // Determine which one is 'newest' based on version id.
+        Collections.sort( remainingNodes, new ReverseComparator( new NodeLocationVersionComparator() ) );
+
+        NodeLocation nodeloc = (NodeLocation) remainingNodes.get( 0 );
+        return nodeloc.artifact;
+    }
+
+    public void finishNode( DependencyGraphNode node )
+    {
+        super.finishNode( node );
+        currentDepth--;
+    }
+
+    public List getConflictingArtifacts()
+    {
+        return conflictingArtifacts;
+    }
+
+    public void addAllConflictingArtifacts( Collection nodes )
+    {
+        this.conflictingArtifacts.addAll( nodes );
+    }
+
+    public void resetConflictingArtifacts()
+    {
+        this.conflictingArtifacts.clear();
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/RefineConflictsVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,114 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.commons.collections.CollectionUtils;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphBuilder;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.PotentialCyclicEdgeProducer;
+import org.apache.maven.archiva.dependency.graph.functors.UnresolvedGraphNodePredicate;
+import org.apache.maven.archiva.model.VersionedReference;
+
+/**
+ * Loop through the unresolved nodes and resolve them, until there
+ * are no more unresolved nodes.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="resolve-graph"
+ *      instantiation-strategy="per-lookup"
+ */
+public class ResolveGraphTask
+    implements GraphTask, PotentialCyclicEdgeProducer
+{
+    private DependencyGraphBuilder builder;
+    
+    private int resolvedCount = 0;
+
+    private VersionedReference toVersionedReference( DependencyGraphNode node )
+    {
+        VersionedReference ref = new VersionedReference();
+        ref.setGroupId( node.getArtifact().getGroupId() );
+        ref.setArtifactId( node.getArtifact().getArtifactId() );
+        ref.setVersion( node.getArtifact().getVersion() );
+
+        return ref;
+    }
+
+    public void executeTask( DependencyGraph graph )
+    {
+        resolvedCount = 0;
+        VersionedReference rootRef = toVersionedReference( graph.getRootNode() );
+
+        if ( !graph.getRootNode().isResolved() )
+        {
+            builder.resolveNode( graph, graph.getRootNode(), rootRef );
+            resolvedCount++;
+        }
+
+        boolean done = false;
+
+        while ( !done )
+        {
+            DependencyGraphNode node = findUnresolvedNode( graph );
+            if ( node == null )
+            {
+                done = true;
+                break;
+            }
+
+            VersionedReference otherRef = toVersionedReference( node );
+
+            builder.resolveNode( graph, node, otherRef );
+            resolvedCount++;
+        }
+    }
+
+    private DependencyGraphNode findUnresolvedNode( DependencyGraph graph )
+    {
+        return (DependencyGraphNode) CollectionUtils
+            .find( graph.getNodes(), UnresolvedGraphNodePredicate.getInstance() );
+    }
+
+    public DependencyGraphBuilder getBuilder()
+    {
+        return builder;
+    }
+
+    public void setBuilder( DependencyGraphBuilder graphBuilder )
+    {
+        this.builder = graphBuilder;
+    }
+
+    public String getTaskId()
+    {
+        return "resolve-graph";
+    }
+
+    public int getResolvedCount()
+    {
+        return resolvedCount;
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/ResolveGraphTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,35 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.GraphTask;
+import org.apache.maven.archiva.dependency.graph.GraphTaskException;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+
+/**
+ * Update the scopes of the edges to what their parent node says.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *      role="org.apache.maven.archiva.dependency.graph.GraphTask"
+ *      role-hint="update-scopes"
+ *      instantiation-strategy="per-lookup"
+ */
+public class UpdateScopesTask
+    implements GraphTask
+{
+    public void executeTask( DependencyGraph graph )
+        throws GraphTaskException
+    {
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+        UpdateScopesVisitor updateScopes = new UpdateScopesVisitor();
+        walker.visit( graph, updateScopes );
+    }
+
+    public String getTaskId()
+    {
+        return "update-scopes";
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,82 @@
+package org.apache.maven.archiva.dependency.graph.tasks;
+
+/*
+ * 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 org.apache.commons.collections.Predicate;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.functors.EdgeFromPredicate;
+import org.apache.maven.archiva.dependency.graph.walk.BaseVisitor;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphVisitor;
+import org.apache.maven.archiva.model.DependencyScope;
+
+import java.util.Stack;
+
+/**
+ * UpdateScopesVisitor 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class UpdateScopesVisitor
+    extends BaseVisitor
+    implements DependencyGraphVisitor
+{
+    private Stack scopeStack;
+
+    private Predicate rootEdgePredicate;
+
+    public UpdateScopesVisitor()
+    {
+        scopeStack = new Stack();
+        // Default setting.
+        scopeStack.add( DependencyScope.COMPILE );
+    }
+
+    public void discoverGraph( DependencyGraph graph )
+    {
+        super.discoverGraph( graph );
+        rootEdgePredicate = new EdgeFromPredicate( graph.getRootNode() );
+    }
+
+    public void discoverEdge( DependencyGraphEdge edge )
+    {
+        super.discoverEdge( edge );
+        
+        String scope = edge.getScope();
+
+        if ( !rootEdgePredicate.evaluate( edge ) )
+        {
+            // Not a root edge.  Set the scope.
+            scope = (String) scopeStack.peek();
+            edge.setScope( scope );
+        }
+        
+        // Push the scope used onto the stack.
+        scopeStack.push( scope );
+    }
+
+    public void finishEdge( DependencyGraphEdge edge )
+    {
+        super.finishEdge( edge );
+
+        scopeStack.pop();
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/tasks/UpdateScopesVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,73 @@
+package org.apache.maven.archiva.dependency.graph.walk;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+
+/**
+ * The Baseline Visitor.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class BaseVisitor
+    implements DependencyGraphVisitor
+{
+    private static DependencyGraphVisitor INSTANCE = new BaseVisitor();
+    
+    protected DependencyGraph graph;
+
+    public static DependencyGraphVisitor getInstance()
+    {
+        return INSTANCE;
+    }
+
+    public void discoverEdge( DependencyGraphEdge edge )
+    {
+        /* do nothing */
+    }
+
+    public void discoverGraph( DependencyGraph graph )
+    {
+        this.graph = graph;
+    }
+
+    public void discoverNode( DependencyGraphNode node )
+    {
+        /* do nothing */
+    }
+
+    public void finishEdge( DependencyGraphEdge edge )
+    {
+        /* do nothing */
+    }
+
+    public void finishGraph( DependencyGraph graph )
+    {
+        /* do nothing */
+    }
+
+    public void finishNode( DependencyGraphNode node )
+    {
+        /* do nothing */
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/BaseVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,76 @@
+package org.apache.maven.archiva.dependency.graph.walk;
+
+/*
+ * 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 org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+
+/**
+ * Interface for progress during search.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public interface DependencyGraphVisitor
+{
+    /**
+     * Called once, for when the graph itself is discovered.
+     * 
+     * @param graph the graph that was discovered.
+     */
+    public void discoverGraph( DependencyGraph graph );
+
+    /**
+     * Called for each node, when that node is visited.
+     * 
+     * @param node the node that is being visited.
+     */
+    public void discoverNode( DependencyGraphNode node );
+
+    /**
+     * Called for each edge, when that edge is visited.
+     * 
+     * @param edge the edge that is being visited.
+     */
+    public void discoverEdge( DependencyGraphEdge edge );
+
+    /**
+     * Called for each edge, when that edge has been fully visited.
+     * 
+     * @param edge the edge that was finished being visited.
+     */
+    public void finishEdge( DependencyGraphEdge edge );
+
+    /**
+     * Called for each node, when the node has been fully visited.
+     * 
+     * @param node the node that was finished being visited.
+     */
+    public void finishNode( DependencyGraphNode node );
+
+    /**
+     * Called once, for when the graph is finished being visited.
+     * 
+     * @param graph the graph that finished being visited.
+     */
+    public void finishGraph( DependencyGraph graph );
+
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,89 @@
+package org.apache.maven.archiva.dependency.graph.walk;
+
+/*
+ * 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 org.apache.commons.collections.Predicate;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.model.ArtifactReference;
+
+/**
+ * Walk nodes of the {@link DependencyGraph}. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public interface DependencyGraphWalker
+{
+    /**
+     * A {@link #getNodeVisitState(ArtifactReference)} for a node not yet seen in the walker.
+     */
+    public static final Integer UNSEEN = new Integer( 0 );
+
+    /**
+     * A {@link #getNodeVisitState(ArtifactReference)} for a node that is actively being processed, 
+     * but not yet finished processing.
+     */
+    public static final Integer PROCESSING = new Integer( 1 );
+
+    /**
+     * A {@link #getNodeVisitState(ArtifactReference)} for a node that has been seen, and fully processed.
+     */
+    public static final Integer SEEN = new Integer( 2 );
+
+    /**
+     * For a provided node, get the current node visit state.
+     *  
+     * @param node the node that you are interested in.
+     * @return the state of that node. (Can be {@link #UNSEEN}, {@link #PROCESSING}, or {@link #SEEN} )
+     */
+    public Integer getNodeVisitState( ArtifactReference artifact );
+
+    /**
+     * Get the predicate used to determine if the walker should traverse an edge (or not).
+     * 
+     * @return the Predicate that returns true for edges that should be traversed.
+     */
+    public Predicate getEdgePredicate();
+
+    /**
+     * Set the predicate used for edge traversal
+     * 
+     * @param edgePredicate the Predicate that returns true for edges that should be traversed.
+     */
+    public void setEdgePredicate( Predicate edgePredicate );
+
+    /**
+     * Visit every node and edge in the graph from the startNode.
+     * 
+     * @param graph the graph to visit.
+     * @param startNode the node to start the visit on.
+     * @param visitor the visitor object to use during this visit. 
+     */
+    public void visit( DependencyGraph graph, DependencyGraphNode startNode, DependencyGraphVisitor visitor );
+
+    /**
+     * Visit every node and edge in the entire graph.
+     * 
+     * @param graph the graph to visit.
+     * @param visitor the visitor object to use during this visit. 
+     */
+    public void visit( DependencyGraph graph, DependencyGraphVisitor visitor );
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/DependencyGraphWalker.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,157 @@
+package org.apache.maven.archiva.dependency.graph.walk;
+
+/*
+ * 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 org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.functors.NotPredicate;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.functors.EdgeDisabledPredicate;
+import org.apache.maven.archiva.model.ArtifactReference;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * WalkBreadthFirstSearch 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class WalkBreadthFirstSearch
+    implements DependencyGraphWalker
+{
+    private Map nodeVisitStates = new HashMap();
+
+    private Predicate edgePredicate;
+
+    public WalkBreadthFirstSearch()
+    {
+        this.edgePredicate = NotPredicate.getInstance( new EdgeDisabledPredicate() );
+    }
+
+    public Predicate getEdgePredicate()
+    {
+        return this.edgePredicate;
+    }
+
+    public void setEdgePredicate( Predicate edgePredicate )
+    {
+        this.edgePredicate = edgePredicate;
+    }
+
+    public Integer getNodeVisitState( DependencyGraphNode node )
+    {
+        return (Integer) nodeVisitStates.get( node.getArtifact() );
+    }
+
+    public Integer getNodeVisitState( ArtifactReference artifact )
+    {
+        return (Integer) nodeVisitStates.get( artifact );
+    }
+
+    public void setNodeVisitState( DependencyGraphNode node, Integer state )
+    {
+        this.nodeVisitStates.put( node.getArtifact(), state );
+    }
+
+    public void setNodeVisitState( ArtifactReference artifact, Integer state )
+    {
+        this.nodeVisitStates.put( artifact, state );
+    }
+
+    private void visitEdge( DependencyGraph graph, DependencyGraphEdge e, DependencyGraphVisitor visitor )
+    {
+        visitor.discoverEdge( e );
+
+        DependencyGraphNode node = graph.getNode( e.getNodeTo() );
+
+        if ( getNodeVisitState( node ) == UNSEEN )
+        {
+            setNodeVisitState( node, PROCESSING );
+        }
+
+        visitor.finishEdge( e );
+    }
+
+    private void visitNode( DependencyGraph graph, DependencyGraphNode node, DependencyGraphVisitor visitor )
+    {
+        setNodeVisitState( node, PROCESSING );
+
+        visitor.discoverNode( node );
+
+        Iterator edges;
+        // First dive down edges.
+        edges = graph.getEdgesFrom( node ).iterator();
+        while ( edges.hasNext() )
+        {
+            DependencyGraphEdge e = (DependencyGraphEdge) edges.next();
+            if ( this.edgePredicate.evaluate( e ) )
+            {
+                visitEdge( graph, e, visitor );
+            }
+        }
+
+        // Next move down edges.
+        edges = graph.getEdgesFrom( node ).iterator();
+        while ( edges.hasNext() )
+        {
+            DependencyGraphEdge e = (DependencyGraphEdge) edges.next();
+
+            if ( this.edgePredicate.evaluate( e ) )
+            {
+                DependencyGraphNode nodeTo = graph.getNode( e.getNodeTo() );
+                Integer state = getNodeVisitState( nodeTo );
+                if ( ( state == UNSEEN ) || ( state == PROCESSING ) )
+                {
+                    visitNode( graph, nodeTo, visitor );
+                }
+            }
+        }
+
+        visitor.finishNode( node );
+
+        setNodeVisitState( node, SEEN );
+    }
+
+    public void visit( DependencyGraph graph, DependencyGraphVisitor visitor )
+    {
+        visit( graph, graph.getRootNode(), visitor );
+    }
+
+    public void visit( DependencyGraph graph, DependencyGraphNode startNode, DependencyGraphVisitor visitor )
+    {
+        nodeVisitStates.clear();
+
+        Iterator nodes = graph.getNodes().iterator();
+        while ( nodes.hasNext() )
+        {
+            setNodeVisitState( (DependencyGraphNode) nodes.next(), UNSEEN );
+        }
+
+        visitor.discoverGraph( graph );
+
+        visitNode( graph, startNode, visitor );
+
+        visitor.finishGraph( graph );
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkBreadthFirstSearch.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,145 @@
+package org.apache.maven.archiva.dependency.graph.walk;
+
+/*
+ * 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 org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.functors.NotPredicate;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.functors.EdgeDisabledPredicate;
+import org.apache.maven.archiva.model.ArtifactReference;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * Perform a walk of the graph using the DepthFirstSearch algorithm.
+ * 
+ * NOTE: Default edgePredicate is to NOT traverse disabled edges.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class WalkDepthFirstSearch
+    implements DependencyGraphWalker
+{
+    private Map nodeVisitStates = new HashMap();
+
+    private Predicate edgePredicate;
+
+    public WalkDepthFirstSearch()
+    {
+        this.edgePredicate = NotPredicate.getInstance( new EdgeDisabledPredicate() );
+    }
+
+    public Predicate getEdgePredicate()
+    {
+        return this.edgePredicate;
+    }
+
+    public void setEdgePredicate( Predicate edgePredicate )
+    {
+        this.edgePredicate = edgePredicate;
+    }
+
+    public Integer getNodeVisitState( DependencyGraphNode node )
+    {
+        if ( node == null )
+        {
+            return SEEN;
+        }
+
+        return (Integer) nodeVisitStates.get( node.getArtifact() );
+    }
+
+    public Integer getNodeVisitState( ArtifactReference artifact )
+    {
+        return (Integer) nodeVisitStates.get( artifact );
+    }
+
+    public void setNodeVisitState( DependencyGraphNode node, Integer state )
+    {
+        this.nodeVisitStates.put( node.getArtifact(), state );
+    }
+
+    public void setNodeVisitState( ArtifactReference artifact, Integer state )
+    {
+        this.nodeVisitStates.put( artifact, state );
+    }
+
+    private void visitEdge( DependencyGraph graph, DependencyGraphEdge e, DependencyGraphVisitor visitor )
+    {
+        visitor.discoverEdge( e );
+
+        DependencyGraphNode node = graph.getNode( e.getNodeTo() );
+
+        if ( getNodeVisitState( node ) == UNSEEN )
+        {
+            visitNode( graph, node, visitor );
+        }
+
+        visitor.finishEdge( e );
+    }
+
+    private void visitNode( DependencyGraph graph, DependencyGraphNode node, DependencyGraphVisitor visitor )
+    {
+        setNodeVisitState( node, PROCESSING );
+
+        visitor.discoverNode( node );
+
+        Iterator edges = graph.getEdgesFrom( node ).iterator();
+        while ( edges.hasNext() )
+        {
+            DependencyGraphEdge e = (DependencyGraphEdge) edges.next();
+            if ( this.edgePredicate.evaluate( e ) )
+            {
+                visitEdge( graph, e, visitor );
+            }
+        }
+
+        visitor.finishNode( node );
+
+        setNodeVisitState( node, SEEN );
+    }
+
+    public void visit( DependencyGraph graph, DependencyGraphVisitor visitor )
+    {
+        visit( graph, graph.getRootNode(), visitor );
+    }
+
+    public void visit( DependencyGraph graph, DependencyGraphNode startNode, DependencyGraphVisitor visitor )
+    {
+        nodeVisitStates.clear();
+
+        Iterator nodes = graph.getNodes().iterator();
+        while ( nodes.hasNext() )
+        {
+            setNodeVisitState( (DependencyGraphNode) nodes.next(), UNSEEN );
+        }
+
+        visitor.discoverGraph( graph );
+
+        visitNode( graph, startNode, visitor );
+
+        visitor.finishGraph( graph );
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-dependency-graph/src/main/java/org/apache/maven/archiva/dependency/graph/walk/WalkDepthFirstSearch.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain