Author: brett
Date: Fri Nov 27 00:16:19 2009
New Revision: 884727

URL: http://svn.apache.org/viewvc?rev=884727&view=rev
Log:
[MRM-1283] migrate dependees() / "used by" tab to metadata repository and 
remove repositoryBrowsing from ShowArtifactAction

Added:
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionReference.java
   (with props)
Modified:
    
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
    
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
    
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
    
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
    
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java

Modified: 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
 Fri Nov 27 00:16:19 2009
@@ -25,13 +25,13 @@
 
 import com.opensymphony.xwork2.Validateable;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.repository.MetadataResolver;
 import org.apache.archiva.metadata.repository.MetadataResolverException;
 import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.database.ArchivaDatabaseException;
 import org.apache.maven.archiva.database.ObjectNotFoundException;
-import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.apache.maven.archiva.model.CiManagement;
 import org.apache.maven.archiva.model.Dependency;
@@ -60,11 +60,6 @@
     /* .\ Not Exposed \._____________________________________________ */
 
     /**
-     * @plexus.requirement role-hint="default"
-     */
-    private RepositoryBrowsing repoBrowsing;
-
-    /**
      * @plexus.requirement
      */
     private UserRepositories userRepositories;
@@ -146,15 +141,15 @@
             addActionError( "Artifact not found" );
             return ERROR;
         }
-        populateLegacyModel( versionMetadata );
+        model = populateLegacyModel( versionMetadata );
 
         return SUCCESS;
     }
 
-    private void populateLegacyModel( ProjectVersionMetadata versionMetadata )
+    private ArchivaProjectModel populateLegacyModel( ProjectVersionMetadata 
versionMetadata )
     {
         // TODO: eventually, move to just use the metadata directly, with 
minimal JSP changes, mostly for Maven specifics
-        model = new ArchivaProjectModel();
+        ArchivaProjectModel model = new ArchivaProjectModel();
         MavenProjectFacet projectFacet = (MavenProjectFacet) 
versionMetadata.getFacet( MavenProjectFacet.FACET_ID );
         if ( projectFacet != null )
         {
@@ -244,6 +239,7 @@
                 model.addDependency( dependency );
             }
         }
+        return model;
     }
 
     /**
@@ -274,7 +270,7 @@
             addActionError( "Artifact not found" );
             return ERROR;
         }
-        populateLegacyModel( versionMetadata );
+        model = populateLegacyModel( versionMetadata );
 
         this.dependencies = model.getDependencies();
 
@@ -309,7 +305,7 @@
             addActionError( "Artifact not found" );
             return ERROR;
         }
-        populateLegacyModel( versionMetadata );
+        model = populateLegacyModel( versionMetadata );
 
         this.mailingLists = model.getMailingLists();
 
@@ -334,9 +330,52 @@
     public String dependees()
         throws ObjectNotFoundException, ArchivaDatabaseException
     {
-        this.model = repoBrowsing.selectVersion( getPrincipal(), 
getObservableRepos(), groupId, artifactId, version );
+        ProjectVersionMetadata versionMetadata = null;
+        for ( String repoId : getObservableRepos() )
+        {
+            if ( versionMetadata == null )
+            {
+                try
+                {
+                    versionMetadata = metadataResolver.getProjectVersion( 
repoId, groupId, artifactId, version );
+                }
+                catch ( MetadataResolverException e )
+                {
+                    addActionError( "Error occurred resolving metadata for 
project: " + e.getMessage() );
+                    return ERROR;
+                }
+            }
+        }
+
+        if ( versionMetadata == null )
+        {
+            addActionError( "Artifact not found" );
+            return ERROR;
+        }
+        model = populateLegacyModel( versionMetadata );
+
+        List<ProjectVersionReference> references = new 
ArrayList<ProjectVersionReference>();
+        // TODO: what if we get duplicates across repositories?
+        for ( String repoId : getObservableRepos() )
+        {
+            // TODO: what about if we want to see this irrespective of version?
+            references.addAll( metadataResolver.getProjectReferences( repoId, 
groupId, artifactId, version ) );
+        }
+
+        this.dependees = new ArrayList<ArchivaProjectModel>();
+        for ( ProjectVersionReference reference : references )
+        {
+            ArchivaProjectModel ref = new ArchivaProjectModel();
 
-        this.dependees = repoBrowsing.getUsedBy( getPrincipal(), 
getObservableRepos(), groupId, artifactId, version );
+            ref.setGroupId( reference.getNamespace() );
+            ref.setArtifactId( reference.getProjectId() );
+            ref.setVersion( reference.getProjectVersion() );
+
+            dependees.add( ref );
+        }
+
+        // TODO: may need to note on the page that references will be 
incomplete if the other artifacts are not yet stored in the content repository
+        // (especially in the case of pre-population import)
 
         return SUCCESS;
     }
@@ -350,6 +389,9 @@
         // temporarily use this as we only need the model for the tag to 
perform, but we should be resolving the
         // graph here instead
 
+        // TODO: may need to note on the page that tree will be incomplete if 
the other artifacts are not yet stored in the content repository
+        // (especially in the case of pre-population import)
+
         return artifact();
     }
 

Modified: 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
 Fri Nov 27 00:16:19 2009
@@ -25,8 +25,9 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.repository.MetadataResolver;
 
 public class TestMetadataResolver
@@ -36,6 +37,9 @@
 
     private Map<String, List<String>> artifactVersions = new HashMap<String, 
List<String>>();
 
+    private Map<String, List<ProjectVersionReference>> references =
+        new HashMap<String, List<ProjectVersionReference>>();
+
     public ProjectMetadata getProject( String repoId, String namespace, String 
projectId )
     {
         ProjectMetadata metadata = new ProjectMetadata();
@@ -44,30 +48,45 @@
         return metadata;
     }
 
-    public ProjectVersionMetadata getProjectVersion( String repoId, String 
namespace, String projectId, String projectVersion )
+    public ProjectVersionMetadata getProjectVersion( String repoId, String 
namespace, String projectId,
+                                                     String projectVersion )
     {
         return projectVersions.get( createMapKey( repoId, namespace, 
projectId, projectVersion ) );
     }
 
-    public Collection<String> getArtifactVersions( String repoId, String 
namespace, String projectId, String projectVersion )
+    public Collection<String> getArtifactVersions( String repoId, String 
namespace, String projectId,
+                                                   String projectVersion )
     {
         List<String> versions = artifactVersions.get( createMapKey( repoId, 
namespace, projectId, projectVersion ) );
         return ( versions != null ? versions : Collections.<String>emptyList() 
);
     }
 
-    public void setProjectVersion( String repoId, String namespace, String 
projectId, ProjectVersionMetadata versionMetadata )
+    public Collection<ProjectVersionReference> getProjectReferences( String 
repoId, String namespace, String projectId,
+                                                                     String 
projectVersion )
+    {
+        return references.get( createMapKey( repoId, namespace, projectId, 
projectVersion ) );
+    }
+
+    public void setProjectVersion( String repoId, String namespace, String 
projectId,
+                                   ProjectVersionMetadata versionMetadata )
     {
         projectVersions.put( createMapKey( repoId, namespace, projectId, 
versionMetadata.getId() ), versionMetadata );
     }
 
-    public void setArtifactVersions( String repoId, String namespace, String 
projectId, String version,
+    public void setArtifactVersions( String repoId, String namespace, String 
projectId, String projectVersion,
                                      List<String> versions )
     {
-        artifactVersions.put( createMapKey( repoId, namespace, projectId, 
version ), versions );
+        artifactVersions.put( createMapKey( repoId, namespace, projectId, 
projectVersion ), versions );
     }
 
     private String createMapKey( String repoId, String namespace, String 
projectId, String projectVersion )
     {
         return repoId + ":" + namespace + ":" + projectId + ":" + 
projectVersion;
     }
+
+    public void setProjectReferences( String repoId, String namespace, String 
projectId, String projectVersion,
+                                      List<ProjectVersionReference> references 
)
+    {
+        this.references.put( createMapKey( repoId, namespace, projectId, 
projectVersion ), references );
+    }
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
 Fri Nov 27 00:16:19 2009
@@ -31,25 +31,16 @@
 import org.apache.archiva.metadata.model.MailingList;
 import org.apache.archiva.metadata.model.Organization;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.model.Scm;
 import org.apache.archiva.metadata.repository.memory.TestMetadataResolver;
 import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
 import 
org.apache.archiva.metadata.repository.storage.maven2.MavenProjectParent;
-import org.apache.maven.archiva.database.ArchivaDAO;
 import org.apache.maven.archiva.database.ArchivaDatabaseException;
-import org.apache.maven.archiva.database.ArtifactDAO;
-import org.apache.maven.archiva.database.ProjectModelDAO;
-import 
org.apache.maven.archiva.database.constraints.ArtifactsRelatedConstraint;
-import 
org.apache.maven.archiva.database.constraints.ProjectsByArtifactUsageConstraint;
-import org.apache.maven.archiva.model.ArchivaArtifact;
-import org.apache.maven.archiva.model.ArchivaArtifactModel;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
-import org.apache.maven.archiva.model.VersionedReference;
 import org.apache.maven.archiva.security.UserRepositories;
 import org.apache.maven.archiva.security.UserRepositoriesStub;
-import org.apache.maven.archiva.web.action.admin.repositories.ArchivaDAOStub;
 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
-import org.easymock.MockControl;
 
 public class ShowArtifactActionTest
     extends PlexusInSpringTestCase
@@ -115,8 +106,6 @@
 
     private ShowArtifactAction action;
 
-    private ArchivaDAOStub archivaDao;
-
     private TestMetadataResolver metadataResolver;
 
     public void testInstantiation()
@@ -415,34 +404,17 @@
     public void testGetDependees()
         throws ArchivaDatabaseException
     {
-        List<ArchivaArtifact> artifacts =
-            Collections.singletonList( createArtifact( TEST_GROUP_ID, 
TEST_ARTIFACT_ID, TEST_VERSION ) );
-        MockControl artifactDaoMockControl = createArtifactDaoMock( artifacts, 
1 );
-        ArchivaProjectModel legacyModel = createLegacyProjectModel( 
TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_VERSION );
-
-        MockControl projectDaoMockControl = MockControl.createNiceControl( 
ProjectModelDAO.class );
-        ProjectModelDAO dao = (ProjectModelDAO) 
projectDaoMockControl.getMock();
-        archivaDao.setProjectDao( dao );
-
-        projectDaoMockControl.expectAndReturn(
-            dao.getProjectModel( legacyModel.getGroupId(), 
legacyModel.getArtifactId(), legacyModel.getVersion() ),
-            legacyModel );
-
-        ArchivaProjectModel dependee1 = createBasicLegacyModel( "groupId", 
"artifactId1", "version" );
-        ArchivaProjectModel dependee2 = createBasicLegacyModel( "groupId", 
"artifactId2", "version" );
-        projectDaoMockControl.expectAndReturn( dao.queryProjectModels(
-            new ProjectsByArtifactUsageConstraint( TEST_GROUP_ID, 
TEST_ARTIFACT_ID, TEST_VERSION ) ),
+        ProjectVersionMetadata versionMetadata = createProjectModel( 
TEST_VERSION );
+        metadataResolver.setProjectVersion( TEST_REPO, TEST_GROUP_ID, 
TEST_ARTIFACT_ID, versionMetadata );
+        ProjectVersionReference dependee1 = createReference( "artifactId1" );
+        ProjectVersionReference dependee2 = createReference( "artifactId2" );
+        metadataResolver.setProjectReferences( TEST_REPO, TEST_GROUP_ID, 
TEST_ARTIFACT_ID, TEST_VERSION,
                                                Arrays.asList( dependee1, 
dependee2 ) );
 
-        projectDaoMockControl.replay();
-
         setActionParameters();
 
         String result = action.dependees();
 
-        artifactDaoMockControl.verify();
-        projectDaoMockControl.verify();
-
         assertActionSuccess( action, result );
 
         assertActionParameters( action );
@@ -459,6 +431,16 @@
         assertNull( action.getSnapshotVersions() );
     }
 
+    private ProjectVersionReference createReference( String projectId )
+    {
+        ProjectVersionReference reference = new ProjectVersionReference();
+        reference.setNamespace( "groupId" );
+        reference.setProjectId( projectId );
+        reference.setProjectVersion( "version" );
+        reference.setReferenceType( 
ProjectVersionReference.ReferenceType.DEPENDENCY );
+        return reference;
+    }
+
     private void assertCoordinate( ArchivaProjectModel dependee, String 
artifactId )
     {
         assertEquals( artifactId, dependee.getArtifactId() );
@@ -651,99 +633,11 @@
         return model;
     }
 
-    private ArchivaProjectModel createLegacyProjectModel( String groupId, 
String artifactId, String version )
-    {
-        ArchivaProjectModel model = createBasicLegacyModel( groupId, 
artifactId, version );
-        model.setPackaging( TEST_PACKAGING );
-        model.setUrl( TEST_URL );
-        model.setName( TEST_NAME );
-        model.setDescription( TEST_DESCRIPTION );
-        VersionedReference parent = new VersionedReference();
-        parent.setGroupId( TEST_PARENT_GROUP_ID );
-        parent.setArtifactId( TEST_PARENT_ARTIFACT_ID );
-        parent.setVersion( TEST_PARENT_VERSION );
-        model.setParentProject( parent );
-        org.apache.maven.archiva.model.CiManagement ci = new 
org.apache.maven.archiva.model.CiManagement();
-        ci.setSystem( TEST_CI_SYSTEM );
-        ci.setUrl( TEST_CI_URL );
-        model.setCiManagement( ci );
-        org.apache.maven.archiva.model.IssueManagement issue = new 
org.apache.maven.archiva.model.IssueManagement();
-        issue.setSystem( TEST_ISSUE_SYSTEM );
-        issue.setUrl( TEST_ISSUE_URL );
-        model.setIssueManagement( issue );
-        org.apache.maven.archiva.model.Organization org = new 
org.apache.maven.archiva.model.Organization();
-        org.setName( TEST_ORGANIZATION_NAME );
-        org.setUrl( TEST_ORGANIZATION_URL );
-        model.setOrganization( org );
-        org.apache.maven.archiva.model.License l = new 
org.apache.maven.archiva.model.License();
-        l.setName( TEST_LICENSE_NAME );
-        l.setUrl( TEST_LICENSE_URL );
-        model.addLicense( l );
-        l = new org.apache.maven.archiva.model.License();
-        l.setName( TEST_LICENSE_NAME_2 );
-        l.setUrl( TEST_LICENSE_URL_2 );
-        model.addLicense( l );
-        org.apache.maven.archiva.model.Scm scm = new 
org.apache.maven.archiva.model.Scm();
-        scm.setConnection( TEST_SCM_CONNECTION );
-        scm.setDeveloperConnection( TEST_SCM_DEV_CONNECTION );
-        scm.setUrl( TEST_SCM_URL );
-        model.setScm( scm );
-        return model;
-    }
-
-    private ArchivaProjectModel createBasicLegacyModel( String groupId, String 
artifactId, String version )
-    {
-        ArchivaProjectModel model = new ArchivaProjectModel();
-        model.setGroupId( groupId );
-        model.setArtifactId( artifactId );
-        model.setVersion( version );
-        return model;
-    }
-
-    private MockControl createArtifactDaoMock( List<ArchivaArtifact> 
artifacts, int count )
-        throws ArchivaDatabaseException
-    {
-        return createArtifactDaoMock( artifacts, TEST_VERSION, count );
-    }
-
-    private MockControl createArtifactDaoMock( List<ArchivaArtifact> 
artifacts, String version, int count )
-        throws ArchivaDatabaseException
-    {
-        // testing deeper than normal with the mocks as we intend to replace 
RepositoryBrowsing, not just the database
-        // underneath it - those sections will be adjusted with a mock content 
repository later
-        MockControl control = MockControl.createNiceControl( ArtifactDAO.class 
);
-        ArtifactDAO dao = (ArtifactDAO) control.getMock();
-        archivaDao.setArtifactDao( dao );
-
-        ArtifactsRelatedConstraint c = new ArtifactsRelatedConstraint( 
TEST_GROUP_ID, TEST_ARTIFACT_ID, version );
-        dao.queryArtifacts( c );
-        control.setReturnValue( artifacts, count );
-
-        control.replay();
-        return control;
-    }
-
-    private ArchivaArtifact createArtifact( String groupId, String artifactId, 
String version )
-    {
-        return createArtifact( groupId, artifactId, version, TEST_REPO );
-    }
-
-    private ArchivaArtifact createArtifact( String groupId, String artifactId, 
String version, String repoId )
-    {
-        ArchivaArtifactModel model = new ArchivaArtifactModel();
-        model.setGroupId( groupId );
-        model.setArtifactId( artifactId );
-        model.setVersion( version );
-        model.setRepositoryId( repoId );
-        return new ArchivaArtifact( model );
-    }
-
     protected void setUp()
         throws Exception
     {
         super.setUp();
         action = (ShowArtifactAction) lookup( Action.class, ACTION_HINT );
         metadataResolver = (TestMetadataResolver) action.getMetadataResolver();
-        archivaDao = (ArchivaDAOStub) lookup( ArchivaDAO.class, "jdo" );
     }
 }

Added: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionReference.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionReference.java?rev=884727&view=auto
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionReference.java
 (added)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionReference.java
 Fri Nov 27 00:16:19 2009
@@ -0,0 +1,77 @@
+package org.apache.archiva.metadata.model;
+
+/*
+ * 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.
+ */
+
+public class ProjectVersionReference
+{
+    private ReferenceType referenceType;
+
+    private String projectId;
+
+    private String namespace;
+
+    private String projectVersion;
+
+    public void setReferenceType( ReferenceType referenceType )
+    {
+        this.referenceType = referenceType;
+    }
+
+    public void setNamespace( String namespace )
+    {
+        this.namespace = namespace;
+    }
+
+    public void setProjectId( String projectId )
+    {
+        this.projectId = projectId;
+    }
+
+    public ReferenceType getReferenceType()
+    {
+        return referenceType;
+    }
+
+    public String getProjectId()
+    {
+        return projectId;
+    }
+
+    public String getProjectVersion()
+    {
+        return projectVersion;
+    }
+
+    public String getNamespace()
+    {
+        return namespace;
+    }
+
+    public void setProjectVersion( String projectVersion )
+    {
+        this.projectVersion = projectVersion;
+    }
+
+    public enum ReferenceType
+    {
+        DEPENDENCY,
+        PARENT
+    }
+}

Propchange: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionReference.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
 Fri Nov 27 00:16:19 2009
@@ -21,8 +21,10 @@
 
 import java.util.Collection;
 
+import org.apache.archiva.metadata.model.Dependency;
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 
 /**
  * @plexus.component 
role="org.apache.archiva.metadata.repository.MetadataResolver"
@@ -38,7 +40,7 @@
     /**
      * FIXME: this needs to be configurable based on storage type, and 
availability of proxy module
      * ... could be a different type since we need methods to modify the 
storage metadata, which would also allow more
-     *     appropriate methods to pass in the already determined repository 
configuration, for example, instead of the ID
+     * appropriate methods to pass in the already determined repository 
configuration, for example, instead of the ID
      *
      * @plexus.requirement role-hint="maven2"
      */
@@ -63,6 +65,22 @@
             metadata = storageResolver.getProjectVersion( repoId, namespace, 
projectId, projectVersion );
             if ( metadata != null )
             {
+                // FIXME: make this a more generic post-processing that 
plugins can take advantage of
+                //       eg. maven projects should be able to process parent 
here
+                if ( !metadata.getDependencies().isEmpty() )
+                {
+                    ProjectVersionReference ref = new 
ProjectVersionReference();
+                    ref.setNamespace( namespace );
+                    ref.setProjectId( projectId );
+                    ref.setProjectVersion( projectVersion );
+                    ref.setReferenceType( 
ProjectVersionReference.ReferenceType.DEPENDENCY );
+                    for ( Dependency dependency : metadata.getDependencies() )
+                    {
+                        metadataRepository.updateProjectReference( repoId, 
dependency.getGroupId(),
+                                                                   
dependency.getArtifactId(), dependency.getVersion(),
+                                                                   ref );
+                    }
+                }
                 metadataRepository.updateProjectVersion( repoId, namespace, 
projectId, metadata );
             }
         }
@@ -75,4 +93,12 @@
         // TODO: intercept
         return metadataRepository.getArtifactVersions( repoId, namespace, 
projectId, projectVersion );
     }
+
+    public Collection<ProjectVersionReference> getProjectReferences( String 
repoId, String namespace, String projectId,
+                                                                     String 
projectVersion )
+    {
+        // TODO: is this assumption correct? could a storage mech. actually 
know all references in a non-Maven scenario?
+        // not passed to the storage mechanism as resolving references would 
require iterating all artifacts
+        return metadataRepository.getProjectReferences( repoId, namespace, 
projectId, projectVersion );
+    }
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
 Fri Nov 27 00:16:19 2009
@@ -22,6 +22,7 @@
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 
 public interface MetadataRepository
     extends MetadataResolver
@@ -39,4 +40,6 @@
     void updateProjectVersion( String repoId, String namespace, String 
projectId,
                                ProjectVersionMetadata versionMetadata );
 
+    void updateProjectReference( String repoId, String namespace, String 
projectId, String projectVersion,
+                                 ProjectVersionReference reference );
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
 Fri Nov 27 00:16:19 2009
@@ -23,6 +23,7 @@
 
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 
 public interface MetadataResolver
 {
@@ -32,4 +33,18 @@
         throws MetadataResolverException;
 
     Collection<String> getArtifactVersions( String repoId, String namespace, 
String projectId, String projectVersion );
+
+    /**
+     * Retrieve project references from the metadata repository. Note that 
this is not built into the content model for
+     * a project version as a reference may be present (due to reverse-lookup 
of dependencies) before the actual
+     * project is, and we want to avoid adding a stub model to the content 
repository.
+     *
+     * @param repoId         the repository ID to look within
+     * @param namespace      the namespace of the project to get references to
+     * @param projectId      the identifier of the project to get references to
+     * @param projectVersion the version of the project to get references to
+     * @return a list of project references
+     */
+    Collection<ProjectVersionReference> getProjectReferences( String repoId, 
String namespace, String projectId,
+                                                              String 
projectVersion );
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
 Fri Nov 27 00:16:19 2009
@@ -26,6 +26,7 @@
 
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.repository.MetadataResolver;
 import org.apache.archiva.metadata.repository.MetadataResolverException;
 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
@@ -274,4 +275,10 @@
     {
         throw new UnsupportedOperationException();
     }
+
+    public Collection<ProjectVersionReference> getProjectReferences( String 
repoId, String namespace, String projectId,
+                                                                     String 
projectVersion )
+    {
+        throw new UnsupportedOperationException();
+    }
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java?rev=884727&r1=884726&r2=884727&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
 Fri Nov 27 00:16:19 2009
@@ -43,6 +43,7 @@
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionFacet;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.model.Scm;
 import org.apache.archiva.metadata.repository.MetadataRepository;
 import org.apache.commons.io.IOUtils;
@@ -91,9 +92,18 @@
     public void updateProjectVersion( String repoId, String namespace, String 
projectId,
                                       ProjectVersionMetadata versionMetadata )
     {
-        File directory = new File( this.directory, repoId + "/" + namespace + 
"/" + projectId );
+        File directory =
+            new File( this.directory, repoId + "/" + namespace + "/" + 
projectId + "/" + versionMetadata.getId() );
 
-        Properties properties = new Properties();
+        Properties properties = readProperties( directory );
+        // remove properties that are not references or artifacts
+        for ( String name : properties.stringPropertyNames() )
+        {
+            if ( !name.startsWith( "artifact:" ) && !name.startsWith( "ref:" ) 
)
+            {
+                properties.remove( name );
+            }
+        }
         properties.setProperty( "id", versionMetadata.getId() );
         setProperty( properties, "name", versionMetadata.getName() );
         setProperty( properties, "description", 
versionMetadata.getDescription() );
@@ -157,7 +167,31 @@
 
         try
         {
-            writeProperties( properties, new File( directory, 
versionMetadata.getId() ) );
+            writeProperties( properties, directory );
+        }
+        catch ( IOException e )
+        {
+            // TODO
+            e.printStackTrace();  //To change body of catch statement use File 
| Settings | File Templates.
+        }
+    }
+
+    public void updateProjectReference( String repoId, String namespace, 
String projectId, String projectVersion,
+                                        ProjectVersionReference reference )
+    {
+        File directory = new File( this.directory, repoId + "/" + namespace + 
"/" + projectId + "/" + projectVersion );
+
+        Properties properties = readProperties( directory );
+        int i = Integer.valueOf( properties.getProperty( 
"ref:lastReferenceNum", "-1" ) ) + 1;
+        setProperty( properties, "ref:lastReferenceNum", Integer.toString( i ) 
);
+        setProperty( properties, "ref:reference." + i + ".namespace", 
reference.getNamespace() );
+        setProperty( properties, "ref:reference." + i + ".projectId", 
reference.getProjectId() );
+        setProperty( properties, "ref:reference." + i + ".projectVersion", 
reference.getProjectVersion() );
+        setProperty( properties, "ref:reference." + i + ".referenceType", 
reference.getReferenceType().toString() );
+
+        try
+        {
+            writeProperties( properties, directory );
         }
         catch ( IOException e )
         {
@@ -192,9 +226,10 @@
 
         Properties properties = readProperties( directory );
 
-        properties.setProperty( "updated:" + artifact.getId(), Long.toString( 
artifact.getUpdated().getTime() ) );
-        properties.setProperty( "size:" + artifact.getId(), Long.toString( 
artifact.getSize() ) );
-        properties.setProperty( "version:" + artifact.getId(), 
artifact.getVersion() );
+        properties.setProperty( "artifact:updated:" + artifact.getId(),
+                                Long.toString( artifact.getUpdated().getTime() 
) );
+        properties.setProperty( "artifact:size:" + artifact.getId(), 
Long.toString( artifact.getSize() ) );
+        properties.setProperty( "artifact:version:" + artifact.getId(), 
artifact.getVersion() );
 
         try
         {
@@ -422,6 +457,28 @@
         return versions;
     }
 
+    public Collection<ProjectVersionReference> getProjectReferences( String 
repoId, String namespace, String projectId,
+                                                                     String 
projectVersion )
+    {
+        File directory = new File( this.directory, repoId + "/" + namespace + 
"/" + projectId + "/" + projectVersion );
+
+        Properties properties = readProperties( directory );
+        int numberOfRefs = Integer.valueOf( properties.getProperty( 
"ref:lastReferenceNum", "-1" ) ) + 1;
+
+        List<ProjectVersionReference> references = new 
ArrayList<ProjectVersionReference>();
+        for ( int i = 0; i < numberOfRefs; i++ )
+        {
+            ProjectVersionReference reference = new ProjectVersionReference();
+            reference.setProjectId( properties.getProperty( "ref:reference." + 
i + ".projectId" ) );
+            reference.setNamespace( properties.getProperty( "ref:reference." + 
i + ".namespace" ) );
+            reference.setProjectVersion( properties.getProperty( 
"ref:reference." + i + ".projectVersion" ) );
+            reference.setReferenceType( 
ProjectVersionReference.ReferenceType.valueOf(
+                properties.getProperty( "ref:reference." + i + 
".referenceType" ) ) );
+            references.add( reference );
+        }
+        return references;
+    }
+
     private void writeProperties( Properties properties, File directory )
         throws IOException
     {


Reply via email to