diff options
author | Brett Porter <brett@apache.org> | 2009-11-25 00:45:57 +0000 |
---|---|---|
committer | Brett Porter <brett@apache.org> | 2009-11-25 00:45:57 +0000 |
commit | d9e22fa7781c37b8df8a0a3e358ec0b1ace43451 (patch) | |
tree | 197d9214a8c30bf2d254e6a7feb5a18c63da3380 | |
parent | 627ad47211e5ce1d14218e4ed495f786b4128eac (diff) | |
download | archiva-d9e22fa7781c37b8df8a0a3e358ec0b1ace43451.tar.gz archiva-d9e22fa7781c37b8df8a0a3e358ec0b1ace43451.zip |
[MRM-1282] introduce a metadata resolver API that will allow just-in-time addition to the content repository and the ability to introduce proxying
git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/MRM-1025@883936 13f79535-47bb-0310-9956-ffa450edef68
17 files changed, 626 insertions, 51 deletions
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java index a2d8e89ea..e63468430 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java @@ -25,7 +25,7 @@ import java.util.List; import com.opensymphony.xwork2.Validateable; import org.apache.archiva.metadata.model.ProjectBuildMetadata; -import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.MetadataResolver; import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.database.ArchivaDatabaseException; @@ -71,7 +71,7 @@ public class ShowArtifactAction /** * @plexus.requirement */ - private MetadataRepository metadataRepository; + private MetadataResolver metadataResolver; /* .\ Exposed Output Objects \.__________________________________ */ @@ -112,16 +112,16 @@ public class ShowArtifactAction { if ( build == null ) { - // TODO: we don't really want the implementation being that intelligent - so another resolver to do - // the "just-in-time" nature of picking up the metadata (if appropriate for the repository type) if not - // found in the content repository is needed here - build = metadataRepository.getProjectBuild( repoId, groupId, artifactId, version ); + // we don't really want the implementation being that intelligent - so another resolver to do the + // "just-in-time" nature of picking up the metadata (if appropriate for the repository type) is used + build = metadataResolver.getProjectBuild( repoId, groupId, artifactId, version ); if ( build != null ) { repositoryId = repoId; } } - snapshotVersions.addAll( metadataRepository.getArtifactVersions( repoId, groupId, artifactId, version ) ); + + snapshotVersions.addAll( metadataResolver.getArtifactVersions( repoId, groupId, artifactId, version ) ); snapshotVersions.remove( version ); } @@ -365,8 +365,8 @@ public class ShowArtifactAction this.snapshotVersions = snapshotVersions; } - public MetadataRepository getMetadataRepository() + public MetadataResolver getMetadataRepository() { - return metadataRepository; + return metadataResolver; } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/MemoryMetadataRepository.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java index 79e15ab8b..40670f7d6 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/MemoryMetadataRepository.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java @@ -25,33 +25,17 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectBuildMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; -import org.apache.archiva.metadata.repository.MetadataRepository; +import org.apache.archiva.metadata.repository.MetadataResolver; -public class MemoryMetadataRepository - implements MetadataRepository +public class TestMetadataResolver + implements MetadataResolver { private Map<String, ProjectBuildMetadata> projectBuilds = new HashMap<String, ProjectBuildMetadata>(); private Map<String, List<String>> artifactVersions = new HashMap<String, List<String>>(); - public void updateProject( String repoId, ProjectMetadata project ) - { - throw new UnsupportedOperationException( ); - } - - public void updateArtifact( String repoId, String namespace, String projectId, String buildId, ArtifactMetadata artifactMeta ) - { - throw new UnsupportedOperationException( ); - } - - public void updateBuild( String repoId, String namespace, String projectId, ProjectBuildMetadata build ) - { - throw new UnsupportedOperationException( ); - } - public ProjectMetadata getProject( String repoId, String namespace, String projectId ) { ProjectMetadata metadata = new ProjectMetadata(); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java index e667eedfb..56e5d1d73 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java @@ -30,7 +30,7 @@ import org.apache.archiva.metadata.model.License; import org.apache.archiva.metadata.model.Organization; import org.apache.archiva.metadata.model.ProjectBuildMetadata; import org.apache.archiva.metadata.model.Scm; -import org.apache.archiva.metadata.repository.memory.MemoryMetadataRepository; +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.model.ArchivaProjectModel; @@ -102,7 +102,7 @@ public class ShowArtifactActionTest private ShowArtifactAction action; - private MemoryMetadataRepository metadataRepository; + private TestMetadataResolver metadataResolver; public void testInstantiation() { @@ -111,7 +111,7 @@ public class ShowArtifactActionTest public void testGetArtifactUniqueRelease() { - metadataRepository.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); setActionParameters(); @@ -134,9 +134,9 @@ public class ShowArtifactActionTest public void testGetArtifactUniqueSnapshot() { - metadataRepository.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_SNAPSHOT_VERSION ) ); - metadataRepository.setArtifactVersions( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_SNAPSHOT_VERSION, + metadataResolver.setArtifactVersions( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_SNAPSHOT_VERSION, ALL_TEST_SNAPSHOT_VERSIONS ); action.setGroupId( TEST_GROUP_ID ); @@ -164,9 +164,9 @@ public class ShowArtifactActionTest public void testGetArtifactUniqueSnapshotTimestamped() { - metadataRepository.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_TS_SNAPSHOT_VERSION ) ); - metadataRepository.setArtifactVersions( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_TS_SNAPSHOT_VERSION, + metadataResolver.setArtifactVersions( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_TS_SNAPSHOT_VERSION, ALL_TEST_SNAPSHOT_VERSIONS ); action.setGroupId( TEST_GROUP_ID ); @@ -220,7 +220,7 @@ public class ShowArtifactActionTest public void testGetArtifactNotInObservableRepos() { - metadataRepository.setProjectBuild( OTHER_TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( OTHER_TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); setActionParameters(); @@ -235,7 +235,7 @@ public class ShowArtifactActionTest public void testGetArtifactOnlySeenInSecondObservableRepo() { setObservableRepos( Arrays.asList( OTHER_TEST_REPO, TEST_REPO ) ); - metadataRepository.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); setActionParameters(); @@ -259,9 +259,9 @@ public class ShowArtifactActionTest public void testGetArtifactSeenInBothObservableRepo() { setObservableRepos( Arrays.asList( TEST_REPO, OTHER_TEST_REPO ) ); - metadataRepository.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); - metadataRepository.setProjectBuild( OTHER_TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( OTHER_TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); setActionParameters(); @@ -285,9 +285,9 @@ public class ShowArtifactActionTest public void testGetArtifactCanOnlyObserveInOneOfTwoRepos() { setObservableRepos( Arrays.asList( TEST_REPO ) ); - metadataRepository.setProjectBuild( OTHER_TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( OTHER_TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); - metadataRepository.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, + metadataResolver.setProjectBuild( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, createProjectModel( TEST_VERSION ) ); setActionParameters(); @@ -437,6 +437,6 @@ public class ShowArtifactActionTest { super.setUp(); action = (ShowArtifactAction) lookup( Action.class, ACTION_HINT ); - metadataRepository = (MemoryMetadataRepository) action.getMetadataRepository(); + metadataResolver = (TestMetadataResolver) action.getMetadataRepository(); } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml index c829d6c15..aab8338b6 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/ShowArtifactActionTest.xml @@ -36,9 +36,9 @@ <implementation>org.apache.maven.archiva.security.UserRepositoriesStub</implementation> </component> <component> - <role>org.apache.archiva.metadata.repository.MetadataRepository</role> + <role>org.apache.archiva.metadata.repository.MetadataResolver</role> <role-hint>default</role-hint> - <implementation>org.apache.archiva.metadata.repository.memory.MemoryMetadataRepository</implementation> + <implementation>org.apache.archiva.metadata.repository.memory.TestMetadataResolver</implementation> <instantiation-strategy>per-lookup</instantiation-strategy> </component> </components> diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java new file mode 100644 index 000000000..d7837a8a3 --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java @@ -0,0 +1,69 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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 java.util.Collection; + +import org.apache.archiva.metadata.model.ProjectBuildMetadata; +import org.apache.archiva.metadata.model.ProjectMetadata; + +/** + * @plexus.component role="org.apache.archiva.metadata.repository.MetadataResolver" + */ +public class DefaultMetadataResolver + implements MetadataResolver +{ + /** + * @plexus.requirement + */ + private MetadataRepository metadataRepository; + + /** + * TODO: this needs to be configurable based on storage type, and availability of proxy module + * TODO: could be a different type since we need methods to modify the storage metadata + * @plexus.requirement role-hint="maven2" + */ + private MetadataResolver storageResolver; + + public ProjectMetadata getProject( String repoId, String namespace, String projectId ) + { + // TODO: intercept + return metadataRepository.getProject( repoId, namespace, projectId ); + } + + public ProjectBuildMetadata getProjectBuild( String repoId, String namespace, String projectId, String buildId ) + { + ProjectBuildMetadata metadata = metadataRepository.getProjectBuild( repoId, namespace, projectId, buildId ); + // TODO: do we want to detect changes as well by comparing timestamps? isProjectBuildNewerThan(updated) + // in such cases we might also remove/update stale metadata, including adjusting plugin-based facets + if ( metadata == null ) + { + metadata = storageResolver.getProjectBuild( repoId, namespace, projectId, buildId ); + metadataRepository.updateBuild( repoId, namespace, projectId, metadata ); + } + return metadata; + } + + public Collection<String> getArtifactVersions( String repoId, String namespace, String projectId, String buildId ) + { + // TODO: intercept + return metadataRepository.getArtifactVersions( repoId, namespace, projectId, buildId ); + } +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java index 4440a9e07..6e20282c1 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java @@ -19,13 +19,12 @@ package org.apache.archiva.metadata.repository; * under the License. */ -import java.util.Collection; - import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectBuildMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; public interface MetadataRepository + extends MetadataResolver { /** * Update metadata for a particular project in the metadata repository, or create it if it does not already exist. @@ -37,9 +36,4 @@ public interface MetadataRepository void updateBuild( String repoId, String namespace, String projectId, ProjectBuildMetadata build ); - ProjectMetadata getProject( String repoId, String namespace, String projectId ); - - ProjectBuildMetadata getProjectBuild( String repoId, String namespace, String projectId, String buildId ); - - Collection<String> getArtifactVersions( String repoId, String namespace, String projectId, String buildId ); } diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java new file mode 100644 index 000000000..fd2cf83d4 --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java @@ -0,0 +1,34 @@ +package org.apache.archiva.metadata.repository; + +/* + * 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 java.util.Collection; + +import org.apache.archiva.metadata.model.ProjectBuildMetadata; +import org.apache.archiva.metadata.model.ProjectMetadata; + +public interface MetadataResolver +{ + ProjectMetadata getProject( String repoId, String namespace, String projectId ); + + ProjectBuildMetadata getProjectBuild( String repoId, String namespace, String projectId, String buildId ); + + Collection<String> getArtifactVersions( String repoId, String namespace, String projectId, String buildId ); +} diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java new file mode 100644 index 000000000..3a581d696 --- /dev/null +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java @@ -0,0 +1,29 @@ +package org.apache.archiva.metadata.repository.storage; + +/* + * 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 java.io.File; + +public interface RepositoryPathTranslator +{ + File toFile( File basedir, String namespace, String projectId, String buildId, String filename ); + + String toPath( String namespace, String projectId, String buildId, String filename ); +} diff --git a/archiva-modules/plugins/maven2-repository/pom.xml b/archiva-modules/plugins/maven2-repository/pom.xml index 0cf46c7fb..1524507c7 100644 --- a/archiva-modules/plugins/maven2-repository/pom.xml +++ b/archiva-modules/plugins/maven2-repository/pom.xml @@ -32,5 +32,44 @@ <groupId>org.apache.archiva</groupId> <artifactId>metadata-model</artifactId> </dependency> + <dependency> + <groupId>org.apache.archiva</groupId> + <artifactId>metadata-repository-api</artifactId> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-spring</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging-api</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-model-builder</artifactId> + <version>3.0-alpha-4</version> + </dependency> + <dependency> + <groupId>org.apache.archiva</groupId> + <artifactId>archiva-configuration</artifactId> + <version>1.3-SNAPSHOT</version> + </dependency> </dependencies> + <dependencyManagement> + <dependencies> + <!-- TODO: this is to override the top level dependency management - we need to rationalise these --> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-model</artifactId> + <version>3.0-alpha-4</version> + </dependency> + </dependencies> + </dependencyManagement> </project> diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/DummyLifecycleBindingsInjector.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/DummyLifecycleBindingsInjector.java new file mode 100644 index 000000000..15b0d01f3 --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/DummyLifecycleBindingsInjector.java @@ -0,0 +1,39 @@ +package org.apache.archiva.metadata.repository.storage.maven2; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.model.Model; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.model.building.ModelProblemCollector; +import org.apache.maven.model.plugin.LifecycleBindingsInjector; + +/** + * Required as plexus-spring doesn't understand the optional = true argument added to Plexus and used here. + * + * @plexus.component role="org.apache.maven.model.plugin.LifecycleBindingsInjector" + */ +public class DummyLifecycleBindingsInjector + implements LifecycleBindingsInjector +{ + public void injectLifecycleBindings( Model model, ModelBuildingRequest modelBuildingRequest, ModelProblemCollector modelProblemCollector ) + { + // left intentionally blank + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java new file mode 100644 index 000000000..ff414d844 --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java @@ -0,0 +1,111 @@ +package org.apache.archiva.metadata.repository.storage.maven2; + +/* + * 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 java.io.File; +import java.util.Collection; + +import org.apache.archiva.metadata.model.ProjectBuildMetadata; +import org.apache.archiva.metadata.model.ProjectMetadata; +import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; +import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; +import org.apache.maven.model.Model; +import org.apache.maven.model.building.DefaultModelBuildingRequest; +import org.apache.maven.model.building.ModelBuilder; +import org.apache.maven.model.building.ModelBuildingException; +import org.apache.maven.model.building.ModelBuildingRequest; + +/** + * @plexus.component role="org.apache.archiva.metadata.repository.MetadataResolver" role-hint="maven2" + */ +public class Maven2RepositoryMetadataResolver + implements MetadataResolver +{ + /** + * @plexus.requirement + */ + private ModelBuilder builder; + + /** + * @plexus.requirement + */ + private ArchivaConfiguration archivaConfiguration; + + /** + * @plexus.requirement role-hint="maven2" + */ + private RepositoryPathTranslator pathTranslator; + + public ProjectMetadata getProject( String repoId, String namespace, String projectId ) + { + throw new UnsupportedOperationException(); + } + + public ProjectBuildMetadata getProjectBuild( String repoId, String namespace, String projectId, String buildId ) + { + ManagedRepositoryConfiguration repositoryConfiguration = + archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId ); + + File basedir = new File( repositoryConfiguration.getLocation() ); + File file = pathTranslator.toFile( basedir, namespace, projectId, buildId, projectId + "-" + buildId + ".pom" ); + + ModelBuildingRequest req = new DefaultModelBuildingRequest(); + req.setProcessPlugins( false ); + req.setPomFile( file ); + req.setModelResolver( new RepositoryModelResolver( basedir, pathTranslator ) ); + + Model model; + try + { + model = builder.build( req ).getEffectiveModel(); + } + catch ( ModelBuildingException e ) + { + // TODO: handle it + throw new RuntimeException( e ); + } + + MavenProjectFacet facet = new MavenProjectFacet(); + facet.setGroupId( model.getGroupId() != null ? model.getGroupId() : model.getParent().getGroupId() ); + facet.setArtifactId( model.getArtifactId() ); + facet.setPackaging( model.getPackaging() ); + if ( model.getParent() != null ) + { + MavenProjectParent parent = new MavenProjectParent(); + parent.setGroupId( model.getParent().getGroupId() ); + parent.setArtifactId( model.getParent().getArtifactId() ); + parent.setVersion( model.getParent().getVersion() ); + facet.setParent( parent ); + } + ProjectBuildMetadata metadata = new ProjectBuildMetadata(); + metadata.setUrl( model.getUrl() ); + metadata.addFacet( facet ); + // TODO: convert project + + return metadata; + } + + public Collection<String> getArtifactVersions( String repoId, String namespace, String projectId, String buildId ) + { + throw new UnsupportedOperationException(); + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java new file mode 100644 index 000000000..53cabacaa --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java @@ -0,0 +1,57 @@ +package org.apache.archiva.metadata.repository.storage.maven2; + +import java.io.File; + +import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; + +/* + * 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. + */ + +/** + * @plexus.component role="org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator" role-hint="maven2" + */ +public class Maven2RepositoryPathTranslator + implements RepositoryPathTranslator +{ + private static final char PATH_SEPARATOR = '/'; + + private static final char GROUP_SEPARATOR = '.'; + + public File toFile( File basedir, String namespace, String projectId, String buildId, String filename ) + { + return new File( basedir, toPath( namespace, projectId, buildId, filename ) ); + } + + public String toPath( String namespace, String projectId, String buildId, String filename ) + { + StringBuilder path = new StringBuilder(); + + path.append( formatAsDirectory( namespace ) ).append( PATH_SEPARATOR ); + path.append( projectId ).append( PATH_SEPARATOR ); + path.append( buildId ).append( PATH_SEPARATOR ); + path.append( filename ); + + return path.toString(); + } + + private String formatAsDirectory( String directory ) + { + return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR ); + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java new file mode 100644 index 000000000..b76d8740d --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java @@ -0,0 +1,66 @@ +package org.apache.archiva.metadata.repository.storage.maven2; + +/* + * 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 java.io.File; + +import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; +import org.apache.maven.model.Repository; +import org.apache.maven.model.building.FileModelSource; +import org.apache.maven.model.building.ModelSource; +import org.apache.maven.model.resolution.InvalidRepositoryException; +import org.apache.maven.model.resolution.ModelResolver; +import org.apache.maven.model.resolution.UnresolvableModelException; + +public class RepositoryModelResolver + implements ModelResolver +{ + private File basedir; + + private RepositoryPathTranslator pathTranslator; + + public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator ) + { + this.basedir = basedir; + + this.pathTranslator = pathTranslator; + } + + public ModelSource resolveModel( String groupId, String artifactId, String version ) + throws UnresolvableModelException + { + String filename = artifactId + "-" + version + ".pom"; + // TODO: we need to convert 1.0-20091120.112233-1 type paths to baseVersion for the below call - add a test + return new FileModelSource( pathTranslator.toFile( basedir, groupId, artifactId, version, filename ) ); + } + + public void addRepository( Repository repository ) + throws InvalidRepositoryException + { + // we just ignore repositories outside of the current one for now + // TODO: it'd be nice to look them up from Archiva's set, but we want to do that by URL / mapping, not just the + // ID since they will rarely match + } + + public ModelResolver newCopy() + { + return new RepositoryModelResolver( basedir, pathTranslator ); + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java new file mode 100644 index 000000000..ca6dfed53 --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java @@ -0,0 +1,64 @@ +package org.apache.archiva.configuration; + +import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.Configuration; +import org.apache.maven.archiva.configuration.ConfigurationListener; +import org.apache.maven.archiva.configuration.IndeterminateConfigurationException; +import org.codehaus.plexus.registry.RegistryException; +import org.codehaus.plexus.registry.RegistryListener; + +/* + * 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 TestConfiguration + implements ArchivaConfiguration +{ + private Configuration configuration; + + public Configuration getConfiguration() + { + return configuration; + } + + public void save( Configuration configuration ) + throws RegistryException, IndeterminateConfigurationException + { + this.configuration = configuration; + } + + public boolean isDefaulted() + { + return false; + } + + public void addListener( ConfigurationListener listener ) + { + throw new UnsupportedOperationException(); + } + + public void removeListener( ConfigurationListener listener ) + { + throw new UnsupportedOperationException(); + } + + public void addChangeListener( RegistryListener listener ) + { + throw new UnsupportedOperationException(); + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java new file mode 100644 index 000000000..a1dde6b68 --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java @@ -0,0 +1,61 @@ +package org.apache.archiva.metadata.repository.storage.maven2; + +/* + * 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.archiva.metadata.model.ProjectBuildMetadata; +import org.apache.archiva.metadata.repository.MetadataResolver; +import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.Configuration; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; +import org.codehaus.plexus.spring.PlexusInSpringTestCase; + +public class Maven2RepositoryMetadataResolverTest + extends PlexusInSpringTestCase +{ + private Maven2RepositoryMetadataResolver resolver; + + private static final String TEST_REPO_ID = "test"; + + public void setUp() + throws Exception + { + super.setUp(); + + ArchivaConfiguration configuration = (ArchivaConfiguration) lookup( ArchivaConfiguration.class ); + Configuration c = new Configuration(); + ManagedRepositoryConfiguration testRepo = new ManagedRepositoryConfiguration(); + testRepo.setId( TEST_REPO_ID ); + testRepo.setLocation( getTestPath( "src/test/repositories/test" ) ); + c.addManagedRepository( testRepo ); + configuration.save( c ); + + resolver = (Maven2RepositoryMetadataResolver) lookup( MetadataResolver.class, "maven2" ); + } + + public void testGetProjectBuildMetadata() + { + ProjectBuildMetadata metadata = + resolver.getProjectBuild( TEST_REPO_ID, "org.apache.archiva", "archiva-common", "1.2.1" ); + MavenProjectFacet facet = (MavenProjectFacet) metadata.getFacet( MavenProjectFacet.FACET_ID ); + assertEquals( "jar", facet.getPackaging() ); + assertEquals( "http://archiva.apache.org/ref/1.2.1/archiva-base/archiva-common", metadata.getUrl() ); + // TODO: more testing + } +} diff --git a/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml b/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml new file mode 100644 index 000000000..d8ea35f56 --- /dev/null +++ b/archiva-modules/plugins/maven2-repository/src/test/resources/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.xml @@ -0,0 +1,27 @@ +<!-- + ~ 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. + --> + +<component-set> + <components> + <component> + <role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role> + <implementation>org.apache.archiva.configuration.TestConfiguration</implementation> + </component> + </components> +</component-set>
\ No newline at end of file diff --git a/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java b/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java index a262ab244..54a755c87 100644 --- a/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java +++ b/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java @@ -43,6 +43,7 @@ public class FileMetadataRepository implements MetadataRepository { /** + * TODO: this isn't suitable for production use * @plexus.configuration */ private File directory = new File( System.getProperty( "user.home" ), ".archiva-metadata" ); |