git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/MRM-1025@893686 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-1.4-M1
@@ -31,6 +31,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.repository.MetadataRepository; | |||
import org.apache.archiva.metadata.repository.MetadataResolutionException; | |||
import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver; | |||
import org.apache.maven.archiva.common.utils.VersionUtil; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
@@ -162,9 +163,16 @@ public class ArchivaMetadataCreationConsumer | |||
String projectVersion = VersionUtil.getBaseVersion( artifact.getVersion() ); | |||
// TODO: maybe not too efficient since it may have already been read and stored for this artifact | |||
ProjectVersionMetadata versionMetadata = | |||
storageResolver.getProjectVersion( repository.getId(), artifact.getGroupId(), artifact.getArtifactId(), | |||
ProjectVersionMetadata versionMetadata = null; | |||
try | |||
{ | |||
versionMetadata = storageResolver.getProjectVersion( repository.getId(), artifact.getGroupId(), artifact.getArtifactId(), | |||
projectVersion ); | |||
} | |||
catch ( MetadataResolutionException e ) | |||
{ | |||
log.warn( "Error occurred resolving POM for artifact: " + path + "; message: " + e.getMessage() ); | |||
} | |||
boolean createVersionMetadata = false; | |||
if ( versionMetadata == null ) |
@@ -27,6 +27,7 @@ import java.util.List; | |||
import java.util.Set; | |||
import org.apache.archiva.metadata.model.ProjectVersionMetadata; | |||
import org.apache.archiva.metadata.repository.MetadataResolutionException; | |||
import org.apache.archiva.metadata.repository.MetadataResolver; | |||
import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet; | |||
import org.apache.commons.collections.CollectionUtils; | |||
@@ -223,7 +224,16 @@ public class BrowseAction | |||
{ | |||
if ( versionMetadata == null ) | |||
{ | |||
versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version ); | |||
try | |||
{ | |||
versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version ); | |||
} | |||
catch ( MetadataResolutionException e ) | |||
{ | |||
log.error( | |||
"Skipping invalid metadata while compiling shared model for " + groupId + ":" + artifactId + | |||
" in repo " + repoId + ": " + e.getMessage() ); | |||
} | |||
} | |||
} | |||
@@ -34,6 +34,7 @@ import org.apache.archiva.metadata.model.Dependency; | |||
import org.apache.archiva.metadata.model.MailingList; | |||
import org.apache.archiva.metadata.model.ProjectVersionMetadata; | |||
import org.apache.archiva.metadata.model.ProjectVersionReference; | |||
import org.apache.archiva.metadata.repository.MetadataResolutionException; | |||
import org.apache.archiva.metadata.repository.MetadataResolver; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.maven.archiva.model.ArtifactReference; | |||
@@ -107,13 +108,21 @@ public class ShowArtifactAction | |||
List<String> repos = getObservableRepos(); | |||
// In the future, this should be replaced by the repository grouping mechanism, so that we are only making | |||
// simple resource requests here and letting the resolver take care of it | |||
String errorMsg = null; | |||
for ( String repoId : repos ) | |||
{ | |||
if ( versionMetadata == null ) | |||
{ | |||
// we don't 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 | |||
versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version ); | |||
try | |||
{ | |||
versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version ); | |||
} | |||
catch ( MetadataResolutionException e ) | |||
{ | |||
errorMsg = e.getMessage(); | |||
} | |||
if ( versionMetadata != null ) | |||
{ | |||
repositoryId = repoId; | |||
@@ -149,7 +158,7 @@ public class ShowArtifactAction | |||
if ( versionMetadata == null ) | |||
{ | |||
addActionError( "Artifact not found" ); | |||
addActionError( errorMsg != null ? errorMsg : "Artifact not found" ); | |||
return ERROR; | |||
} | |||
model = versionMetadata; |
@@ -62,6 +62,7 @@ public class DefaultMetadataResolver | |||
public ProjectVersionMetadata getProjectVersion( String repoId, String namespace, String projectId, | |||
String projectVersion ) | |||
throws MetadataResolutionException | |||
{ | |||
ProjectVersionMetadata metadata = | |||
metadataRepository.getProjectVersion( repoId, namespace, projectId, projectVersion ); | |||
@@ -198,11 +199,19 @@ public class DefaultMetadataResolver | |||
} | |||
for ( String projectVersion : storageProjectVersions ) | |||
{ | |||
ProjectVersionMetadata versionMetadata = | |||
storageResolver.getProjectVersion( repoId, namespace, projectId, projectVersion ); | |||
if ( versionMetadata != null ) | |||
try | |||
{ | |||
metadataRepository.updateProjectVersion( repoId, namespace, projectId, versionMetadata ); | |||
ProjectVersionMetadata versionMetadata = | |||
storageResolver.getProjectVersion( repoId, namespace, projectId, projectVersion ); | |||
if ( versionMetadata != null ) | |||
{ | |||
metadataRepository.updateProjectVersion( repoId, namespace, projectId, versionMetadata ); | |||
} | |||
} | |||
catch ( MetadataResolutionException e ) | |||
{ | |||
log.warn( "Not update project in metadata repository due to an error resolving it from storage: " + | |||
e.getMessage() ); | |||
} | |||
} | |||
projectVersions = new ArrayList<String>( projectVersions ); |
@@ -0,0 +1,29 @@ | |||
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. | |||
*/ | |||
public class MetadataResolutionException | |||
extends Exception | |||
{ | |||
public MetadataResolutionException( String message ) | |||
{ | |||
super( message ); | |||
} | |||
} |
@@ -31,7 +31,8 @@ public interface MetadataResolver | |||
ProjectMetadata getProject( String repoId, String namespace, String projectId ); | |||
ProjectVersionMetadata getProjectVersion( String repoId, String namespace, String projectId, | |||
String projectVersion ); | |||
String projectVersion ) | |||
throws MetadataResolutionException; | |||
Collection<String> getArtifactVersions( String repoId, String namespace, String projectId, String projectVersion ); | |||
@@ -38,6 +38,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.MetadataRepository; | |||
import org.apache.archiva.metadata.repository.MetadataResolutionException; | |||
import org.apache.archiva.metadata.repository.filter.AllFilter; | |||
import org.apache.archiva.metadata.repository.filter.Filter; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; | |||
@@ -102,6 +103,7 @@ public class Maven2RepositoryMetadataResolver | |||
public ProjectVersionMetadata getProjectVersion( String repoId, String namespace, String projectId, | |||
String projectVersion ) | |||
throws MetadataResolutionException | |||
{ | |||
ManagedRepositoryConfiguration repositoryConfiguration = | |||
archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId ); | |||
@@ -163,8 +165,7 @@ public class Maven2RepositoryMetadataResolver | |||
addProblemReport( repoId, namespace, projectId, projectVersion, "invalid-pom", | |||
"The artifact's POM file '" + file + "' was invalid: " + e.getMessage() ); | |||
// metadata could not be resolved | |||
return null; | |||
throw new MetadataResolutionException( e.getMessage() ); | |||
} | |||
// Check if the POM is in the correct location | |||
@@ -187,10 +188,10 @@ public class Maven2RepositoryMetadataResolver | |||
message.append( "\nIncorrect version: " ).append( model.getVersion() ); | |||
} | |||
addProblemReport( repoId, namespace, projectId, projectVersion, "mislocated-pom", message.toString() ); | |||
String msg = message.toString(); | |||
addProblemReport( repoId, namespace, projectId, projectVersion, "mislocated-pom", msg ); | |||
// metadata could not be resolved | |||
return null; | |||
throw new MetadataResolutionException( msg ); | |||
} | |||
ProjectVersionMetadata metadata = new ProjectVersionMetadata(); |
@@ -31,6 +31,7 @@ import org.apache.archiva.metadata.model.License; | |||
import org.apache.archiva.metadata.model.MailingList; | |||
import org.apache.archiva.metadata.model.ProjectVersionMetadata; | |||
import org.apache.archiva.metadata.repository.MetadataRepository; | |||
import org.apache.archiva.metadata.repository.MetadataResolutionException; | |||
import org.apache.archiva.metadata.repository.filter.ExcludesFilter; | |||
import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver; | |||
import org.apache.archiva.reports.RepositoryProblemFacet; | |||
@@ -77,6 +78,7 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
public void testGetProjectVersionMetadata() | |||
throws Exception | |||
{ | |||
ProjectVersionMetadata metadata = | |||
resolver.getProjectVersion( TEST_REPO_ID, "org.apache.archiva", "archiva-common", "1.2.1" ); | |||
@@ -147,6 +149,7 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
public void testGetProjectVersionMetadataForTimestampedSnapshot() | |||
throws Exception | |||
{ | |||
ProjectVersionMetadata metadata = | |||
resolver.getProjectVersion( TEST_REPO_ID, "org.apache", "apache", "5-SNAPSHOT" ); | |||
@@ -183,6 +186,7 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
public void testGetProjectVersionMetadataForTimestampedSnapshotMissingMetadata() | |||
throws Exception | |||
{ | |||
ProjectVersionMetadata metadata = | |||
resolver.getProjectVersion( TEST_REPO_ID, "com.example.test", "missing-metadata", "1.0-SNAPSHOT" ); | |||
@@ -190,6 +194,7 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
public void testGetProjectVersionMetadataForTimestampedSnapshotMalformedMetadata() | |||
throws Exception | |||
{ | |||
ProjectVersionMetadata metadata = | |||
resolver.getProjectVersion( TEST_REPO_ID, "com.example.test", "malformed-metadata", "1.0-SNAPSHOT" ); | |||
@@ -197,6 +202,7 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
public void testGetProjectVersionMetadataForTimestampedSnapshotIncompleteMetadata() | |||
throws Exception | |||
{ | |||
ProjectVersionMetadata metadata = | |||
resolver.getProjectVersion( TEST_REPO_ID, "com.example.test", "incomplete-metadata", "1.0-SNAPSHOT" ); | |||
@@ -204,36 +210,47 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
public void testGetProjectVersionMetadataForInvalidPom() | |||
throws Exception | |||
{ | |||
assertTrue( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||
ProjectVersionMetadata metadata = | |||
try | |||
{ | |||
resolver.getProjectVersion( TEST_REPO_ID, "com.example.test", "invalid-pom", "1.0" ); | |||
assertNull( metadata ); | |||
assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||
RepositoryProblemFacet facet = | |||
(RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID, | |||
"com.example.test/invalid-pom/1.0" ); | |||
assertEquals( "invalid-pom", facet.getProblem() ); | |||
fail( "Should have received an exception due to invalid POM" ); | |||
} | |||
catch ( MetadataResolutionException e ) | |||
{ | |||
assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||
RepositoryProblemFacet facet = | |||
(RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID, | |||
"com.example.test/invalid-pom/1.0" ); | |||
assertEquals( "invalid-pom", facet.getProblem() ); | |||
} | |||
} | |||
public void testGetProjectVersionMetadataForMislocatedPom() | |||
throws Exception | |||
{ | |||
assertTrue( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||
ProjectVersionMetadata metadata = | |||
try | |||
{ | |||
resolver.getProjectVersion( TEST_REPO_ID, "com.example.test", "mislocated-pom", "1.0" ); | |||
assertNull( metadata ); | |||
assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||
RepositoryProblemFacet facet = | |||
(RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID, | |||
"com.example.test/mislocated-pom/1.0" ); | |||
assertEquals( "mislocated-pom", facet.getProblem() ); | |||
fail( "Should have received an exception due to mislocated POM" ); | |||
} | |||
catch ( MetadataResolutionException e ) | |||
{ | |||
assertFalse( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||
RepositoryProblemFacet facet = | |||
(RepositoryProblemFacet) metadataRepository.getMetadataFacet( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID, | |||
"com.example.test/mislocated-pom/1.0" ); | |||
assertEquals( "mislocated-pom", facet.getProblem() ); | |||
} | |||
} | |||
public void testGetProjectVersionMetadataForMissingPom() | |||
throws Exception | |||
{ | |||
assertTrue( metadataRepository.getMetadataFacets( TEST_REPO_ID, RepositoryProblemFacet.FACET_ID ).isEmpty() ); | |||