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/17 06:50:09 UTC

svn commit: r548008 [1/2] - in /maven/archiva/trunk: archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache...

Author: joakime
Date: Sat Jun 16 21:50:05 2007
New Revision: 548008

URL: http://svn.apache.org/viewvc?view=rev&rev=548008
Log:
[MRM-410] Dependency Tree is not shown in artifact details screen.
* Refactored project resolution into ProjectModelResolverFactory component.
* All resolution access points now use this factory.
* Created ResolverFactoryInit as plexus component load-on-start, to hookup database to resolver stack.
* Created archiva:dependency-tree taglib


Added:
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java   (with props)
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java   (with props)
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java   (with props)
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java   (with props)
    maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/
    maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/DatabaseProjectModelResolver.java
      - copied, changed from r547276, maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/project/DatabaseProjectModelResolver.java
    maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/artifact/
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/artifact/dependencyTree.jsp   (with props)
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/artifactDecorator.jsp   (with props)
Removed:
    maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/project/
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/RepositoryProjectModelResolverFactory.java
Modified:
    maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
    maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/RepositoryProjectResolver.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java
    maven/archiva/trunk/archiva-database/pom.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/Banner.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ConfigurationSynchronization.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/taglib.tld
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/decorators.xml
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/database.jsp
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/dependencyTree.jspf

Modified: maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java Sat Jun 16 21:50:05 2007
@@ -21,39 +21,30 @@
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
-import org.apache.maven.archiva.configuration.ConfigurationNames;
 import org.apache.maven.archiva.configuration.RepositoryConfiguration;
 import org.apache.maven.archiva.consumers.AbstractMonitoredConsumer;
 import org.apache.maven.archiva.consumers.ConsumerException;
 import org.apache.maven.archiva.consumers.DatabaseUnprocessedArtifactConsumer;
-import org.apache.maven.archiva.consumers.database.project.WrappedDatabaseProjectModelResolver;
 import org.apache.maven.archiva.database.ArchivaDAO;
 import org.apache.maven.archiva.database.ArchivaDatabaseException;
 import org.apache.maven.archiva.database.ObjectNotFoundException;
 import org.apache.maven.archiva.model.ArchivaArtifact;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
-import org.apache.maven.archiva.model.RepositoryURL;
 import org.apache.maven.archiva.model.RepositoryProblem;
+import org.apache.maven.archiva.model.RepositoryURL;
+import org.apache.maven.archiva.reporting.artifact.CorruptArtifactReport;
 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
-import org.apache.maven.archiva.repository.layout.LayoutException;
 import org.apache.maven.archiva.repository.layout.FilenameParts;
+import org.apache.maven.archiva.repository.layout.LayoutException;
 import org.apache.maven.archiva.repository.layout.RepositoryLayoutUtils;
 import org.apache.maven.archiva.repository.project.ProjectModelException;
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
 import org.apache.maven.archiva.repository.project.ProjectModelReader;
-import org.apache.maven.archiva.repository.project.ProjectModelResolver;
 import org.apache.maven.archiva.repository.project.filters.EffectiveProjectModelFilter;
-import org.apache.maven.archiva.repository.project.resolvers.RepositoryProjectModelResolverFactory;
-import org.apache.maven.archiva.reporting.artifact.CorruptArtifactReport;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
-import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
-import org.codehaus.plexus.registry.Registry;
-import org.codehaus.plexus.registry.RegistryListener;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -68,7 +59,7 @@
  */
 public class ProjectModelToDatabaseConsumer
     extends AbstractMonitoredConsumer
-    implements DatabaseUnprocessedArtifactConsumer, RegistryListener, Initializable
+    implements DatabaseUnprocessedArtifactConsumer
 {
     /**
      * @plexus.configuration default-value="update-db-project"
@@ -111,21 +102,12 @@
     private ProjectModelFilter expressionModelFilter;
 
     /**
-     * @plexus.requirement
-     */
-    private RepositoryProjectModelResolverFactory resolverFactory;
-
-    /**
-     * @plexus.requirement role="org.apache.maven.archiva.repository.project.ProjectModelFilter"
-     *                     role-hint="effective"
+     * @plexus.requirement 
+     *          role="org.apache.maven.archiva.repository.project.ProjectModelFilter"
+     *          role-hint="effective"
      */
     private EffectiveProjectModelFilter effectiveModelFilter;
 
-    /**
-     * @plexus.requirement role-hint="database"
-     */
-    private ProjectModelResolver databaseResolver;
-
     private List includes;
 
     public ProjectModelToDatabaseConsumer()
@@ -185,14 +167,13 @@
             // Resolve the project model
             model = effectiveModelFilter.filter( model );
 
-            if( isValidModel( model, artifact ) )
+            if ( isValidModel( model, artifact ) )
             {
                 dao.getProjectModelDAO().saveProjectModel( model );
             }
             else
             {
-                getLogger().warn( "Invalid or corrupt pom. Project model " + model
-                    + " was not added in the database." );
+                getLogger().warn( "Invalid or corrupt pom. Project model " + model + " was not added in the database." );
             }
 
             dao.getProjectModelDAO().saveProjectModel( model );
@@ -200,7 +181,7 @@
         catch ( ProjectModelException e )
         {
             getLogger().warn( "Unable to read project model " + artifactFile + " : " + e.getMessage(), e );
-                        
+
             addProblem( artifact, "Unable to read project model " + artifactFile + " : " + e.getMessage() );
         }
         catch ( ArchivaDatabaseException e )
@@ -273,50 +254,10 @@
 
     public boolean isPermanent()
     {
+        // Tells the configuration that this consumer cannot be disabled.
         return true;
     }
 
-    public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
-    {
-        /* nothing to do here */
-    }
-
-    public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
-    {
-        if ( ConfigurationNames.isRepositories( propertyName ) )
-        {
-            update();
-        }
-    }
-
-    public void initialize()
-        throws InitializationException
-    {
-        update();
-        archivaConfiguration.addChangeListener( this );
-    }
-
-    private void update()
-    {
-        synchronized ( effectiveModelFilter )
-        {
-            effectiveModelFilter.getProjectModelResolverStack().clearResolvers();
-
-            // Add the database resolver first!
-            effectiveModelFilter.getProjectModelResolverStack().addProjectModelResolver( databaseResolver );
-
-            List ret = this.resolverFactory.getAllResolvers();
-            Iterator it = ret.iterator();
-            while ( it.hasNext() )
-            {
-                ProjectModelResolver resolver = (ProjectModelResolver) it.next();
-                // TODO: Use listener to perform database saving of found models, instead of wrapped resolver.
-                ProjectModelResolver wrapped = new WrappedDatabaseProjectModelResolver( dao, resolver );
-                effectiveModelFilter.getProjectModelResolverStack().addProjectModelResolver( wrapped );
-            }
-        }
-    }
-
     private String toPath( ArchivaArtifact artifact )
     {
         try
@@ -341,34 +282,39 @@
             FilenameParts parts = RepositoryLayoutUtils.splitFilename( artifactFile.getName(), null );
             if ( !parts.artifactId.equalsIgnoreCase( model.getArtifactId() ) )
             {
-                getLogger().warn( "Project Model " + model + " artifactId: " + model.getArtifactId() +
-                    " does not match the pom file's artifactId: " + parts.artifactId );
+                getLogger().warn(
+                                  "Project Model " + model + " artifactId: " + model.getArtifactId()
+                                      + " does not match the pom file's artifactId: " + parts.artifactId );
 
-                addProblem( artifact, "Project Model " + model + " artifactId: " + model.getArtifactId() +
-                    " does not match the pom file's artifactId: " + parts.artifactId );
+                addProblem( artifact, "Project Model " + model + " artifactId: " + model.getArtifactId()
+                    + " does not match the pom file's artifactId: " + parts.artifactId );
 
                 return false;
             }
 
             if ( !parts.version.equalsIgnoreCase( model.getVersion() ) )
             {
-                getLogger().warn( "Project Model " + model + " artifactId: " + model.getArtifactId() +
-                    " does not match the pom file's artifactId: " + parts.artifactId );
+                getLogger().warn(
+                                  "Project Model " + model + " artifactId: " + model.getArtifactId()
+                                      + " does not match the pom file's artifactId: " + parts.artifactId );
 
-                addProblem( artifact, "Project Model " + model + " version: " + model.getVersion() +
-                    " does not match the pom file's version: " + parts.version );
+                addProblem( artifact, "Project Model " + model + " version: " + model.getVersion()
+                    + " does not match the pom file's version: " + parts.version );
 
                 return false;
             }
 
             //check if the file name matches the values indicated in the pom
-           if( !artifactFile.getName().equalsIgnoreCase( model.getArtifactId() + "-" + model.getVersion() + "-" + parts.classifier) )
+            if ( !artifactFile.getName().equalsIgnoreCase(
+                                                           model.getArtifactId() + "-" + model.getVersion() + "-"
+                                                               + parts.classifier ) )
             {
-                getLogger().warn( "Artifact " + artifact + " does not match the artifactId and/or version " +
-                    "specified in the project model " + model );
+                getLogger().warn(
+                                  "Artifact " + artifact + " does not match the artifactId and/or version "
+                                      + "specified in the project model " + model );
 
-                addProblem( artifact, "Artifact " + artifact + " does not match the artifactId and/or version " +
-                    "specified in the project model " + model );
+                addProblem( artifact, "Artifact " + artifact + " does not match the artifactId and/or version "
+                    + "specified in the project model " + model );
 
                 return false;
             }

Modified: maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml (original)
+++ maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml Sat Jun 16 21:50:05 2007
@@ -1445,7 +1445,8 @@
           <name>otherArchives</name>
           <version>1.0.0+</version>
           <description>The email address to subscribe to this mailing list.</description>
-          <association>
+          <association stash.part="true"
+                       jpox.join="false">
             <type>String</type>
             <multiplicity>*</multiplicity>
           </association>

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,167 @@
+package org.apache.maven.archiva.repository.project;
+
+/*
+ * 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.lang.StringUtils;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.ConfigurationNames;
+import org.apache.maven.archiva.configuration.RepositoryConfiguration;
+import org.apache.maven.archiva.configuration.functors.LocalRepositoryPredicate;
+import org.apache.maven.archiva.model.ArchivaRepository;
+import org.apache.maven.archiva.repository.ArchivaConfigurationAdaptor;
+import org.apache.maven.archiva.repository.RepositoryException;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
+import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+import org.apache.maven.archiva.repository.project.resolvers.NopProjectResolver;
+import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolverStack;
+import org.apache.maven.archiva.repository.project.resolvers.RepositoryProjectResolver;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+import org.codehaus.plexus.registry.Registry;
+import org.codehaus.plexus.registry.RegistryListener;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Factory for ProjectModelResolver objects 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component role="org.apache.maven.archiva.repository.project.ProjectModelResolverFactory"
+ */
+public class ProjectModelResolverFactory
+    extends AbstractLogEnabled
+    implements RegistryListener, Initializable
+{
+    /**
+     * @plexus.requirement
+     */
+    private ArchivaConfiguration archivaConfiguration;
+
+    /**
+     * @plexus.requirement
+     */
+    private BidirectionalRepositoryLayoutFactory layoutFactory;
+
+    /**
+     * @plexus.requirement role-hint="model400"
+     */
+    private ProjectModelReader project400Reader;
+
+    /**
+     * @plexus.requirement role-hint="model300"
+     */
+    private ProjectModelReader project300Reader;
+
+    private ProjectModelResolverStack currentResolverStack = new ProjectModelResolverStack();
+
+    public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
+    {
+        if ( ConfigurationNames.isRepositories( propertyName ) )
+        {
+            update();
+        }
+    }
+
+    public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
+    {
+        /* do nothing */
+    }
+
+    public ProjectModelResolverStack getCurrentResolverStack()
+    {
+        return currentResolverStack;
+    }
+
+    public void initialize()
+        throws InitializationException
+    {
+        update();
+        archivaConfiguration.addChangeListener( this );
+    }
+
+    private RepositoryProjectResolver toResolver( ArchivaRepository repo )
+        throws RepositoryException
+    {
+        if ( !repo.isManaged() )
+        {
+            throw new RepositoryException( "Unable to create RepositoryProjectResolver from non-managed repository: "
+                + repo );
+        }
+
+        try
+        {
+            BidirectionalRepositoryLayout layout = layoutFactory.getLayout( repo.getLayoutType() );
+            ProjectModelReader reader = project400Reader;
+
+            if ( StringUtils.equals( "legacy", repo.getLayoutType() ) )
+            {
+                reader = project300Reader;
+            }
+
+            RepositoryProjectResolver resolver = new RepositoryProjectResolver( repo, reader, layout );
+            return resolver;
+        }
+        catch ( LayoutException e )
+        {
+            throw new RepositoryException( "Unable to create RepositoryProjectResolver due to invalid layout spec: "
+                + repo );
+        }
+    }
+
+    private void update()
+    {
+        synchronized ( currentResolverStack )
+        {
+            this.currentResolverStack.clearResolvers();
+
+            List configLocalRepos = new ArrayList();
+            CollectionUtils.select( archivaConfiguration.getConfiguration().getRepositories(), LocalRepositoryPredicate
+                .getInstance(), configLocalRepos );
+
+            Iterator it = configLocalRepos.iterator();
+            while ( it.hasNext() )
+            {
+                RepositoryConfiguration repoconfig = (RepositoryConfiguration) it.next();
+                ArchivaRepository repo = ArchivaConfigurationAdaptor.toArchivaRepository( repoconfig );
+                try
+                {
+                    RepositoryProjectResolver resolver = toResolver( repo );
+
+                    // Add filesystem based resolver.
+                    this.currentResolverStack.addProjectModelResolver( resolver );
+                }
+                catch ( RepositoryException e )
+                {
+                    getLogger().warn( e.getMessage(), e );
+                }
+            }
+
+            // Add no-op resolver.
+            this.currentResolverStack.addProjectModelResolver( NopProjectResolver.getInstance() );
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelResolverFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java Sat Jun 16 21:50:05 2007
@@ -27,20 +27,32 @@
 import org.apache.maven.archiva.model.ArtifactReference;
 import org.apache.maven.archiva.model.VersionedReference;
 import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelResolverFactory;
 import org.apache.maven.archiva.repository.project.filters.EffectiveProjectModelFilter;
-import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolverStack;
 
 /**
  * ProjectModelBasedGraphBuilder 
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  * @version $Id$
+ * 
+ * @plexus.component 
+ *              role="org.apache.maven.archiva.dependency.graph.DependencyGraphBuilder"
+ *              role-hint="project-model"
  */
 public class ProjectModelBasedGraphBuilder
     implements DependencyGraphBuilder
 {
-    private ProjectModelResolverStack modelResolver;
-
+    /**
+     * @plexus.requirement
+     */
+    private ProjectModelResolverFactory resolverFactory;
+
+    /**
+     * @plexus.requirement 
+     *          role="org.apache.maven.archiva.repository.project.ProjectModelFilter"
+     *          role-hint="effective"
+     */
     private EffectiveProjectModelFilter effectiveFilter = new EffectiveProjectModelFilter();
 
     public DependencyGraph createGraph( VersionedReference versionedProjectReference )
@@ -57,7 +69,7 @@
                              VersionedReference versionedProjectReference )
     {
         ArchivaProjectModel model = resolveModel( fromNode.getArtifact() );
-        
+
         DependencyGraphUtils.addNodeFromModel( model, graph, fromNode );
     }
 
@@ -69,7 +81,7 @@
         projectRef.setArtifactId( reference.getArtifactId() );
         projectRef.setVersion( reference.getVersion() );
 
-        ArchivaProjectModel model = modelResolver.findProject( projectRef );
+        ArchivaProjectModel model = resolverFactory.getCurrentResolverStack().findProject( projectRef );
 
         if ( model == null )
         {
@@ -78,8 +90,6 @@
 
         try
         {
-            effectiveFilter.setProjectModelResolverStack( modelResolver );
-
             ArchivaProjectModel processedModel = effectiveFilter.filter( model );
 
             return processedModel;
@@ -102,15 +112,5 @@
         model.setVersion( reference.getVersion() );
         model.setPackaging( reference.getType() );
         return model;
-    }
-
-    public ProjectModelResolverStack getModelResolver()
-    {
-        return modelResolver;
-    }
-
-    public void setModelResolver( ProjectModelResolverStack modelResolver )
-    {
-        this.modelResolver = modelResolver;
     }
 }

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java Sat Jun 16 21:50:05 2007
@@ -28,7 +28,7 @@
 import org.apache.maven.archiva.repository.project.ProjectModelException;
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
 import org.apache.maven.archiva.repository.project.ProjectModelMerge;
-import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolverStack;
+import org.apache.maven.archiva.repository.project.ProjectModelResolverFactory;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.logging.console.ConsoleLogger;
@@ -52,22 +52,10 @@
 {
     private ProjectModelFilter expressionFilter = new ProjectModelExpressionFilter();
 
-    private ProjectModelResolverStack projectModelResolverStack;
-
-    public EffectiveProjectModelFilter()
-    {
-        projectModelResolverStack = new ProjectModelResolverStack();
-    }
-
-    public void setProjectModelResolverStack( ProjectModelResolverStack resolverStack )
-    {
-        this.projectModelResolverStack = resolverStack;
-    }
-
-    public ProjectModelResolverStack getProjectModelResolverStack()
-    {
-        return this.projectModelResolverStack;
-    }
+    /**
+     * @plexus.requirement
+     */
+    private ProjectModelResolverFactory resolverFactory;
 
     /**
      * Take the provided {@link ArchivaProjectModel} and build the effective {@link ArchivaProjectModel}.
@@ -89,7 +77,7 @@
             return null;
         }
 
-        if ( this.projectModelResolverStack.isEmpty() )
+        if ( resolverFactory.getCurrentResolverStack().isEmpty() )
         {
             throw new IllegalStateException( "Unable to build effective pom with no project model resolvers defined." );
         }
@@ -171,7 +159,7 @@
             getLogger().debug( "Has parent: " + parentRef );
 
             // Find parent using resolvers.
-            ArchivaProjectModel parentProject = this.projectModelResolverStack.findProject( parentRef );
+            ArchivaProjectModel parentProject = this.resolverFactory.getCurrentResolverStack().findProject( parentRef );
 
             if ( parentProject != null )
             {

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,41 @@
+package org.apache.maven.archiva.repository.project.resolvers;
+
+/*
+ * 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.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+
+/**
+ * FalseProjectResolver will never resolver a model. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class FalseProjectResolver
+    implements ProjectModelResolver
+{
+    public ArchivaProjectModel resolveProjectModel( VersionedReference reference )
+        throws ProjectModelException
+    {
+        throw new ProjectModelException( "Cannot resolve model in FalseProjectResolver." );
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FalseProjectResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,32 @@
+package org.apache.maven.archiva.repository.project.resolvers;
+
+/*
+ * 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.
+ */
+
+/**
+ * Tag for RepositoryProjectResolver's to indicate that it is basing
+ * it's resolution from the Filesystem.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public interface FilesystemBasedResolver
+{
+
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/FilesystemBasedResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,59 @@
+package org.apache.maven.archiva.repository.project.resolvers;
+
+/*
+ * 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.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+
+/**
+ * A No-op Project Resolver, perform no lookup, just returns the requested
+ * information in the form of a simple ArchviaProjectModel.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class NopProjectResolver
+    implements ProjectModelResolver
+{
+    private static NopProjectResolver INSTANCE = new NopProjectResolver();
+
+    public static NopProjectResolver getInstance()
+    {
+        return INSTANCE;
+    }
+
+    public ArchivaProjectModel resolveProjectModel( VersionedReference reference )
+        throws ProjectModelException
+    {
+        ArchivaProjectModel model = new ArchivaProjectModel();
+
+        model.setGroupId( reference.getGroupId() );
+        model.setArtifactId( reference.getArtifactId() );
+        model.setVersion( reference.getVersion() );
+        model.setPackaging( "pom" );
+
+        model.setOrigin( "nop" );
+
+        return model;
+    }
+
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/NopProjectResolver.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java Sat Jun 16 21:50:05 2007
@@ -35,6 +35,8 @@
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  * @version $Id$
+ * 
+ * @plexus.component role="org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolverStack"
  */
 public class ProjectModelResolverStack
 {
@@ -113,9 +115,24 @@
         return null;
     }
 
+    public boolean hasResolver( ProjectModelResolver resolver )
+    {
+        return this.resolvers.contains( resolver );
+    }
+
     public boolean isEmpty()
     {
         return this.resolvers.isEmpty();
+    }
+
+    public void prependProjectModelResolver( ProjectModelResolver resolver )
+    {
+        if ( resolver == null )
+        {
+            return;
+        }
+
+        this.resolvers.add( 0, resolver );
     }
 
     public void removeListener( ProjectModelResolutionListener listener )

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/RepositoryProjectResolver.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/RepositoryProjectResolver.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/RepositoryProjectResolver.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/RepositoryProjectResolver.java Sat Jun 16 21:50:05 2007
@@ -37,7 +37,7 @@
  * @version $Id$
  */
 public class RepositoryProjectResolver
-    implements ProjectModelResolver
+    implements ProjectModelResolver, FilesystemBasedResolver
 {
     private ArchivaRepository repository;
 
@@ -45,7 +45,8 @@
 
     private BidirectionalRepositoryLayout layout;
 
-    public RepositoryProjectResolver( ArchivaRepository repository, ProjectModelReader reader, BidirectionalRepositoryLayout layout )
+    public RepositoryProjectResolver( ArchivaRepository repository, ProjectModelReader reader,
+                                      BidirectionalRepositoryLayout layout )
     {
         this.repository = repository;
         this.reader = reader;

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java Sat Jun 16 21:50:05 2007
@@ -29,6 +29,7 @@
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
 import org.apache.maven.archiva.repository.project.ProjectModelReader;
 import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+import org.apache.maven.archiva.repository.project.ProjectModelResolverFactory;
 import org.apache.maven.archiva.repository.project.readers.ProjectModel400Reader;
 import org.apache.maven.archiva.repository.project.resolvers.RepositoryProjectResolver;
 import org.codehaus.plexus.PlexusTestCase;
@@ -83,10 +84,9 @@
     public void testBuildEffectiveProject()
         throws Exception
     {
+        initTestResolverFactory();
         EffectiveProjectModelFilter filter = lookupEffective();
 
-        filter.getProjectModelResolverStack().addProjectModelResolver( createDefaultRepositoryResolver() );
-
         ArchivaProjectModel startModel = createArchivaProjectModel( DEFAULT_REPOSITORY
             + "/org/apache/maven/archiva/archiva-model/1.0-SNAPSHOT/archiva-model-1.0-SNAPSHOT.pom" );
 
@@ -96,6 +96,17 @@
             + "/archiva-model-effective.pom" );
 
         assertModel( expectedModel, effectiveModel );
+    }
+
+    private ProjectModelResolverFactory initTestResolverFactory()
+        throws Exception
+    {
+        ProjectModelResolverFactory resolverFactory = (ProjectModelResolverFactory) lookup( ProjectModelResolverFactory.class );
+
+        resolverFactory.getCurrentResolverStack().clearResolvers();
+        resolverFactory.getCurrentResolverStack().addProjectModelResolver( createDefaultRepositoryResolver() );
+
+        return resolverFactory;
     }
 
     private void assertModel( ArchivaProjectModel expectedModel, ArchivaProjectModel effectiveModel )

Modified: maven/archiva/trunk/archiva-database/pom.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-database/pom.xml?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-database/pom.xml (original)
+++ maven/archiva/trunk/archiva-database/pom.xml Sat Jun 16 21:50:05 2007
@@ -30,6 +30,10 @@
   <dependencies>
     <dependency>
       <groupId>org.apache.maven.archiva</groupId>
+      <artifactId>archiva-repository-layer</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.archiva</groupId>
       <artifactId>archiva-consumer-api</artifactId>
     </dependency>
     <dependency>
@@ -100,11 +104,6 @@
     <dependency>
       <groupId>org.codehaus.plexus.registry</groupId>
       <artifactId>plexus-registry-commons</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.archiva</groupId>
-      <artifactId>archiva-repository-layer</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>

Copied: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/DatabaseProjectModelResolver.java (from r547276, maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/project/DatabaseProjectModelResolver.java)
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/DatabaseProjectModelResolver.java?view=diff&rev=548008&p1=maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/project/DatabaseProjectModelResolver.java&r1=547276&p2=maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/DatabaseProjectModelResolver.java&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/project/DatabaseProjectModelResolver.java (original)
+++ maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/DatabaseProjectModelResolver.java Sat Jun 16 21:50:05 2007
@@ -1,4 +1,4 @@
-package org.apache.maven.archiva.consumers.database.project;
+package org.apache.maven.archiva.database.project;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one

Added: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java (added)
+++ maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,153 @@
+package org.apache.maven.archiva.database.project;
+
+/*
+ * 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.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArchivaDatabaseException;
+import org.apache.maven.archiva.database.ObjectNotFoundException;
+import org.apache.maven.archiva.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+import org.apache.maven.archiva.repository.project.resolvers.FilesystemBasedResolver;
+import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolutionListener;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.util.List;
+
+/**
+ * Just in Time save of project models to the database, implemented as a listener
+ * on {@link ProjectModelResolver} objects that implement {@link FilesystemBasedResolver}.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *              role="org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolutionListener"
+ *              role-hint="model-to-db"
+ */
+public class ProjectModelToDatabaseListener
+    extends AbstractLogEnabled
+    implements ProjectModelResolutionListener
+{
+    /**
+     * @plexus.requirement role-hint="jdo"
+     */
+    private ArchivaDAO dao;
+
+    private void saveInDatabase( ArchivaProjectModel model )
+        throws ProjectModelException
+    {
+        try
+        {
+            dao.getProjectModelDAO().saveProjectModel( model );
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            throw new ProjectModelException( "Unable to save model to database: " + e.getMessage(), e );
+        }
+    }
+
+    private void removeFromDatabase( ArchivaProjectModel model )
+        throws ProjectModelException
+    {
+        try
+        {
+            dao.getProjectModelDAO().deleteProjectModel( model );
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            throw new ProjectModelException( "Unable to remove existing model from database: " + e.getMessage(), e );
+        }
+    }
+
+    private boolean existsInDatabase( ArchivaProjectModel model )
+        throws ProjectModelException
+    {
+        try
+        {
+            ArchivaProjectModel dbmodel = dao.getProjectModelDAO().getProjectModel( model.getGroupId(),
+                                                                                    model.getArtifactId(),
+                                                                                    model.getVersion() );
+
+            return ( dbmodel != null );
+        }
+        catch ( ObjectNotFoundException e )
+        {
+            return false;
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            throw new ProjectModelException( "Unable to check for existing model from database: " + e.getMessage(), e );
+        }
+    }
+
+    public void resolutionAttempting( VersionedReference projectRef, ProjectModelResolver resolver )
+    {
+        /* do nothing */
+    }
+
+    public void resolutionError( VersionedReference projectRef, ProjectModelResolver resolver, Exception cause )
+    {
+        /* do nothing */
+    }
+
+    public void resolutionMiss( VersionedReference projectRef, ProjectModelResolver resolver )
+    {
+        /* do nothing */
+    }
+
+    public void resolutionNotFound( VersionedReference projectRef, List resolverList )
+    {
+        /* do nothing */
+    }
+
+    public void resolutionStart( VersionedReference projectRef, List resolverList )
+    {
+        /* do nothing */
+    }
+
+    public void resolutionSuccess( VersionedReference projectRef, ProjectModelResolver resolver,
+                                   ArchivaProjectModel model )
+    {
+        if ( !( resolver instanceof FilesystemBasedResolver ) )
+        {
+            // Nothing to do. skip it.
+            return;
+        }
+
+        model.setOrigin( "filesystem" );
+
+        try
+        {
+            // Test if it exists.
+            if ( existsInDatabase( model ) )
+            {
+                removeFromDatabase( model );
+            }
+
+            saveInDatabase( model );
+        }
+        catch ( ProjectModelException e )
+        {
+            getLogger().warn( e.getMessage(), e );
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/project/ProjectModelToDatabaseListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java Sat Jun 16 21:50:05 2007
@@ -28,7 +28,6 @@
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -42,7 +41,7 @@
     implements Validateable
 {
     /* .\ Not Exposed \._____________________________________________ */
-    
+
     /**
      * @plexus.requirement role-hint="default"
      */
@@ -67,11 +66,6 @@
      * The list of artifacts that depend on this versioned project.
      */
     private List dependees;
-    
-    /**
-     * The list of dependencies in tree format
-     */
-    private List dependencyTree;
 
     /**
      * The reports associated with this versioned project.
@@ -80,7 +74,7 @@
 
     private List mailingLists;
 
-	private List dependencies;
+    private List dependencies;
 
     /**
      * Show the versioned project information tab.
@@ -96,11 +90,10 @@
         }
         catch ( ObjectNotFoundException oe )
         {
-            addActionError( "Unable to find project model for [" + groupId + ":" + artifactId
-                    + ":" + version + "]." );
+            addActionError( "Unable to find project model for [" + groupId + ":" + artifactId + ":" + version + "]." );
 
             return ERROR;
-        }             
+        }
 
         return SUCCESS;
     }
@@ -109,12 +102,12 @@
      * Show the artifact information tab.
      */
     public String dependencies()
-    throws ObjectNotFoundException, ArchivaDatabaseException
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
         this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
 
         this.dependencies = model.getDependencies();
-        
+
         return SUCCESS;
     }
 
@@ -122,23 +115,23 @@
      * Show the mailing lists information tab.
      */
     public String mailingLists()
-    throws ObjectNotFoundException, ArchivaDatabaseException
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
         this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
         this.mailingLists = model.getMailingLists();
-        
+
         return SUCCESS;
     }
-    
+
     /**
      * Show the reports tab.
      */
     public String reports()
-    throws ObjectNotFoundException, ArchivaDatabaseException
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
-        System.out.println("#### In reports.");
+        System.out.println( "#### In reports." );
         // TODO: hook up reports on project - this.reports = artifactsDatabase.findArtifactResults( groupId, artifactId, version );
-        System.out.println("#### Found " + reports.size() + " reports.");
+        System.out.println( "#### Found " + reports.size() + " reports." );
 
         return SUCCESS;
     }
@@ -147,7 +140,7 @@
      * Show the dependees (other artifacts that depend on this project) tab.
      */
     public String dependees()
-    throws ObjectNotFoundException, ArchivaDatabaseException
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
         this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
 
@@ -160,12 +153,10 @@
      * Show the dependencies of this versioned project tab.
      */
     public String dependencyTree()
-    throws ObjectNotFoundException, ArchivaDatabaseException
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
         this.model = repoBrowsing.selectVersion( groupId, artifactId, version );
 
-        this.dependencyTree = Collections.EMPTY_LIST;
-        
         return SUCCESS;
     }
 
@@ -237,14 +228,8 @@
         return dependencies;
     }
 
-
     public List getDependees()
     {
         return dependees;
-    }
-
-    public List getDependencyTree()
-    {
-        return dependencyTree;
     }
 }

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/Banner.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/Banner.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/Banner.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/Banner.java Sat Jun 16 21:50:05 2007
@@ -20,7 +20,10 @@
  */
 
 import org.apache.commons.lang.StringUtils;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -30,8 +33,14 @@
  *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  * @version $Id$
+ * 
+ * @plexus.component 
+ *              role="org.apache.maven.archiva.web.startup.Banner"
+ *              role-hint="default"
  */
 public class Banner
+    extends AbstractLogEnabled
+    implements Initializable
 {
     public static String encode( String raw )
     {
@@ -221,5 +230,11 @@
     {
         String banner = getBanner( version );
         logger.info( StringUtils.repeat( "_", 25 ) + "\n" + banner );
+    }
+    
+    public void initialize()
+        throws InitializationException
+    {
+        Banner.display( getLogger(), ArchivaVersion.determineVersion( this.getClass().getClassLoader() ) );
     }
 }

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ConfigurationSynchronization.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ConfigurationSynchronization.java?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ConfigurationSynchronization.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ConfigurationSynchronization.java Sat Jun 16 21:50:05 2007
@@ -44,8 +44,9 @@
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  * @version $Id$
  * 
- * @plexus.component role="org.apache.maven.archiva.web.startup.ConfigurationSynchronization"
- *                   role-hint="default"
+ * @plexus.component 
+ *              role="org.apache.maven.archiva.web.startup.ConfigurationSynchronization"
+ *              role-hint="default"
  */
 public class ConfigurationSynchronization
     extends AbstractLogEnabled
@@ -59,8 +60,8 @@
     /**
      * @plexus.requirement role-hint="default"
      */
-    RoleManager roleManager;
-    
+    private RoleManager roleManager;
+
     /**
      * @plexus.requirement
      */
@@ -109,40 +110,40 @@
                     ArchivaRepository drepo = ArchivaConfigurationAdaptor.toArchivaRepository( repoConfig );
                     drepo.getModel().setCreationSource( "configuration" );
                     dao.getRepositoryDAO().saveRepository( drepo );
-                }                                               
+                }
             }
             catch ( ArchivaDatabaseException e )
             {
                 // Log error.
                 getLogger().error( "Unable to add configured repositories to the database: " + e.getMessage(), e );
             }
-            
+
             // manage roles for repositories
-            try 
+            try
             {
                 if ( !roleManager.templatedRoleExists( "archiva-repository-observer", repoConfig.getId() ) )
                 {
                     roleManager.createTemplatedRole( "archiva-repository-observer", repoConfig.getId() );
-                }              
-                
-                if ( !roleManager.templatedRoleExists( "archiva-repository-manager", repoConfig.getId() ) );
+                }
+
+                if ( !roleManager.templatedRoleExists( "archiva-repository-manager", repoConfig.getId() ) )
+                    ;
                 {
                     roleManager.createTemplatedRole( "archiva-repository-manager", repoConfig.getId() );
-                }                                     
+                }
             }
             catch ( RoleManagerException e )
             {
                 // Log error.
                 getLogger().error( "Unable to create roles for configured repositories: " + e.getMessage(), e );
             }
-            
+
         }
     }
 
     public void initialize()
         throws InitializationException
     {
-        Banner.display( getLogger(), ArchivaVersion.determineVersion( this.getClass().getClassLoader() ) );
         synchConfiguration();
         archivaConfiguration.addChangeListener( this );
     }

Added: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java (added)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,72 @@
+package org.apache.maven.archiva.web.startup;
+
+/*
+ * 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.database.project.ProjectModelToDatabaseListener;
+import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+import org.apache.maven.archiva.repository.project.ProjectModelResolverFactory;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+
+/**
+ * ResolverFactoryInit - Initialize the Resolver Factory, and hook it up to
+ * the database.
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component 
+ *              role="org.apache.maven.archiva.web.startup.ResolverFactoryInit"
+ *              role-hint="default"
+ */
+public class ResolverFactoryInit
+    extends AbstractLogEnabled
+    implements Initializable
+{
+    /**
+     * @plexus.requirement role-hint="database"
+     */
+    private ProjectModelResolver databaseResolver;
+    
+    /**
+     * @plexus.requirement 
+     *          role="org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolutionListener"
+     *          role-hint="model-to-db"
+     */
+    private ProjectModelToDatabaseListener modelToDbListener;
+
+    /**
+     * The resolver factorying being initialized.
+     * 
+     * @plexus.requirement
+     */
+    private ProjectModelResolverFactory resolverFactory;
+    
+    public void initialize()
+        throws InitializationException
+    {
+        if ( !resolverFactory.getCurrentResolverStack().hasResolver( databaseResolver ) )
+        {
+            resolverFactory.getCurrentResolverStack().prependProjectModelResolver( databaseResolver );
+        }
+        resolverFactory.getCurrentResolverStack().addListener( modelToDbListener );
+    }
+}

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/startup/ResolverFactoryInit.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java (added)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,242 @@
+package org.apache.maven.archiva.web.tags;
+
+/*
+ * 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.lang.StringUtils;
+import org.apache.maven.archiva.dependency.DependencyGraphFactory;
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphBuilder;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphEdge;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.GraphTaskException;
+import org.apache.maven.archiva.dependency.graph.walk.BaseVisitor;
+import org.apache.maven.archiva.dependency.graph.walk.DependencyGraphWalker;
+import org.apache.maven.archiva.dependency.graph.walk.WalkDepthFirstSearch;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.model.DependencyScope;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+
+/**
+ * DependencyTree 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @plexus.component role="org.apache.maven.archiva.web.tags.DependencyTree" 
+ */
+public class DependencyTree
+    extends AbstractLogEnabled
+    implements Initializable
+{
+    /**
+     * @plexus.requirement
+     *              role="org.apache.maven.archiva.dependency.graph.DependencyGraphBuilder"
+     *              role-hint="project-model"
+     */
+    private DependencyGraphBuilder graphBuilder;
+
+    private DependencyGraphFactory graphFactory = new DependencyGraphFactory();
+
+    public class TreeEntry
+    {
+        private String pre = "";
+
+        private String post = "";
+
+        private ArtifactReference artifact;
+
+        public void setArtifact( ArtifactReference artifact )
+        {
+            this.artifact = artifact;
+        }
+
+        public ArtifactReference getArtifact()
+        {
+            return artifact;
+        }
+
+        public String getPost()
+        {
+            return post;
+        }
+
+        public void setPost( String post )
+        {
+            this.post = post;
+        }
+
+        public String getPre()
+        {
+            return pre;
+        }
+
+        public void setPre( String pre )
+        {
+            this.pre = pre;
+        }
+
+        public void appendPre( String string )
+        {
+            this.pre += string;
+        }
+
+        public void appendPost( String string )
+        {
+            this.post += string;
+        }
+    }
+
+    public List gatherTreeList( String groupId, String artifactId, String version, String nodevar,
+                                PageContext pageContext )
+        throws JspException
+    {
+        if ( StringUtils.isBlank( groupId ) )
+        {
+            String emsg = "Error generating dependency tree: groupId is blank.";
+            getLogger().error( emsg );
+            throw new JspException( emsg );
+        }
+
+        DependencyGraph graph = fetchGraph( groupId, artifactId, version );
+
+        if ( graph == null )
+        {
+            throw new JspException( "Graph is null." );
+        }
+
+        TreeListVisitor treeListVisitor = new TreeListVisitor();
+        DependencyGraphWalker walker = new WalkDepthFirstSearch();
+        walker.visit( graph, treeListVisitor );
+
+        return treeListVisitor.getList();
+    }
+
+    class TreeListVisitor
+        extends BaseVisitor
+    {
+        private List list;
+
+        private int walkDepth;
+
+        private int outputDepth;
+
+        private Stack entryStack = new Stack();
+
+        private TreeEntry currentEntry;
+
+        public TreeListVisitor()
+        {
+            this.list = new ArrayList();
+        }
+
+        public List getList()
+        {
+            return this.list;
+        }
+
+        public void discoverGraph( DependencyGraph graph )
+        {
+            super.discoverGraph( graph );
+            this.list.clear();
+            this.entryStack.clear();
+            walkDepth = 0;
+            outputDepth = -1;
+        }
+
+        public void discoverNode( DependencyGraphNode node )
+        {
+            super.discoverNode( node );
+            currentEntry = new TreeEntry();
+
+            while ( walkDepth > outputDepth )
+            {
+                currentEntry.appendPre( "<ul>" );
+                outputDepth++;
+            }
+            currentEntry.appendPre( "<li>" );
+            currentEntry.setArtifact( node.getArtifact() );
+            currentEntry.appendPost( "</li>" );
+            this.list.add( currentEntry );
+            this.entryStack.push( currentEntry );
+        }
+
+        public void finishNode( DependencyGraphNode node )
+        {
+            super.finishNode( node );
+
+            while ( walkDepth < outputDepth )
+            {
+                currentEntry.appendPost( "</ul>" );
+                outputDepth--;
+            }
+
+            this.entryStack.pop();
+        }
+
+        public void discoverEdge( DependencyGraphEdge edge )
+        {
+            super.discoverEdge( edge );
+            walkDepth++;
+        }
+
+        public void finishEdge( DependencyGraphEdge edge )
+        {
+            super.finishEdge( edge );
+            walkDepth--;
+        }
+    }
+
+    private DependencyGraph fetchGraph( String groupId, String artifactId, String version )
+    {
+        // TODO Cache the results to disk, in XML format, in the same place as the artifact is located.
+
+        VersionedReference projectRef = new VersionedReference();
+        projectRef.setGroupId( groupId );
+        projectRef.setArtifactId( artifactId );
+        projectRef.setVersion( version );
+
+        try
+        {
+            return graphFactory.getGraph( projectRef );
+        }
+        catch ( GraphTaskException e )
+        {
+            getLogger().warn( "Unable to get Graph: " + e.getMessage(), e );
+            return null;
+        }
+    }
+
+    public void initialize()
+        throws InitializationException
+    {
+        this.graphFactory.setGraphBuilder( graphBuilder );
+        this.graphFactory.setDesiredScope( DependencyScope.TEST );
+    }
+}

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTree.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java?view=auto&rev=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java (added)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java Sat Jun 16 21:50:05 2007
@@ -0,0 +1,205 @@
+package org.apache.maven.archiva.web.tags;
+
+/*
+ * 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.lang.StringUtils;
+import org.apache.maven.archiva.web.tags.DependencyTree.TreeEntry;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.tagext.IterationTag;
+import javax.servlet.jsp.tagext.TagSupport;
+import javax.servlet.jsp.tagext.TryCatchFinally;
+
+/**
+ * DependencyTreeTag - just here to output the dependency tree to the browser.
+ * It was easier to do it this way, vs accessing the dependency graph via a JSP.
+ * 
+ * <pre>
+ *   <archiva:dependency-tree groupId="org.apache.maven.archiva" 
+ *                            artifactId="archiva-common" 
+ *                            version="1.0"
+ *                            nodevar="node">
+ *     <b>${node.groupId}</b>:<b>${node.artifactId}</b>:<b>${node.version}</b> (${node.scope})
+ *   </archiva:dependency-tree>
+ * </pre>
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class DependencyTreeTag
+    extends TagSupport
+    implements IterationTag, TryCatchFinally
+{
+    private String groupId;
+
+    private String artifactId;
+
+    private String version;
+
+    private String nodevar;
+
+    private Iterator treeIterator;
+
+    private List tree;
+
+    private TreeEntry currentTreeEntry;
+
+    public int doAfterBody()
+        throws JspException
+    {
+        if ( currentTreeEntry != null )
+        {
+            out( currentTreeEntry.getPost() );
+        }
+
+        if ( treeIterator.hasNext() )
+        {
+            currentTreeEntry = (TreeEntry) treeIterator.next();
+            out( currentTreeEntry.getPre() );
+            exposeVariables();
+            return EVAL_BODY_AGAIN;
+        }
+
+        out( "\n</div><!-- end of dependency-graph -->" );
+
+        return SKIP_BODY;
+    }
+
+    public void doCatch( Throwable t )
+        throws Throwable
+    {
+        throw t;
+    }
+
+    public void doFinally()
+    {
+        unExposeVariables();
+    }
+
+    public int doStartTag()
+        throws JspException
+    {
+        DependencyTree deptree;
+        try
+        {
+            deptree = (DependencyTree) PlexusTagUtil.lookup( pageContext, DependencyTree.class.getName() );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new JspException( "Unable to lookup DependencyTree: " + e.getMessage(), e );
+        }
+
+        if ( deptree == null )
+        {
+            throw new JspException( "Unable to process dependency tree.  Component not found." );
+        }
+
+        if ( StringUtils.isBlank( nodevar ) )
+        {
+            nodevar = "node";
+        }
+
+        this.tree = deptree.gatherTreeList( groupId, artifactId, version, nodevar, pageContext );
+
+        if ( CollectionUtils.isEmpty( this.tree ) )
+        {
+            return SKIP_BODY;
+        }
+
+        treeIterator = tree.iterator();
+
+        out( "<div class=\"dependency-graph\">" );
+
+        currentTreeEntry = (TreeEntry) treeIterator.next();
+        out( currentTreeEntry.getPre() );
+        exposeVariables();
+
+        return EVAL_BODY_INCLUDE;
+    }
+
+    public void release()
+    {
+        groupId = "";
+        artifactId = "";
+        version = "";
+        nodevar = "";
+        tree = null;
+        treeIterator = null;
+        super.release();
+    }
+
+    public void setArtifactId( String artifactId )
+    {
+        this.artifactId = artifactId;
+    }
+
+    public void setGroupId( String groupId )
+    {
+        this.groupId = groupId;
+    }
+
+    public void setNodevar( String nodevar )
+    {
+        this.nodevar = nodevar;
+    }
+
+    public void setVersion( String version )
+    {
+        this.version = version;
+    }
+
+    private void exposeVariables()
+        throws JspException
+    {
+        if ( currentTreeEntry == null )
+        {
+            pageContext.removeAttribute( nodevar, PageContext.PAGE_SCOPE );
+        }
+        else
+        {
+            pageContext.setAttribute( nodevar, currentTreeEntry.getArtifact() );
+        }
+    }
+
+    private void out( String msg )
+        throws JspException
+    {
+        try
+        {
+            pageContext.getOut().append( msg );
+        }
+        catch ( IOException e )
+        {
+            throw new JspException( "Unable to output to jsp page context." );
+        }
+    }
+
+    private void unExposeVariables()
+    {
+        pageContext.removeAttribute( nodevar, PageContext.PAGE_SCOPE );
+    }
+}

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DependencyTreeTag.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml Sat Jun 16 21:50:05 2007
@@ -21,7 +21,19 @@
 <plexus>
   <load-on-start>
     <component>
+      <role>org.apache.maven.archiva.web.startup.Banner</role>
+      <role-hint>default</role-hint>
+    </component>
+    <component>
       <role>org.apache.maven.archiva.web.startup.ConfigurationSynchronization</role>
+      <role-hint>default</role-hint>
+    </component>
+    <component>
+      <role>org.apache.maven.archiva.web.startup.ResolverFactoryInit</role>
+      <role-hint>default</role-hint>
+    </component>
+    <component>
+      <role>org.apache.maven.archiva.web.startup.Banner</role>
       <role-hint>default</role-hint>
     </component>
     <component>

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/taglib.tld
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/taglib.tld?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/taglib.tld (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/META-INF/taglib.tld Sat Jun 16 21:50:05 2007
@@ -95,5 +95,45 @@
       
    </tag>
    
+   <tag>
+   
+      <name>dependency-tree</name>
+      <tag-class>org.apache.maven.archiva.web.tags.DependencyTreeTag</tag-class>
+      <body-content>JSP</body-content>
+      <description><![CDATA[Render a dependency tree for the provided project.]]></description>
+
+      <attribute>
+        <name>groupId</name>
+        <required>true</required>
+        <rtexprvalue>true</rtexprvalue>
+        
+        <description><![CDATA[The groupId]]></description>
+      </attribute>
+      
+      <attribute>
+        <name>artifactId</name>
+        <required>true</required>
+        <rtexprvalue>true</rtexprvalue>
+        
+        <description><![CDATA[The artifactId]]></description>
+      </attribute>
+
+      <attribute>
+        <name>version</name>
+        <required>true</required>
+        <rtexprvalue>true</rtexprvalue>
+        
+        <description><![CDATA[The version]]></description>
+      </attribute>
+
+      <attribute>
+        <name>nodevar</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+        
+        <description><![CDATA[The variable name for the node.]]></description>
+      </attribute>
+
+   </tag>
    
 </taglib>

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml?view=diff&rev=548008&r1=548007&r2=548008
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml Sat Jun 16 21:50:05 2007
@@ -213,7 +213,7 @@
     </action>
 
     <action name="showArtifactDependencyTree" class="showArtifactAction" method="dependencyTree">
-      <result>/WEB-INF/jsp/showArtifact.jsp</result>
+      <result>/WEB-INF/jsp/artifact/dependencyTree.jsp</result>
     </action>
 
   </package>