]> source.dussan.org Git - archiva.git/commitdiff
Work towards compilable webapp
authorJoakim Erdfelt <joakime@apache.org>
Wed, 11 Apr 2007 20:27:38 +0000 (20:27 +0000)
committerJoakim Erdfelt <joakime@apache.org>
Wed, 11 Apr 2007 20:27:38 +0000 (20:27 +0000)
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/branches@527650 13f79535-47bb-0310-9956-ffa450edef68

15 files changed:
archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/ArchivaDAO.java
archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/RepositoryDAO.java
archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java [new file with mode: 0644]
archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoArtifactDAO.java
archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoRepositoryDAO.java
archiva-jpox-database-refactor/archiva-database/src/test/java/org/apache/maven/archiva/database/AbstractArchivaDatabaseTestCase.java
archiva-jpox-database-refactor/archiva-database/src/test/java/org/apache/maven/archiva/database/jdo/JdoRepositoryDAOTest.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/pom.xml
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/check/RoleExistanceEnvironmentCheck.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/interceptor/ConfigurationInterceptor.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/RepositoryServlet.java
archiva-jpox-database-refactor/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java

index d60a1642d22d6864d1f121363f3676735fb45932..7d62c93e144a7a2a6d68b4ba9d5deda5c51bb870 100644 (file)
@@ -27,6 +27,8 @@ package org.apache.maven.archiva.database;
  */
 public interface ArchivaDAO
 {
+    public static final String ROLE = ArchivaDAO.class.getName();
+
     ArtifactDAO getArtifactDAO();
 
     ProjectModelDAO getProjectModelDAO();
index b14a8277762b6441b96cdc60b8485291a1a9bd20..baaaaa574d204345ea076b2d2a2ad93b60d73e0f 100644 (file)
@@ -19,7 +19,7 @@ package org.apache.maven.archiva.database;
  * under the License.
  */
 
-import org.apache.maven.archiva.model.ArchivaRepositoryModel;
+import org.apache.maven.archiva.model.ArchivaRepository;
 
 import java.util.List;
 
@@ -52,20 +52,20 @@ public interface RepositoryDAO
      * This is the only list of options created in this DAO.
      */
 
-    public ArchivaRepositoryModel createRepository( String id, String url );
+    public ArchivaRepository createRepository( String id, String name, String url );
 
-    public List /*<ArchivaRepositoryModel>*/getRepositories()
+    public List /*<ArchivaRepository>*/getRepositories()
         throws ObjectNotFoundException, ArchivaDatabaseException;
 
-    public ArchivaRepositoryModel getRepository( String id )
+    public ArchivaRepository getRepository( String id )
         throws ObjectNotFoundException, ArchivaDatabaseException;
 
-    public List queryRepository( Constraint constraint )
+    public List /*<ArchivaRepository>*/queryRepositories( Constraint constraint )
         throws ObjectNotFoundException, ArchivaDatabaseException;
 
-    public ArchivaRepositoryModel saveRepository( ArchivaRepositoryModel repository )
+    public ArchivaRepository saveRepository( ArchivaRepository repository )
         throws ArchivaDatabaseException;
 
-    public void deleteRepository( ArchivaRepositoryModel repository )
+    public void deleteRepository( ArchivaRepository repository )
         throws ArchivaDatabaseException;
 }
diff --git a/archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java b/archiva-jpox-database-refactor/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java
new file mode 100644 (file)
index 0000000..60c0461
--- /dev/null
@@ -0,0 +1,53 @@
+package org.apache.maven.archiva.database.constraints;
+
+/*
+ * 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.StringEscapeUtils;
+import org.apache.maven.archiva.database.Constraint;
+
+/**
+ * ArtifactsRelatedConstraint 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ArtifactsRelatedConstraint
+    extends AbstractConstraint
+    implements Constraint
+{
+    private String whereClause;
+
+    public ArtifactsRelatedConstraint( String groupId, String artifactId, String version )
+    {
+        whereClause = "groupId == '" + StringEscapeUtils.escapeSql( groupId ) + "' AND artifactId == '"
+            + StringEscapeUtils.escapeSql( artifactId ) + "' AND version == '" + StringEscapeUtils.escapeSql( version )
+            + "'";
+    }
+
+    public String getSortColumn()
+    {
+        return "classifier";
+    }
+
+    public String getWhereCondition()
+    {
+        return whereClause;
+    }
+}
index 0980226c4a1f55a5c6506951b38deb729423a488..8ef9f39a3d0d96b4de8e44bb283665327f5e7eb6 100644 (file)
@@ -62,12 +62,6 @@ public class JdoArtifactDAO
         }
         catch ( ArchivaDatabaseException e )
         {
-            if ( !( e instanceof ObjectNotFoundException ) )
-            {
-                getLogger().warn(
-                                  "Unable to get artifact [" + groupId + ":" + artifactId + ":" + version + ":"
-                                      + classifier + ":" + type + "]: " + e.getMessage(), e );
-            }
             artifact = new ArchivaArtifact( groupId, artifactId, version, classifier, type );
         }
 
index 6316c8a185fc18ab63a6087b5fffce81bf7439bd..169c1bcbf82ece70fc9e96b710161000579a49fd 100644 (file)
@@ -23,8 +23,11 @@ import org.apache.maven.archiva.database.ArchivaDatabaseException;
 import org.apache.maven.archiva.database.Constraint;
 import org.apache.maven.archiva.database.ObjectNotFoundException;
 import org.apache.maven.archiva.database.RepositoryDAO;
+import org.apache.maven.archiva.model.ArchivaRepository;
 import org.apache.maven.archiva.model.ArchivaRepositoryModel;
 
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -42,12 +45,12 @@ public class JdoRepositoryDAO
      * @plexus.requirement role-hint="archiva"
      */
     private JdoAccess jdo;
-    
+
     /* .\ Archiva Repository \.____________________________________________________________ */
 
-    public ArchivaRepositoryModel createRepository( String id, String url )
+    public ArchivaRepository createRepository( String id, String name, String url )
     {
-        ArchivaRepositoryModel repo;
+        ArchivaRepository repo;
 
         try
         {
@@ -55,9 +58,7 @@ public class JdoRepositoryDAO
         }
         catch ( ArchivaDatabaseException e )
         {
-            repo = new ArchivaRepositoryModel();
-            repo.setId( id );
-            repo.setUrl( url );
+            repo = new ArchivaRepository( id, name, url );
         }
 
         return repo;
@@ -69,26 +70,49 @@ public class JdoRepositoryDAO
         return jdo.getAllObjects( ArchivaRepositoryModel.class );
     }
 
-    public ArchivaRepositoryModel getRepository( String id )
+    public ArchivaRepository getRepository( String id )
         throws ObjectNotFoundException, ArchivaDatabaseException
     {
-        return (ArchivaRepositoryModel) jdo.getObjectById( ArchivaRepositoryModel.class, id, null );
+        ArchivaRepositoryModel model = (ArchivaRepositoryModel) jdo.getObjectById( ArchivaRepositoryModel.class, id,
+                                                                                   null );
+        return new ArchivaRepository( model );
     }
 
-    public List queryRepository( Constraint constraint )
+    public List queryRepositories( Constraint constraint )
         throws ObjectNotFoundException, ArchivaDatabaseException
     {
-        return jdo.getAllObjects( ArchivaRepositoryModel.class, constraint );
+        List results = jdo.getAllObjects( ArchivaRepositoryModel.class, constraint );
+
+        if ( ( results == null ) || results.isEmpty() )
+        {
+            return results;
+        }
+
+        List ret = new ArrayList();
+        Iterator it = results.iterator();
+        while ( it.hasNext() )
+        {
+            ArchivaRepositoryModel model = (ArchivaRepositoryModel) it.next();
+            ret.add( new ArchivaRepository( model ) );
+        }
+
+        return ret;
     }
 
-    public ArchivaRepositoryModel saveRepository( ArchivaRepositoryModel repository )
+    public ArchivaRepository saveRepository( ArchivaRepository repository )
     {
-        return (ArchivaRepositoryModel) jdo.saveObject( repository );
+        ArchivaRepositoryModel model = (ArchivaRepositoryModel) jdo.saveObject( repository.getModel() );
+        if ( model == null )
+        {
+            return null;
+        }
+
+        return new ArchivaRepository( model );
     }
 
-    public void deleteRepository( ArchivaRepositoryModel repository )
+    public void deleteRepository( ArchivaRepository repository )
         throws ArchivaDatabaseException
     {
-        jdo.removeObject( repository );
+        jdo.removeObject( repository.getModel() );
     }
 }
index 4fd4e261c05a3cb3200a0e873754d2025d334c71..f936bca5da6a2e37add7015e1b589f06c96d26fa 100644 (file)
@@ -22,7 +22,6 @@ package org.apache.maven.archiva.database;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.jdo.DefaultConfigurableJdoFactory;
 import org.codehaus.plexus.jdo.JdoFactory;
-import org.codehaus.plexus.util.FileUtils;
 import org.jpox.SchemaTool;
 
 import java.io.File;
index ed18c2560f328f8049d9f92bfb6876ea0705dc44..9f5fe47240349d5091f876f02812fe67f63278b7 100644 (file)
@@ -22,7 +22,7 @@ package org.apache.maven.archiva.database.jdo;
 import org.apache.maven.archiva.database.AbstractArchivaDatabaseTestCase;
 import org.apache.maven.archiva.database.ArchivaDatabaseException;
 import org.apache.maven.archiva.database.RepositoryDAO;
-import org.apache.maven.archiva.model.ArchivaRepositoryModel;
+import org.apache.maven.archiva.model.ArchivaRepository;
 
 import java.util.List;
 
@@ -41,18 +41,18 @@ public class JdoRepositoryDAOTest
         throws ArchivaDatabaseException
     {
         RepositoryDAO repoDao = dao.getRepositoryDAO();
-        
+
         // Create it
-        ArchivaRepositoryModel repo = repoDao.createRepository( "testRepo", "http://localhost:8080/repository/foo" );
+        ArchivaRepository repo = repoDao.createRepository( "testRepo", "Test Repository",
+                                                           "http://localhost:8080/repository/foo" );
         assertNotNull( repo );
 
         // Set some mandatory values
-        repo.setName( "The Test Repository." );
-        repo.setCreationSource( "Test Case" );
-        repo.setLayoutName( "default" );
+        repo.getModel().setCreationSource( "Test Case" );
+        repo.getModel().setLayoutName( "default" );
 
         // Save it. 
-        ArchivaRepositoryModel repoSaved = repoDao.saveRepository( repo );
+        ArchivaRepository repoSaved = repoDao.saveRepository( repo );
         assertNotNull( repoSaved );
         assertEquals( "testRepo", JDOHelper.getObjectId( repoSaved ).toString() );
 
@@ -62,28 +62,28 @@ public class JdoRepositoryDAOTest
         assertEquals( 1, repos.size() );
 
         // Test that retreived object is what we expect.
-        ArchivaRepositoryModel firstRepo = (ArchivaRepositoryModel) repos.get( 0 );
+        ArchivaRepository firstRepo = (ArchivaRepository) repos.get( 0 );
         assertNotNull( firstRepo );
         assertEquals( "testRepo", repo.getId() );
-        assertEquals( "The Test Repository.", repo.getName() );
-        assertEquals( "Test Case", repo.getCreationSource() );
-        assertEquals( "default", repo.getLayoutName() );
+        assertEquals( "The Test Repository.", repo.getModel().getName() );
+        assertEquals( "Test Case", repo.getModel().getCreationSource() );
+        assertEquals( "default", repo.getModel().getLayoutName() );
 
         // Change value and save.
-        repoSaved.setName( "Saved Again" );
+        repoSaved.getModel().setCreationSource( "Changed" );
         repoDao.saveRepository( repoSaved );
 
         // Test that only 1 object is saved.
         assertEquals( 1, repoDao.getRepositories().size() );
 
         // Get the specific repo.
-        ArchivaRepositoryModel actualRepo = repoDao.getRepository( "testRepo" );
+        ArchivaRepository actualRepo = repoDao.getRepository( "testRepo" );
         assertNotNull( actualRepo );
 
         // Test expected values.
         assertEquals( "testRepo", actualRepo.getId() );
         assertEquals( "http://localhost:8080/repository/foo", actualRepo.getUrl() );
-        assertEquals( "Saved Again", actualRepo.getName() );
+        assertEquals( "Changed", actualRepo.getModel().getCreationSource() );
 
         // Test that only 1 object is saved.
         assertEquals( 1, repoDao.getRepositories().size() );
index ed13c3fb5d627f33b114012cd1b2b28c127609b4..b41cf04de36e74c98e5da6871cf2917ada0be3c2 100644 (file)
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>maven-app-configuration-web</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.maven</groupId>
+          <artifactId>maven-project</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-container-default</artifactId>
     </dependency>
+    <!-- 
     <dependency>
       <groupId>org.apache.maven.archiva</groupId>
       <artifactId>archiva-proxy</artifactId>
     </dependency>
+     -->
     <dependency>
       <groupId>org.apache.maven.archiva</groupId>
-      <artifactId>archiva-core</artifactId>
+      <artifactId>archiva-database</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.archiva</groupId>
-      <artifactId>archiva-common</artifactId>
+      <artifactId>archiva-repository-layer</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.maven.archiva</groupId>
       <!-- TODO: actually, just exclude from WAR plugin -->
       <scope>provided</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>maven-dependency-tree</artifactId>
-      <version>1.0-alpha-2</version>
-    </dependency>
     <!-- Plexus Security Dependencies -->
     <dependency>
       <groupId>org.codehaus.plexus.security</groupId>
index b2af23c833cc99d5b9fae70da4cbc612b939af05..fa6e88dfaea90b2b6fb0061eddc769aafbef75ee 100644 (file)
@@ -22,11 +22,7 @@ package org.apache.maven.archiva.web.action;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
-import org.apache.maven.archiva.configuration.ConfiguredRepositoryFactory;
-import org.apache.maven.archiva.indexer.RepositoryArtifactIndex;
-import org.apache.maven.archiva.indexer.RepositoryArtifactIndexFactory;
-import org.apache.maven.archiva.indexer.RepositoryIndexException;
-import org.apache.maven.archiva.indexer.RepositoryIndexSearchException;
+import org.apache.maven.archiva.database.ArchivaDAO;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
 import java.io.File;
@@ -51,12 +47,7 @@ public class BrowseAction
     /**
      * @plexus.requirement
      */
-    private RepositoryArtifactIndexFactory factory;
-
-    /**
-     * @plexus.requirement
-     */
-    private ConfiguredRepositoryFactory repositoryFactory;
+    private ArchivaDAO dao;
 
     /**
      * @plexus.requirement
@@ -243,15 +234,6 @@ public class BrowseAction
         return groups;
     }
 
-    private RepositoryArtifactIndex getIndex()
-        throws RepositoryIndexException
-    {
-        Configuration configuration = archivaConfiguration.getConfiguration();
-        File indexPath = new File( configuration.getIndexPath() );
-
-        return factory.createStandardIndex( indexPath );
-    }
-
     public List getGroups()
     {
         return groups;
index ecc109a868464d43fdb22b227fd876fcdc23fc8e..9df228a18f20720c07e54c34e94d89c9affbaeba 100644 (file)
@@ -20,39 +20,14 @@ package org.apache.maven.archiva.web.action;
  */
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.TermQuery;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
-import org.apache.maven.archiva.configuration.ConfiguredRepositoryFactory;
-import org.apache.maven.archiva.indexer.RepositoryArtifactIndex;
-import org.apache.maven.archiva.indexer.RepositoryArtifactIndexFactory;
-import org.apache.maven.archiva.indexer.RepositoryIndexException;
-import org.apache.maven.archiva.indexer.RepositoryIndexSearchException;
-import org.apache.maven.archiva.indexer.lucene.LuceneQuery;
-import org.apache.maven.archiva.indexer.record.StandardArtifactIndexRecord;
-import org.apache.maven.archiva.proxy.ProxyException;
-import org.apache.maven.archiva.reporting.database.ArtifactResultsDatabase;
+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.web.util.VersionMerger;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactCollector;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Model;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectBuilder;
-import org.apache.maven.project.ProjectBuildingException;
-import org.apache.maven.project.artifact.InvalidDependencyVersionException;
-import org.apache.maven.shared.dependency.tree.DependencyNode;
-import org.apache.maven.shared.dependency.tree.DependencyTree;
-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
-import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
 import java.io.File;
@@ -68,55 +43,25 @@ import java.util.Set;
 /**
  * Browse the repository.
  *
+ * TODO change name to ShowVersionedAction to conform to terminology.
  * @plexus.component role="com.opensymphony.xwork.Action" role-hint="showArtifactAction"
  */
 public class ShowArtifactAction
     extends PlexusActionSupport
 {
+    /* .\ Not Exposed \._____________________________________________ */
+    
     /**
      * @plexus.requirement
      */
-    private ArtifactFactory artifactFactory;
-
-    /**
-     * @plexus.requirement
-     */
-    private ConfiguredRepositoryFactory repositoryFactory;
-
-    /**
-     * @plexus.requirement
-     */
-    private MavenProjectBuilder projectBuilder;
+    private ArchivaDAO dao;
 
     /**
      * @plexus.requirement
      */
     private ArchivaConfiguration archivaConfiguration;
-
-    /**
-     * @plexus.requirement
-     */
-    private RepositoryArtifactIndexFactory factory;
-
-    /**
-     * @plexus.requirement
-     */
-    private ArtifactMetadataSource artifactMetadataSource;
-
-    /**
-     * @plexus.requirement
-     */
-    private ArtifactCollector collector;
-
-    /**
-     * @plexus.requirement
-     */
-    private DependencyTreeBuilder dependencyTreeBuilder;
     
-    /**
-     * @plexus.requirement
-     */
-    ArtifactResultsDatabase artifactsDatabase;
+    /* .\ Input Parameters \.________________________________________ */
 
     private String groupId;
 
@@ -124,75 +69,81 @@ public class ShowArtifactAction
 
     private String version;
 
-    private Model model;
-
-    private Collection dependencies;
-
-    private List dependencyTree;
+    /* .\ Exposed Output Objects \.__________________________________ */
 
-    private String repositoryId;
-
-    private String repositoryUrlName;
+    /**
+     * The model of this versioned project.
+     */
+    private ArchivaProjectModel model;
 
-    private String artifactPath;
+    /**
+     * The list of artifacts that depend on this versioned project.
+     */
+    private List dependees;
 
-    private List mailingLists;
-    
+    /**
+     * The reports associated with this versioned project.
+     */
     private List reports;
 
+    /**
+     * Show the versioned project information tab.
+     * 
+     * TODO: Change name to 'project'
+     */
     public String artifact()
-        throws IOException, XmlPullParserException, ProjectBuildingException, ResourceDoesNotExistException,
-        ProxyException, ArtifactResolutionException
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
         if ( !checkParameters() )
         {
             return ERROR;
         }
 
-        MavenProject project = readProject();
-
-        model = project.getModel();
+        this.model = readProject();
 
         return SUCCESS;
     }
 
+    /**
+     * Show the artifact information tab.
+     */
     public String dependencies()
-        throws IOException, XmlPullParserException, ProjectBuildingException
+    throws ObjectNotFoundException, ArchivaDatabaseException
     {
         if ( !checkParameters() )
         {
             return ERROR;
         }
 
-        MavenProject project = readProject();
-
-        model = project.getModel();
+        this.model = readProject();
 
         // TODO: should this be the whole set of artifacts, and be more like the maven dependencies report?
-        this.dependencies = VersionMerger.wrap( project.getModel().getDependencies() );
+        // this.dependencies = VersionMerger.wrap( project.getModel().getDependencies() );
 
         return SUCCESS;
     }
 
+    /**
+     * Show the mailing lists information tab.
+     */
     public String mailingLists()
-        throws IOException, XmlPullParserException, ProjectBuildingException
+    throws ObjectNotFoundException, ArchivaDatabaseException
     {
         if ( !checkParameters() )
         {
             return ERROR;
         }
 
-        MavenProject project = readProject();
-
-        model = project.getModel();
-
-        this.mailingLists = project.getMailingLists();
+        this.model = readProject();
 
         return SUCCESS;
     }
     
+    /**
+     * Show the reports tab.
+     */
     public String reports()
-        throws IOException, XmlPullParserException, ProjectBuildingException
+    throws ObjectNotFoundException, ArchivaDatabaseException
     {
         if ( !checkParameters() )
         {
@@ -200,115 +151,51 @@ public class ShowArtifactAction
         }
 
         System.out.println("#### In reports.");
-        this.reports = artifactsDatabase.findArtifactResults( groupId, artifactId, version );
+        // TODO: hook up reports on project - this.reports = artifactsDatabase.findArtifactResults( groupId, artifactId, version );
         System.out.println("#### Found " + reports.size() + " reports.");
 
         return SUCCESS;
     }
 
+    /**
+     * Show the dependees (other artifacts that depend on this project) tab.
+     */
     public String dependees()
-        throws IOException, XmlPullParserException, ProjectBuildingException, RepositoryIndexException,
-        RepositoryIndexSearchException
+    throws ObjectNotFoundException, ArchivaDatabaseException
     {
         if ( !checkParameters() )
         {
             return ERROR;
         }
 
-        MavenProject project = readProject();
-
-        model = project.getModel();
-
-        RepositoryArtifactIndex index = getIndex();
+        this.model = readProject();
 
-        String id = createId( groupId, artifactId, version );
-        List records = index.search( new LuceneQuery( new TermQuery( new Term( "dependencies", id ) ) ) );
-
-        dependencies = VersionMerger.merge( records );
+        // TODO: create depends on collector.
+        this.dependees = Collections.EMPTY_LIST;
 
         return SUCCESS;
     }
 
+    /**
+     * Show the dependencies of this versioned project tab.
+     */
     public String dependencyTree()
-        throws ProjectBuildingException, InvalidDependencyVersionException, ArtifactResolutionException
+    throws ObjectNotFoundException, ArchivaDatabaseException
     {
         if ( !checkParameters() )
         {
             return ERROR;
         }
 
-        Configuration configuration = archivaConfiguration.getConfiguration();
-        List repositories = repositoryFactory.createRepositories( configuration );
-
-        Artifact artifact = artifactFactory.createProjectArtifact( groupId, artifactId, version );
-        // TODO: maybe we can decouple the assembly parts of the project builder from the repository handling to get rid of the temp repo
-        ArtifactRepository localRepository = repositoryFactory.createLocalRepository( configuration );
-        MavenProject project = projectBuilder.buildFromRepository( artifact, repositories, localRepository );
-
-        model = project.getModel();
-
-        getLogger().debug( " processing : " + groupId + ":" + artifactId + ":" + version );
-
-        DependencyTree dependencies = collectDependencies( project, localRepository );
-
-        this.dependencyTree = new ArrayList();
-
-        populateFlatTreeList( dependencies.getRootNode(), dependencyTree );
+        this.model = readProject();
 
         return SUCCESS;
     }
 
-    private void populateFlatTreeList( DependencyNode currentNode, List dependencyList )
+    private ArchivaProjectModel readProject()
+        throws ObjectNotFoundException, ArchivaDatabaseException
     {
-        DependencyNode childNode;
-
-        for ( Iterator iterator = currentNode.getChildren().iterator(); iterator.hasNext(); )
-        {
-            childNode = (DependencyNode) iterator.next();
-            dependencyList.add( childNode );
-            populateFlatTreeList( childNode, dependencyList );
-        }
-    }
-
-    private DependencyTree collectDependencies( MavenProject project, ArtifactRepository localRepository )
-        throws ArtifactResolutionException, ProjectBuildingException, InvalidDependencyVersionException
-    {
-        try
-        {
-            return dependencyTreeBuilder.buildDependencyTree( project, localRepository, artifactFactory,
-                                                              artifactMetadataSource, collector );
-        }
-        catch ( DependencyTreeBuilderException e )
-        {
-            getLogger().error( "Unable to build dependency tree.", e );
-            return null;
-        }
-    }
-
-    private static String createId( String groupId, String artifactId, String version )
-    {
-        return groupId + ":" + artifactId + ":" + version;
-    }
-
-    private RepositoryArtifactIndex getIndex()
-        throws RepositoryIndexException
-    {
-        Configuration configuration = archivaConfiguration.getConfiguration();
-        File indexPath = new File( configuration.getIndexPath() );
-
-        return factory.createStandardIndex( indexPath );
-    }
-
-    private MavenProject readProject()
-        throws ProjectBuildingException
-    {
-        Configuration configuration = archivaConfiguration.getConfiguration();
-        List repositories = repositoryFactory.createRepositories( configuration );
-
-        Artifact artifact = artifactFactory.createProjectArtifact( groupId, artifactId, version );
-        // TODO: maybe we can decouple the assembly parts of the project builder from the repository handling to get rid of the temp repo
-        ArtifactRepository localRepository = repositoryFactory.createLocalRepository( configuration );
-        return projectBuilder.buildFromRepository( artifact, repositories, localRepository );
+        return dao.getProjectModelDAO().getProjectModel( groupId, artifactId, version );
     }
 
     private boolean checkParameters()
@@ -338,16 +225,11 @@ public class ShowArtifactAction
         return result;
     }
 
-    public Model getModel()
+    public ArchivaProjectModel getModel()
     {
         return model;
     }
 
-    public Collection getDependencies()
-    {
-        return dependencies;
-    }
-
     public String getGroupId()
     {
         return groupId;
@@ -368,11 +250,6 @@ public class ShowArtifactAction
         this.artifactId = artifactId;
     }
 
-    public List getDependencyTree()
-    {
-        return dependencyTree;
-    }
-
     public String getVersion()
     {
         return version;
@@ -383,165 +260,6 @@ public class ShowArtifactAction
         this.version = version;
     }
 
-    public String getArtifactPath()
-    {
-        return artifactPath;
-    }
-
-    public static class DependencyWrapper
-    {
-        private final String groupId;
-
-        private final String artifactId;
-
-        /**
-         * Versions added. We ignore duplicates since you might add those with varying classifiers.
-         */
-        private Set versions = new HashSet();
-
-        private String version;
-
-        private String scope;
-
-        private String classifier;
-
-        public DependencyWrapper( StandardArtifactIndexRecord record )
-        {
-            this.groupId = record.getGroupId();
-
-            this.artifactId = record.getArtifactId();
-
-            addVersion( record.getVersion() );
-        }
-
-        public DependencyWrapper( Dependency dependency )
-        {
-            this.groupId = dependency.getGroupId();
-
-            this.artifactId = dependency.getArtifactId();
-
-            this.scope = dependency.getScope();
-
-            this.classifier = dependency.getClassifier();
-
-            addVersion( dependency.getVersion() );
-        }
-
-        public String getScope()
-        {
-            return scope;
-        }
-
-        public String getClassifier()
-        {
-            return classifier;
-        }
-
-        public void addVersion( String version )
-        {
-            // We use DefaultArtifactVersion to get the correct sorting order later, however it does not have
-            // hashCode properly implemented, so we add it here.
-            // TODO: add these methods to the actual DefaultArtifactVersion and use that.
-            versions.add( new DefaultArtifactVersion( version )
-            {
-                public int hashCode()
-                {
-                    int result;
-                    result = getBuildNumber();
-                    result = 31 * result + getMajorVersion();
-                    result = 31 * result + getMinorVersion();
-                    result = 31 * result + getIncrementalVersion();
-                    result = 31 * result + ( getQualifier() != null ? getQualifier().hashCode() : 0 );
-                    return result;
-                }
-
-                public boolean equals( Object o )
-                {
-                    if ( this == o )
-                    {
-                        return true;
-                    }
-                    if ( o == null || getClass() != o.getClass() )
-                    {
-                        return false;
-                    }
-
-                    DefaultArtifactVersion that = (DefaultArtifactVersion) o;
-
-                    if ( getBuildNumber() != that.getBuildNumber() )
-                    {
-                        return false;
-                    }
-                    if ( getIncrementalVersion() != that.getIncrementalVersion() )
-                    {
-                        return false;
-                    }
-                    if ( getMajorVersion() != that.getMajorVersion() )
-                    {
-                        return false;
-                    }
-                    if ( getMinorVersion() != that.getMinorVersion() )
-                    {
-                        return false;
-                    }
-                    if ( getQualifier() != null ? !getQualifier().equals( that.getQualifier() )
-                        : that.getQualifier() != null )
-                    {
-                        return false;
-                    }
-
-                    return true;
-                }
-            } );
-
-            if ( versions.size() == 1 )
-            {
-                this.version = version;
-            }
-            else
-            {
-                this.version = null;
-            }
-        }
-
-        public String getGroupId()
-        {
-            return groupId;
-        }
-
-        public String getArtifactId()
-        {
-            return artifactId;
-        }
-
-        public List getVersions()
-        {
-            List versions = new ArrayList( this.versions );
-            Collections.sort( versions );
-            return versions;
-        }
-
-        public String getVersion()
-        {
-            return version;
-        }
-    }
-
-    public String getRepositoryId()
-    {
-        return repositoryId;
-    }
-
-    public List getMailingLists()
-    {
-        return mailingLists;
-    }
-
-    public String getRepositoryUrlName()
-    {
-        return repositoryUrlName;
-    }
-
     public List getReports()
     {
         return reports;
index b9794d97d021014b55e50b92a0e164ef4a26f051..1d93d8b05780ada4a5b60837278a570181e94ce5 100644 (file)
@@ -19,9 +19,11 @@ package org.apache.maven.archiva.web.check;
  * under the License.
  */
 
-import org.apache.maven.archiva.configuration.ArchivaConfiguration;
-import org.apache.maven.archiva.configuration.Configuration;
 import org.apache.maven.archiva.configuration.RepositoryConfiguration;
+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.ArchivaRepository;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.rbac.profile.RoleProfileException;
 import org.codehaus.plexus.rbac.profile.RoleProfileManager;
@@ -49,7 +51,7 @@ public class RoleExistanceEnvironmentCheck
     /**
      * @plexus.requirement
      */
-    private ArchivaConfiguration archivaConfiguration;
+    private ArchivaDAO dao;
 
     /**
      * @plexus.requirement role-hint="archiva"
@@ -64,15 +66,14 @@ public class RoleExistanceEnvironmentCheck
         {
             try
             {
-                // check if there is potential for role/repo disconnect
-                Configuration configuration = archivaConfiguration.getConfiguration();
-                if ( configuration.isValid() )
-                {
-                    List repos = configuration.getRepositories();
+                List repos = dao.getRepositoryDAO().getRepositories();
 
-                    for ( Iterator i = repos.iterator(); i.hasNext(); )
+                if ( hasManagedRepository( repos ) )
+                {
+                    Iterator it = repos.iterator();
+                    while ( it.hasNext() )
                     {
-                        RepositoryConfiguration repository = (RepositoryConfiguration) i.next();
+                        RepositoryConfiguration repository = (RepositoryConfiguration) it.next();
 
                         roleProfileManager.getDynamicRole( "archiva-repository-manager", repository.getId() );
 
@@ -85,9 +86,33 @@ public class RoleExistanceEnvironmentCheck
                 list.add( this.getClass().getName() + "error initializing roles: " + rpe.getMessage() );
                 getLogger().info( "error initializing roles", rpe );
             }
+            catch ( ObjectNotFoundException e )
+            {
+                list.add( this.getClass().getName() + "error initializing roles (repository not found): " + e.getMessage() );
+                getLogger().info( "error initializing roles", e );
+            }
+            catch ( ArchivaDatabaseException e )
+            {
+                list.add( this.getClass().getName() + "error initializing roles (database error): " + e.getMessage() );
+                getLogger().info( "error initializing roles", e );
+            }
 
             checked = true;
         }
     }
 
+    public boolean hasManagedRepository( List repos )
+    {
+        Iterator it = repos.iterator();
+        while ( it.hasNext() )
+        {
+            ArchivaRepository repo = (ArchivaRepository) it.next();
+            if ( repo.isManaged() )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
index a406c10b64bd4299e836f3909da0fea7bb99e1e8..29d8c15af64bade3a4429cf76191684376d2e91d 100644 (file)
@@ -21,10 +21,14 @@ package org.apache.maven.archiva.web.interceptor;
 
 import com.opensymphony.xwork.ActionInvocation;
 import com.opensymphony.xwork.interceptor.Interceptor;
-import org.apache.maven.archiva.configuration.ArchivaConfiguration;
-import org.apache.maven.archiva.configuration.Configuration;
+
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.model.ArchivaRepository;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 
+import java.util.Iterator;
+import java.util.List;
+
 /**
  * An interceptor that makes the application configuration available
  *
@@ -39,7 +43,7 @@ public class ConfigurationInterceptor
     /**
      * @plexus.requirement
      */
-    private ArchivaConfiguration archivaConfiguration;
+    private ArchivaDAO dao;
 
     /**
      * @param actionInvocation
@@ -49,20 +53,12 @@ public class ConfigurationInterceptor
     public String intercept( ActionInvocation actionInvocation )
         throws Exception
     {
-        Configuration configuration = archivaConfiguration.getConfiguration();
+        List repos = dao.getRepositoryDAO().getRepositories();
 
-        if ( !configuration.isValid() )
+        if ( !hasManagedRepository( repos ) )
         {
-            if ( configuration.getRepositories().isEmpty() )
-            {
-                getLogger().info( "No repositories were configured - forwarding to repository configuration page" );
-                return "config-repository-needed";
-            }
-            else
-            {
-                getLogger().info( "Configuration is incomplete - forwarding to configuration page" );
-                return "config-needed";
-            }
+            getLogger().info( "No repositories exist - forwarding to repository configuration page" );
+            return "config-repository-needed";
         }
         else
         {
@@ -79,4 +75,29 @@ public class ConfigurationInterceptor
     {
         // This space left intentionally blank
     }
+
+    public boolean hasManagedRepository( List repos )
+    {
+        if ( repos == null )
+        {
+            return false;
+        }
+
+        if ( repos.isEmpty() )
+        {
+            return false;
+        }
+
+        Iterator it = repos.iterator();
+        while ( it.hasNext() )
+        {
+            ArchivaRepository repo = (ArchivaRepository) it.next();
+            if ( repo.isManaged() )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
index 334be6873e1ff4f05d1223c5872483a7f67429f7..cd30a56064cdbf89534b1926822c4a7074725428 100644 (file)
@@ -74,11 +74,6 @@ public class ProxiedDavServer
      */
     private ProxyRequestHandler proxyRequestHandler;
 
-    /**
-     * @plexus.requirement
-     */
-    private ConfiguredRepositoryFactory repositoryFactory;
-
     private RepositoryConfiguration repositoryConfiguration;
 
     private ArtifactRepository managedRepository;
index cb31844438aca74dd4f8deaa5c1ce3f891745366..073802d0ce06c59a2588b80825a717cf33d786f9 100644 (file)
@@ -20,8 +20,10 @@ package org.apache.maven.archiva.web.repository;
  */
 
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
-import org.apache.maven.archiva.configuration.Configuration;
-import org.apache.maven.archiva.configuration.RepositoryConfiguration;
+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.ArchivaRepository;
 import org.apache.maven.archiva.security.ArchivaRoleConstants;
 import org.codehaus.plexus.registry.Registry;
 import org.codehaus.plexus.registry.RegistryListener;
@@ -40,15 +42,16 @@ import org.codehaus.plexus.webdav.servlet.DavServerRequest;
 import org.codehaus.plexus.webdav.servlet.multiplexed.MultiplexedWebDavServlet;
 import org.codehaus.plexus.webdav.util.WebdavMethodUtil;
 
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * RepositoryServlet
  *
@@ -74,9 +77,15 @@ public class RepositoryServlet
      */
     private AuditLog audit;
 
-    private Configuration configuration;
+    /**
+     * @plexus.requirement role-hint="jdo"
+     */
+    private ArchivaDAO dao;
 
-    private ArchivaConfiguration archivaConfiguration;
+    /**
+     * @plexus.requirement
+     */
+    private ArchivaConfiguration configuration;
 
     public void initComponents()
         throws ServletException
@@ -87,46 +96,73 @@ public class RepositoryServlet
         httpAuth = (HttpAuthenticator) lookup( HttpAuthenticator.ROLE, "basic" );
         audit = (AuditLog) lookup( AuditLog.ROLE );
 
-        archivaConfiguration = (ArchivaConfiguration) lookup( ArchivaConfiguration.class.getName() );
-        configuration = archivaConfiguration.getConfiguration();
-        archivaConfiguration.addChangeListener( this );
+        dao = (ArchivaDAO) lookup( ArchivaDAO.ROLE, "jdo" );
+        configuration = (ArchivaConfiguration) lookup( ArchivaConfiguration.class.getName() );
+        configuration.addChangeListener( this );
     }
 
     public void initServers( ServletConfig servletConfig )
         throws DavServerException
     {
-        List repositories = configuration.getRepositories();
-        Iterator itrepos = repositories.iterator();
-        while ( itrepos.hasNext() )
+        try
         {
-            RepositoryConfiguration repoConfig = (RepositoryConfiguration) itrepos.next();
-            File repoDir = new File( repoConfig.getDirectory() );
-             
-            if ( !repoDir.exists() )
+            List repositories = dao.getRepositoryDAO().getRepositories();
+            Iterator itrepos = repositories.iterator();
+            while ( itrepos.hasNext() )
             {
-                repoDir.mkdirs();
-            }
+                ArchivaRepository repo = (ArchivaRepository) itrepos.next();
+                if ( !repo.isManaged() )
+                {
+                    // Skip non-managed.
+                    continue;
+                }
+
+                File repoDir = new File( repo.getUrl().getPath() );
+
+                if ( !repoDir.exists() )
+                {
+                    repoDir.mkdirs();
+                }
 
-            DavServerComponent server = createServer( repoConfig.getUrlName(),  repoDir, servletConfig );
+                DavServerComponent server = createServer( repo.getId(), repoDir, servletConfig );
 
-            server.addListener( audit );
+                server.addListener( audit );
+            }
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            throw new DavServerException( "Unable to initialized dav servers: " + e.getMessage(), e );
         }
     }
 
-    public RepositoryConfiguration getRepositoryConfiguration( DavServerRequest request )
+    public ArchivaRepository getRepository( DavServerRequest request )
     {
-        return configuration.getRepositoryByUrlName( request.getPrefix() );
+        String id = request.getPrefix();
+        try
+        {
+            return dao.getRepositoryDAO().getRepository( id );
+        }
+        catch ( ObjectNotFoundException e )
+        {
+            log( "Unable to find repository for id [" + id + "]" );
+            return null;
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            log( "Unable to find repository for id [" + id + "]: " + e.getMessage(), e );
+            return null;
+        }
     }
 
     public String getRepositoryName( DavServerRequest request )
     {
-        RepositoryConfiguration repoConfig = getRepositoryConfiguration( request );
+        ArchivaRepository repoConfig = getRepository( request );
         if ( repoConfig == null )
         {
             return "Unknown";
         }
 
-        return repoConfig.getName();
+        return repoConfig.getModel().getName();
     }
 
     public boolean isAuthenticated( DavServerRequest davRequest, HttpServletResponse response )
@@ -146,7 +182,6 @@ public class RepositoryServlet
                                     new AuthenticationException( "User Credentials Invalid" ) );
                 return false;
             }
-
         }
         catch ( AuthenticationException e )
         {
@@ -185,16 +220,15 @@ public class RepositoryServlet
                 permission = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD;
             }
 
-            AuthorizationResult authzResult =
-                securitySystem.authorize( securitySession, permission, getRepositoryConfiguration( davRequest )
-                    .getId() );
+            AuthorizationResult authzResult = securitySystem.authorize( securitySession, permission, davRequest
+                .getPrefix() );
 
             if ( !authzResult.isAuthorized() )
             {
                 if ( authzResult.getException() != null )
                 {
-                    log( "Authorization Denied [ip=" + request.getRemoteAddr() + ",isWriteRequest=" + isWriteRequest +
-                        ",permission=" + permission + "] : " + authzResult.getException().getMessage() );
+                    log( "Authorization Denied [ip=" + request.getRemoteAddr() + ",isWriteRequest=" + isWriteRequest
+                        ",permission=" + permission + "] : " + authzResult.getException().getMessage() );
                 }
 
                 // Issue HTTP Challenge.
@@ -218,12 +252,9 @@ public class RepositoryServlet
 
     public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
     {
-        configuration = archivaConfiguration.getConfiguration();
-
         if ( propertyName.startsWith( "repositories" ) )
         {
-            log( "Triggering managed repository configuration change with " + propertyName + " set to " +
-                propertyValue );
+            log( "Triggering managed repository configuration change with " + propertyName + " set to " + propertyValue );
             getDavManager().removeAllServers();
 
             try
index c84d33ab030331d3abdfcaeec6a5fc4c9c9b458f..3623c5d296142a4aa54595c924cede07f8302f81 100644 (file)
@@ -25,17 +25,22 @@ import com.opensymphony.xwork.util.OgnlValueStack;
 
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
-import org.apache.maven.archiva.common.artifact.managed.ManagedArtifact;
-import org.apache.maven.archiva.configuration.RepositoryConfiguration;
-import org.apache.maven.archiva.repositories.ActiveManagedRepositories;
-import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArchivaDatabaseException;
+import org.apache.maven.archiva.database.Constraint;
+import org.apache.maven.archiva.database.ObjectNotFoundException;
+import org.apache.maven.archiva.database.constraints.ArtifactsRelatedConstraint;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+import org.apache.maven.archiva.model.ArchivaRepository;
+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.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
 import java.io.IOException;
 import java.io.Writer;
 import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
+import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -56,7 +61,12 @@ public class DownloadArtifact
     /**
      * @plexus.requirement 
      */
-    private ActiveManagedRepositories managedRepositories;
+    private ArchivaDAO dao;
+
+    /**
+     * @plexus.requirement
+     */
+    private BidirectionalRepositoryLayoutFactory layoutFactory;
 
     private HttpServletRequest req;
 
@@ -77,8 +87,7 @@ public class DownloadArtifact
         this.res = (HttpServletResponse) pageContext.getResponse();
         try
         {
-            managedRepositories = (ActiveManagedRepositories) PlexusTagUtil.lookup( pageContext,
-                                                                                    ActiveManagedRepositories.ROLE );
+            dao = (ArchivaDAO) PlexusTagUtil.lookup( pageContext, ArchivaDAO.ROLE );
         }
         catch ( ComponentLookupException e )
         {
@@ -92,25 +101,36 @@ public class DownloadArtifact
 
         try
         {
-            ManagedArtifact managedArtifact = managedRepositories.findArtifact( groupId, artifactId, version );
+            Constraint constraint = new ArtifactsRelatedConstraint( groupId, artifactId, version );
+            List relatedArtifacts = dao.getArtifactDAO().queryArtifacts( constraint );
 
-            if ( managedArtifact != null )
+            if ( relatedArtifacts != null )
             {
-                RepositoryConfiguration repoConfig = managedRepositories.getRepositoryConfiguration( managedArtifact
-                    .getRepositoryId() );
-                String prefix = req.getContextPath() + "/repository/" + repoConfig.getUrlName();
+                String repoId = ( (ArchivaArtifact) relatedArtifacts.get( 0 ) ).getModel().getRepositoryId();
+                ArchivaRepository repo = dao.getRepositoryDAO().getRepository( repoId );
+                BidirectionalRepositoryLayout layout = layoutFactory.getLayout( repo.getLayoutType() );
+
+                String prefix = req.getContextPath() + "/repository/" + repoId;
 
                 if ( mini )
                 {
-                    appendMini( sb, prefix, managedArtifact );
+                    appendMini( sb, prefix, repo, layout, relatedArtifacts );
                 }
                 else
                 {
-                    appendNormal( sb, prefix, managedArtifact );
+                    appendNormal( sb, prefix, repo, layout, relatedArtifacts );
                 }
             }
         }
-        catch ( ProjectBuildingException e )
+        catch ( ObjectNotFoundException e )
+        {
+            appendError( sb, e );
+        }
+        catch ( ArchivaDatabaseException e )
+        {
+            appendError( sb, e );
+        }
+        catch ( LayoutException e )
         {
             appendError( sb, e );
         }
@@ -127,17 +147,19 @@ public class DownloadArtifact
         return super.end( writer, body );
     }
 
-    private void appendError( StringBuffer sb, ProjectBuildingException e )
+    private void appendError( StringBuffer sb, Exception e )
     {
         /* do nothing */
     }
 
-    private void appendMini( StringBuffer sb, String prefix, ManagedArtifact managedArtifact )
+    private void appendMini( StringBuffer sb, String prefix, ArchivaRepository repo,
+                             BidirectionalRepositoryLayout layout, List relatedArtifacts )
     {
         /* do nothing */
     }
 
-    private void appendNormal( StringBuffer sb, String prefix, ManagedArtifact managedArtifact )
+    private void appendNormal( StringBuffer sb, String prefix, ArchivaRepository repo,
+                               BidirectionalRepositoryLayout layout, List relatedArtifacts )
     {
         /*
          * <div class="download">
@@ -161,33 +183,25 @@ public class DownloadArtifact
 
         // Heading
         sb.append( "<h2>" );
-        if ( managedArtifact.getAttached().isEmpty() )
+        if ( relatedArtifacts.size() > 1 )
         {
-            sb.append( "Download" );
+            sb.append( "Downloads" );
         }
         else
         {
-            sb.append( "Downloads" );
+            sb.append( "Download" );
         }
         sb.append( "</h2>" );
 
         // Body
         sb.append( "<p class=\"body\">" );
 
-        appendLink( sb, prefix, managedArtifact.getPath(), "main" );
-
-        Iterator it = managedArtifact.getAttached().entrySet().iterator();
+        Iterator it = relatedArtifacts.iterator();
         while ( it.hasNext() )
         {
-            Map.Entry entry = (Entry) it.next();
-            String type = (String) entry.getKey();
-            String path = (String) entry.getValue();
+            ArchivaArtifact artifact = (ArchivaArtifact) it.next();
 
-            if ( StringUtils.isNotBlank( path ) )
-            {
-                sb.append( "<br/>" );
-                appendLink( sb, prefix, path, type );
-            }
+            appendLink( sb, prefix, layout, artifact );
         }
 
         sb.append( "</div>" ); // close "downloadbox.bd.c"
@@ -197,9 +211,12 @@ public class DownloadArtifact
         sb.append( "</div>" ); // close "download"
     }
 
-    private void appendLink( StringBuffer sb, String prefix, String path, String type )
+    private void appendLink( StringBuffer sb, String prefix, BidirectionalRepositoryLayout layout,
+                             ArchivaArtifact artifact )
     {
         StringBuffer url = new StringBuffer();
+        String path = layout.toPath( artifact );
+        String type = artifact.getType();
 
         url.append( prefix );
         url.append( "/" ).append( path );