You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by br...@apache.org on 2010/12/29 07:14:07 UTC
svn commit: r1053542 [5/7] - in /archiva/trunk/archiva-modules:
archiva-base/archiva-consumers/archiva-core-consumers/
archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/maven/archiva/consumers/core/repository/
archiva-base/...
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java Wed Dec 29 06:14:04 2010
@@ -23,6 +23,8 @@ import org.apache.archiva.audit.AuditEve
import org.apache.archiva.audit.AuditListener;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.RepositorySession;
+import org.apache.archiva.metadata.repository.RepositorySessionFactory;
import org.apache.archiva.metadata.repository.filter.Filter;
import org.apache.archiva.metadata.repository.filter.IncludesFilter;
import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
@@ -84,8 +86,6 @@ public class AdministrationServiceImpl
private Collection<RepositoryListener> listeners;
- private MetadataRepository metadataRepository;
-
private RepositoryStatisticsManager repositoryStatisticsManager;
private RepositoryMerger repositoryMerger;
@@ -94,8 +94,11 @@ public class AdministrationServiceImpl
private AuditListener auditListener;
+ private RepositorySessionFactory repositorySessionFactory;
+
public AdministrationServiceImpl( ArchivaConfiguration archivaConfig, RepositoryContentConsumers repoConsumersUtil,
- RepositoryContentFactory repoFactory, MetadataRepository metadataRepository,
+ RepositoryContentFactory repoFactory,
+ RepositorySessionFactory repositorySessionFactory,
RepositoryArchivaTaskScheduler repositoryTaskScheduler,
Collection<RepositoryListener> listeners,
RepositoryStatisticsManager repositoryStatisticsManager,
@@ -106,7 +109,7 @@ public class AdministrationServiceImpl
this.repoFactory = repoFactory;
this.repositoryTaskScheduler = repositoryTaskScheduler;
this.listeners = listeners;
- this.metadataRepository = metadataRepository;
+ this.repositorySessionFactory = repositorySessionFactory;
this.repositoryStatisticsManager = repositoryStatisticsManager;
this.repositoryMerger = repositoryMerger;
this.auditListener = auditListener;
@@ -186,6 +189,7 @@ public class AdministrationServiceImpl
throw new Exception( "Repository does not exist." );
}
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
try
{
ManagedRepositoryContent repoContent = repoFactory.getManagedRepositoryContent( repoId );
@@ -197,6 +201,7 @@ public class AdministrationServiceImpl
// delete from file system
repoContent.deleteVersion( ref );
+ MetadataRepository metadataRepository = repositorySession.getRepository();
Collection<ArtifactMetadata> artifacts = metadataRepository.getArtifacts( repoId, groupId, artifactId,
version );
@@ -212,11 +217,12 @@ public class AdministrationServiceImpl
// repository metadata to an artifact
for ( RepositoryListener listener : listeners )
{
- listener.deleteArtifact( repoId, artifact.getNamespace(), artifact.getProject(),
- artifact.getVersion(), artifact.getId() );
+ listener.deleteArtifact( metadataRepository, repoId, artifact.getNamespace(),
+ artifact.getProject(), artifact.getVersion(), artifact.getId() );
}
}
}
+ repositorySession.save();
}
catch ( ContentNotFoundException e )
{
@@ -230,6 +236,10 @@ public class AdministrationServiceImpl
{
throw new Exception( "Repository exception occurred." );
}
+ finally
+ {
+ repositorySession.close();
+ }
return true;
}
@@ -407,8 +417,18 @@ public class AdministrationServiceImpl
throw new Exception( "A repository with that id does not exist" );
}
- metadataRepository.removeRepository( repository.getId() );
- repositoryStatisticsManager.deleteStatistics( repository.getId() );
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ try
+ {
+ MetadataRepository metadataRepository = repositorySession.getRepository();
+ metadataRepository.removeRepository( repository.getId() );
+ repositoryStatisticsManager.deleteStatistics( metadataRepository, repository.getId() );
+ repositorySession.save();
+ }
+ finally
+ {
+ repositorySession.close();
+ }
config.removeManagedRepository( repository );
try
@@ -476,108 +496,116 @@ public class AdministrationServiceImpl
log.debug( "Retrieved repository configuration for repo '" + repoId + "'" );
- if ( repoConfig != null )
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ try
{
- stagingConfig = config.findManagedRepositoryById( stagingId );
-
- if ( stagingConfig != null )
+ MetadataRepository metadataRepository = repositorySession.getRepository();
+ if ( repoConfig != null )
{
- List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts( stagingId );
+ stagingConfig = config.findManagedRepositoryById( stagingId );
- if ( repoConfig.isReleases() && !repoConfig.isSnapshots() )
+ if ( stagingConfig != null )
{
- log.info( "Repository to be merged contains releases only.." );
- if ( skipConflicts )
- {
- List<ArtifactMetadata> conflicts = repositoryMerger.getConflictingArtifacts( repoId,
- stagingId );
+ List<ArtifactMetadata> sourceArtifacts = metadataRepository.getArtifacts( stagingId );
- if ( log.isDebugEnabled() )
+ if ( repoConfig.isReleases() && !repoConfig.isSnapshots() )
+ {
+ log.info( "Repository to be merged contains releases only.." );
+ if ( skipConflicts )
{
- log.debug( "Artifacts in conflict.." );
- for ( ArtifactMetadata metadata : conflicts )
+ List<ArtifactMetadata> conflicts = repositoryMerger.getConflictingArtifacts(
+ metadataRepository, repoId, stagingId );
+
+ if ( log.isDebugEnabled() )
{
- log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" +
- metadata.getProjectVersion() );
+ log.debug( "Artifacts in conflict.." );
+ for ( ArtifactMetadata metadata : conflicts )
+ {
+ log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" +
+ metadata.getProjectVersion() );
+ }
}
- }
- sourceArtifacts.removeAll( conflicts );
+ sourceArtifacts.removeAll( conflicts );
- log.debug( "Source artifacts size :: " + sourceArtifacts.size() );
- mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId );
+ log.debug( "Source artifacts size :: " + sourceArtifacts.size() );
+ mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId, null );
+ }
+ else
+ {
+ log.debug( "Source artifacts size :: " + sourceArtifacts.size() );
+ mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId, null );
+ }
}
else
{
- log.debug( "Source artifacts size :: " + sourceArtifacts.size() );
- mergeWithOutSnapshots( sourceArtifacts, stagingId, repoId );
- }
- }
- else
- {
- log.info( "Repository to be merged has snapshot artifacts.." );
- if ( skipConflicts )
- {
- List<ArtifactMetadata> conflicts = repositoryMerger.getConflictingArtifacts( repoId,
- stagingId );
-
- if ( log.isDebugEnabled() )
+ log.info( "Repository to be merged has snapshot artifacts.." );
+ if ( skipConflicts )
{
- log.debug( "Artifacts in conflict.." );
- for ( ArtifactMetadata metadata : conflicts )
+ List<ArtifactMetadata> conflicts = repositoryMerger.getConflictingArtifacts(
+ metadataRepository, repoId, stagingId );
+
+ if ( log.isDebugEnabled() )
{
- log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" +
- metadata.getProjectVersion() );
+ log.debug( "Artifacts in conflict.." );
+ for ( ArtifactMetadata metadata : conflicts )
+ {
+ log.debug( metadata.getNamespace() + ":" + metadata.getProject() + ":" +
+ metadata.getProjectVersion() );
+ }
}
- }
- sourceArtifacts.removeAll( conflicts );
+ sourceArtifacts.removeAll( conflicts );
- log.debug( "Source artifacts size :: " + sourceArtifacts.size() );
+ log.debug( "Source artifacts size :: " + sourceArtifacts.size() );
- Filter<ArtifactMetadata> artifactsWithOutConflicts = new IncludesFilter<ArtifactMetadata>(
- sourceArtifacts );
- repositoryMerger.merge( stagingId, repoId, artifactsWithOutConflicts );
+ Filter<ArtifactMetadata> artifactsWithOutConflicts = new IncludesFilter<ArtifactMetadata>(
+ sourceArtifacts );
+ repositoryMerger.merge( metadataRepository, stagingId, repoId, artifactsWithOutConflicts );
- log.info(
- "Staging repository '" + stagingId + "' merged successfully with managed repo '" + repoId +
- "'." );
- }
- else
- {
- repositoryMerger.merge( stagingId, repoId );
+ log.info( "Staging repository '" + stagingId + "' merged successfully with managed repo '" +
+ repoId + "'." );
+ }
+ else
+ {
+ repositoryMerger.merge( metadataRepository, stagingId, repoId );
- log.info(
- "Staging repository '" + stagingId + "' merged successfully with managed repo '" + repoId +
- "'." );
+ log.info( "Staging repository '" + stagingId + "' merged successfully with managed repo '" +
+ repoId + "'." );
+ }
}
}
+ else
+ {
+ throw new Exception( "Staging Id : " + stagingId + " not found." );
+ }
}
else
{
- throw new Exception( "Staging Id : " + stagingId + " not found." );
+ throw new Exception( "Repository Id : " + repoId + " not found." );
}
- }
- else
- {
- throw new Exception( "Repository Id : " + repoId + " not found." );
- }
- if ( !repositoryTaskScheduler.isProcessingRepositoryTask( repoId ) )
- {
- RepositoryTask task = new RepositoryTask();
- task.setRepositoryId( repoId );
+ if ( !repositoryTaskScheduler.isProcessingRepositoryTask( repoId ) )
+ {
+ RepositoryTask task = new RepositoryTask();
+ task.setRepositoryId( repoId );
- repositoryTaskScheduler.queueTask( task );
- }
+ repositoryTaskScheduler.queueTask( task );
+ }
- AuditEvent event = createAuditEvent( repoConfig );
+ AuditEvent event = createAuditEvent( repoConfig );
- // add event for audit log reports
- metadataRepository.addMetadataFacet( event.getRepositoryId(), event );
+ // add event for audit log reports
+ metadataRepository.addMetadataFacet( event.getRepositoryId(), event );
- // log event in archiva audit log
- auditListener.auditEvent( createAuditEvent( repoConfig ) );
+ // log event in archiva audit log
+ auditListener.auditEvent( createAuditEvent( repoConfig ) );
+ repositorySession.save();
+ }
+ finally
+ {
+ repositorySession.close();
+ }
return true;
}
@@ -614,7 +642,8 @@ public class AdministrationServiceImpl
return event;
}
- private void mergeWithOutSnapshots( List<ArtifactMetadata> sourceArtifacts, String sourceRepoId, String repoid )
+ private void mergeWithOutSnapshots( List<ArtifactMetadata> sourceArtifacts, String sourceRepoId, String repoid,
+ MetadataRepository metadataRepository )
throws Exception
{
List<ArtifactMetadata> artifactsWithOutSnapshots = new ArrayList<ArtifactMetadata>();
@@ -631,7 +660,7 @@ public class AdministrationServiceImpl
Filter<ArtifactMetadata> artifactListWithOutSnapShots = new IncludesFilter<ArtifactMetadata>( sourceArtifacts );
- repositoryMerger.merge( sourceRepoId, repoid, artifactListWithOutSnapShots );
+ repositoryMerger.merge( metadataRepository, sourceRepoId, repoid, artifactListWithOutSnapShots );
}
private ManagedRepositoryConfiguration getStageRepoConfig( ManagedRepositoryConfiguration repository )
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImpl.java Wed Dec 29 06:14:04 2010
@@ -29,6 +29,8 @@ import org.apache.archiva.metadata.model
import org.apache.archiva.metadata.model.ProjectVersionReference;
import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataResolver;
+import org.apache.archiva.metadata.repository.RepositorySession;
+import org.apache.archiva.metadata.repository.RepositorySessionFactory;
import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet;
import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
import org.apache.archiva.web.xmlrpc.api.SearchService;
@@ -48,17 +50,14 @@ public class SearchServiceImpl
private XmlRpcUserRepositories xmlRpcUserRepositories;
- private MetadataResolver metadataResolver;
+ private RepositorySessionFactory repositorySessionFactory;
- private MetadataRepository metadataRepository;
-
- public SearchServiceImpl( XmlRpcUserRepositories xmlRpcUserRepositories, MetadataResolver metadataResolver,
- MetadataRepository metadataRepository, RepositorySearch search )
+ public SearchServiceImpl( XmlRpcUserRepositories xmlRpcUserRepositories,
+ RepositorySessionFactory repositorySessionFactory, RepositorySearch search )
{
this.xmlRpcUserRepositories = xmlRpcUserRepositories;
this.search = search;
- this.metadataResolver = metadataResolver;
- this.metadataRepository = metadataRepository;
+ this.repositorySessionFactory = repositorySessionFactory;
}
@SuppressWarnings( "unchecked" )
@@ -72,45 +71,57 @@ public class SearchServiceImpl
results = search.search( "", observableRepos, queryString, limits, null );
- for ( SearchResultHit resultHit : results.getHits() )
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ try
{
- List<String> resultHitVersions = resultHit.getVersions();
- if ( resultHitVersions != null )
+ MetadataResolver metadataResolver = repositorySession.getResolver();
+
+ for ( SearchResultHit resultHit : results.getHits() )
{
- for ( String version : resultHitVersions )
+ List<String> resultHitVersions = resultHit.getVersions();
+ if ( resultHitVersions != null )
{
- Artifact artifact = null;
- for ( String repoId : observableRepos )
+ for ( String version : resultHitVersions )
{
- // slight behaviour change to previous implementation: instead of allocating "jar" when not
- // found in the database, we can rely on the metadata repository to create it on the fly. We
- // just allocate the default packaging if the Maven facet is not found.
- FacetedMetadata model = metadataResolver.resolveProjectVersion( repoId, resultHit.getGroupId(),
- resultHit.getArtifactId(),
- version );
-
- if ( model != null )
+ Artifact artifact = null;
+ for ( String repoId : observableRepos )
{
- String packaging = "jar";
+ // slight behaviour change to previous implementation: instead of allocating "jar" when not
+ // found in the database, we can rely on the metadata repository to create it on the fly. We
+ // just allocate the default packaging if the Maven facet is not found.
+ FacetedMetadata model = metadataResolver.resolveProjectVersion( repositorySession, repoId,
+ resultHit.getGroupId(),
+ resultHit.getArtifactId(),
+ version );
- MavenProjectFacet facet = (MavenProjectFacet) model.getFacet( MavenProjectFacet.FACET_ID );
- if ( facet != null && facet.getPackaging() != null )
+ if ( model != null )
{
- packaging = facet.getPackaging();
+ String packaging = "jar";
+
+ MavenProjectFacet facet = (MavenProjectFacet) model.getFacet(
+ MavenProjectFacet.FACET_ID );
+ if ( facet != null && facet.getPackaging() != null )
+ {
+ packaging = facet.getPackaging();
+ }
+ artifact = new Artifact( repoId, resultHit.getGroupId(), resultHit.getArtifactId(),
+ version, packaging );
+ break;
}
- artifact = new Artifact( repoId, resultHit.getGroupId(), resultHit.getArtifactId(), version,
- packaging );
- break;
}
- }
- if ( artifact != null )
- {
- artifacts.add( artifact );
+ if ( artifact != null )
+ {
+ artifacts.add( artifact );
+ }
}
}
}
}
+ finally
+ {
+ repositorySession.close();
+ }
return artifacts;
}
@@ -120,18 +131,30 @@ public class SearchServiceImpl
{
List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+
List<Artifact> results = new ArrayList<Artifact>();
- for ( String repoId : observableRepos )
+ try
{
- for ( ArtifactMetadata artifact : metadataRepository.getArtifactsByChecksum( repoId, checksum ) )
+ MetadataRepository metadataRepository = repositorySession.getRepository();
+
+ for ( String repoId : observableRepos )
{
- // TODO: customise XMLRPC to handle non-Maven artifacts
- MavenArtifactFacet facet = (MavenArtifactFacet) artifact.getFacet( MavenArtifactFacet.FACET_ID );
+ for ( ArtifactMetadata artifact : metadataRepository.getArtifactsByChecksum( repoId, checksum ) )
+ {
+ // TODO: customise XMLRPC to handle non-Maven artifacts
+ MavenArtifactFacet facet = (MavenArtifactFacet) artifact.getFacet( MavenArtifactFacet.FACET_ID );
- results.add( new Artifact( artifact.getRepositoryId(), artifact.getNamespace(), artifact.getProject(),
- artifact.getVersion(), facet != null ? facet.getType() : null ) );
+ results.add( new Artifact( artifact.getRepositoryId(), artifact.getNamespace(),
+ artifact.getProject(), artifact.getVersion(),
+ facet != null ? facet.getType() : null ) );
+ }
}
}
+ finally
+ {
+ repositorySession.close();
+ }
return results;
}
@@ -141,17 +164,28 @@ public class SearchServiceImpl
List<Artifact> artifacts = new ArrayList<Artifact>();
List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
- for ( String repoId : observableRepos )
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ try
{
- Collection<String> results = metadataResolver.resolveProjectVersions( repoId, groupId, artifactId );
+ MetadataResolver metadataResolver = repositorySession.getResolver();
- for ( final String version : results )
+ for ( String repoId : observableRepos )
{
- final Artifact artifact = new Artifact( repoId, groupId, artifactId, version, "pom" );
+ Collection<String> results = metadataResolver.resolveProjectVersions( repositorySession, repoId,
+ groupId, artifactId );
- artifacts.add( artifact );
+ for ( final String version : results )
+ {
+ final Artifact artifact = new Artifact( repoId, groupId, artifactId, version, "pom" );
+
+ artifacts.add( artifact );
+ }
}
}
+ finally
+ {
+ repositorySession.close();
+ }
return artifacts;
}
@@ -174,23 +208,33 @@ public class SearchServiceImpl
{
List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
- for ( String repoId : observableRepos )
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ try
{
- ProjectVersionMetadata model = metadataResolver.resolveProjectVersion( repoId, groupId, artifactId,
- version );
- if ( model != null )
+ MetadataResolver metadataResolver = repositorySession.getResolver();
+
+ for ( String repoId : observableRepos )
{
- List<Dependency> dependencies = new ArrayList<Dependency>();
- List<org.apache.archiva.metadata.model.Dependency> modelDeps = model.getDependencies();
- for ( org.apache.archiva.metadata.model.Dependency dep : modelDeps )
+ ProjectVersionMetadata model = metadataResolver.resolveProjectVersion( repositorySession, repoId,
+ groupId, artifactId, version );
+ if ( model != null )
{
- Dependency dependency = new Dependency( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(),
- dep.getClassifier(), dep.getType(), dep.getScope() );
- dependencies.add( dependency );
+ List<Dependency> dependencies = new ArrayList<Dependency>();
+ List<org.apache.archiva.metadata.model.Dependency> modelDeps = model.getDependencies();
+ for ( org.apache.archiva.metadata.model.Dependency dep : modelDeps )
+ {
+ Dependency dependency = new Dependency( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(),
+ dep.getClassifier(), dep.getType(), dep.getScope() );
+ dependencies.add( dependency );
+ }
+ return dependencies;
}
- return dependencies;
}
}
+ finally
+ {
+ repositorySession.close();
+ }
throw new Exception( "Artifact does not exist." );
}
@@ -209,16 +253,28 @@ public class SearchServiceImpl
List<Artifact> artifacts = new ArrayList<Artifact>();
List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();
- for ( String repoId : observableRepos )
+ RepositorySession repositorySession = repositorySessionFactory.createSession();
+ try
{
- Collection<ProjectVersionReference> refs = metadataResolver.resolveProjectReferences( repoId, groupId,
- artifactId, version );
- for ( ProjectVersionReference ref : refs )
+ MetadataResolver metadataResolver = repositorySession.getResolver();
+
+ for ( String repoId : observableRepos )
{
- artifacts.add( new Artifact( repoId, ref.getNamespace(), ref.getProjectId(), ref.getProjectVersion(),
- "" ) );
+ Collection<ProjectVersionReference> refs = metadataResolver.resolveProjectReferences( repositorySession,
+ repoId, groupId,
+ artifactId,
+ version );
+ for ( ProjectVersionReference ref : refs )
+ {
+ artifacts.add( new Artifact( repoId, ref.getNamespace(), ref.getProjectId(),
+ ref.getProjectVersion(), "" ) );
+ }
}
}
+ finally
+ {
+ repositorySession.close();
+ }
return artifacts;
}
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java Wed Dec 29 06:14:04 2010
@@ -23,6 +23,8 @@ import org.apache.archiva.audit.AuditEve
import org.apache.archiva.audit.AuditListener;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.RepositorySession;
+import org.apache.archiva.metadata.repository.RepositorySessionFactory;
import org.apache.archiva.metadata.repository.filter.Filter;
import org.apache.archiva.metadata.repository.filter.IncludesFilter;
import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
@@ -63,6 +65,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
/**
* AdministrationServiceImplTest
*
@@ -162,6 +167,12 @@ public class AdministrationServiceImplTe
metadataRepositoryControl = MockControl.createControl( MetadataRepository.class );
metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock();
+ RepositorySession repositorySession = mock( RepositorySession.class );
+ when( repositorySession.getRepository() ).thenReturn( metadataRepository );
+
+ RepositorySessionFactory repositorySessionFactory = mock( RepositorySessionFactory.class );
+ when( repositorySessionFactory.createSession() ).thenReturn( repositorySession );
+
listenerControl = MockControl.createControl( RepositoryListener.class );
listener = (RepositoryListener) listenerControl.getMock();
@@ -175,8 +186,9 @@ public class AdministrationServiceImplTe
auditListener = (AuditListener) auditListenerControl.getMock();
service = new AdministrationServiceImpl( archivaConfig, repoConsumersUtil, repositoryFactory,
- metadataRepository, repositoryTaskScheduler, Collections.singletonList(
- listener ), repositoryStatisticsManager, repositoryMerger, auditListener );
+ repositorySessionFactory, repositoryTaskScheduler,
+ Collections.singletonList( listener ), repositoryStatisticsManager,
+ repositoryMerger, auditListener );
}
/* Tests for repository consumers */
@@ -342,8 +354,8 @@ public class AdministrationServiceImplTe
metadataRepository.removeArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(),
artifact.getVersion(), artifact.getId() );
- listener.deleteArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(),
- artifact.getVersion(), artifact.getId() );
+ listener.deleteArtifact( metadataRepository, repoContent.getId(), artifact.getNamespace(),
+ artifact.getProject(), artifact.getVersion(), artifact.getId() );
listenerControl.setVoidCallable( 1 );
archivaConfigControl.replay();
@@ -399,8 +411,8 @@ public class AdministrationServiceImplTe
metadataRepository.removeArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(),
artifact.getVersion(), artifact.getId() );
- listener.deleteArtifact( repoContent.getId(), artifact.getNamespace(), artifact.getProject(),
- artifact.getVersion(), artifact.getId() );
+ listener.deleteArtifact( metadataRepository, repoContent.getId(), artifact.getNamespace(),
+ artifact.getProject(), artifact.getVersion(), artifact.getId() );
listenerControl.setVoidCallable( 1 );
archivaConfigControl.replay();
@@ -725,10 +737,11 @@ public class AdministrationServiceImplTe
configControl.expectAndReturn( config.findManagedRepositoryById( "merge-stage" ), staging );
metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( staging.getId() ), sources );
- repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( staging.getId(),
+ repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( metadataRepository,
+ staging.getId(),
merge.getId() ),
sources );
- repositoryMerger.merge( staging.getId(), merge.getId() );
+ repositoryMerger.merge( metadataRepository, staging.getId(), merge.getId() );
repositoryMergerControl.setVoidCallable();
repositoryTaskSchedulerControl.expectAndReturn( repositoryTaskScheduler.isProcessingRepositoryTask( "merge" ),
false );
@@ -794,10 +807,11 @@ public class AdministrationServiceImplTe
configControl.expectAndReturn( config.findManagedRepositoryById( "repo-stage" ), staging );
metadataRepositoryControl.expectAndReturn( metadataRepository.getArtifacts( staging.getId() ), sources );
- repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( staging.getId(),
+ repositoryMergerControl.expectAndDefaultReturn( repositoryMerger.getConflictingArtifacts( metadataRepository,
+ staging.getId(),
repo.getId() ),
conflicts );
- repositoryMerger.merge( staging.getId(), repo.getId(), artifactsWithOutConflicts );
+ repositoryMerger.merge( metadataRepository, staging.getId(), repo.getId(), artifactsWithOutConflicts );
repositoryMergerControl.setMatcher( MockControl.ALWAYS_MATCHER );
repositoryMergerControl.setVoidCallable();
repositoryTaskSchedulerControl.expectAndReturn( repositoryTaskScheduler.isProcessingRepositoryTask( "repo" ),
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/SearchServiceImplTest.java Wed Dec 29 06:14:04 2010
@@ -30,6 +30,8 @@ import org.apache.archiva.metadata.model
import org.apache.archiva.metadata.model.ProjectVersionReference;
import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataResolver;
+import org.apache.archiva.metadata.repository.RepositorySession;
+import org.apache.archiva.metadata.repository.RepositorySessionFactory;
import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet;
import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
import org.apache.archiva.web.xmlrpc.api.SearchService;
@@ -46,6 +48,9 @@ import java.util.Collections;
import java.util.Date;
import java.util.List;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
/**
* SearchServiceImplTest
*
@@ -80,6 +85,8 @@ public class SearchServiceImplTest
private static final String TEST_REPO = "test-repo";
+ private RepositorySession repositorySession;
+
@Override
public void setUp()
throws Exception
@@ -97,7 +104,13 @@ public class SearchServiceImplTest
metadataRepositoryControl = MockControl.createControl( MetadataRepository.class );
metadataRepository = (MetadataRepository) metadataRepositoryControl.getMock();
- searchService = new SearchServiceImpl( userRepos, metadataResolver, metadataRepository, search );
+ repositorySession = mock( RepositorySession.class );
+ when( repositorySession.getResolver() ).thenReturn( metadataResolver );
+ when( repositorySession.getRepository() ).thenReturn( metadataRepository );
+ RepositorySessionFactory repositorySessionFactory = mock( RepositorySessionFactory.class );
+ when( repositorySessionFactory.createSession() ).thenReturn( repositorySession );
+
+ searchService = new SearchServiceImpl( userRepos, repositorySessionFactory, search );
}
// MRM-1230
@@ -134,7 +147,8 @@ public class SearchServiceImplTest
facet.setPackaging( "war" );
model.addFacet( facet );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "repo1.mirror",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession,
+ "repo1.mirror",
ARCHIVA_TEST_GROUP_ID,
"archiva-webapp", "1.0" ),
model );
@@ -189,14 +203,16 @@ public class SearchServiceImplTest
searchControl.expectAndDefaultReturn( search.search( "", observableRepoIds, "archiva", limits, null ),
results );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "repo1.mirror",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession,
+ "repo1.mirror",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ), null );
ProjectVersionMetadata model = new ProjectVersionMetadata();
model.setId( "1.0" );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "public.releases",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession,
+ "public.releases",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ), model );
@@ -256,7 +272,8 @@ public class SearchServiceImplTest
facet.setPackaging( "jar" );
model.addFacet( facet );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( "repo1.mirror",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession,
+ "repo1.mirror",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ), model );
@@ -349,11 +366,13 @@ public class SearchServiceImplTest
observableRepoIds.add( "public.releases" );
userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( "repo1.mirror",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( repositorySession,
+ "repo1.mirror",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID ),
Arrays.asList( "1.0", "1.1-beta-2", "1.2" ) );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( "public.releases",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersions( repositorySession,
+ "public.releases",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID ),
Arrays.asList( "1.1-beta-1", "1.1", "1.2.1-SNAPSHOT" ) );
@@ -418,7 +437,8 @@ public class SearchServiceImplTest
model.addDependency( dependency );
userReposControl.expectAndReturn( userRepos.getObservableRepositories(), Collections.singletonList( repoId ) );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repoId, ARCHIVA_TEST_GROUP_ID,
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, repoId,
+ ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ), model );
@@ -444,7 +464,8 @@ public class SearchServiceImplTest
String repoId = "repo1.mirror";
userReposControl.expectAndReturn( userRepos.getObservableRepositories(), Collections.singletonList( repoId ) );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repoId, ARCHIVA_TEST_GROUP_ID,
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectVersion( repositorySession, repoId,
+ ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ), null );
@@ -498,7 +519,7 @@ public class SearchServiceImplTest
dependeeModels.add( dependeeModel );
userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repoId,
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repositorySession, repoId,
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ), dependeeModels );
@@ -529,12 +550,14 @@ public class SearchServiceImplTest
// no longer differentiating between a project not being present and a project that is present but with
// no references. If it is later determined to be needed, we will need to modify the metadata content repository
userReposControl.expectAndReturn( userRepos.getObservableRepositories(), observableRepoIds );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( "repo1.mirror",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repositorySession,
+ "repo1.mirror",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ),
Collections.<ProjectVersionReference>emptyList() );
- metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( "public.releases",
+ metadataResolverControl.expectAndReturn( metadataResolver.resolveProjectReferences( repositorySession,
+ "public.releases",
ARCHIVA_TEST_GROUP_ID,
ARCHIVA_TEST_ARTIFACT_ID,
"1.0" ),
Modified: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java (original)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java Wed Dec 29 06:14:04 2010
@@ -26,26 +26,40 @@ import org.apache.archiva.metadata.model
import org.apache.archiva.metadata.model.ProjectVersionReference;
import org.apache.archiva.metadata.repository.filter.ExcludesFilter;
import org.apache.archiva.metadata.repository.storage.RepositoryStorage;
+import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException;
+import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException;
+import org.apache.archiva.repository.events.RepositoryListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
/**
+ * Default implementation of the metadata resolver API. At present it will handle updating the content repository
+ * from new or changed information in the model and artifacts from the repository storage.
+ *
+ * This is a singleton component to allow an alternate implementation to be provided. It is intended to be the same
+ * system-wide for the whole content repository instead of on a per-managed-repository basis. Therefore, the session is
+ * passed in as an argument to obtain any necessary resources, rather than the class being instantiated within the
+ * session in the context of a single managed repository's resolution needs.
+ *
+ * Note that the caller is responsible for the session, such as closing and saving (which is implied by the resolver
+ * being obtained from within the session). The {@link RepositorySession#markDirty()} method is used as a hint to ensure
+ * that the session knows we've made changes at close. We cannot ensure the changes will be persisted if the caller
+ * chooses to revert first. This is preferable to storing the metadata immediately - a separate session would require
+ * having a bi-directional link with the session factory, and saving the existing session might save other changes
+ * unknowingly by the caller.
+ *
* @plexus.component role="org.apache.archiva.metadata.repository.MetadataResolver"
*/
public class DefaultMetadataResolver
implements MetadataResolver
{
/**
- * @plexus.requirement
- */
- private MetadataRepository metadataRepository;
-
- /**
* FIXME: this needs to be configurable based on storage type - and could also be instantiated per repo. Change to a
- * factory.
+ * factory, and perhaps retrieve from the session. We should avoid creating one per request, however.
*
* TODO: Also need to accommodate availability of proxy module
* ... could be a different type since we need methods to modify the storage metadata, which would also allow more
@@ -55,12 +69,19 @@ public class DefaultMetadataResolver
*/
private RepositoryStorage repositoryStorage;
+ /**
+ * @plexus.requirement role="org.apache.archiva.repository.events.RepositoryListener"
+ */
+ private List<RepositoryListener> listeners;
+
private static final Logger log = LoggerFactory.getLogger( DefaultMetadataResolver.class );
- public ProjectVersionMetadata resolveProjectVersion( String repoId, String namespace, String projectId,
- String projectVersion )
+ public ProjectVersionMetadata resolveProjectVersion( RepositorySession session, String repoId, String namespace,
+ String projectId, String projectVersion )
throws MetadataResolutionException
{
+ MetadataRepository metadataRepository = session.getRepository();
+
ProjectVersionMetadata metadata = metadataRepository.getProjectVersion( repoId, namespace, projectId,
projectVersion );
// TODO: do we want to detect changes as well by comparing timestamps? isProjectVersionNewerThan(updated)
@@ -70,9 +91,10 @@ public class DefaultMetadataResolver
// may then work here and be more efficient than always trying again)
if ( metadata == null || metadata.isIncomplete() )
{
- metadata = repositoryStorage.readProjectVersionMetadata( repoId, namespace, projectId, projectVersion );
- if ( metadata != null )
+ try
{
+ metadata = repositoryStorage.readProjectVersionMetadata( repoId, namespace, projectId, projectVersion );
+
if ( log.isDebugEnabled() )
{
log.debug( "Resolved project version metadata from storage: " + metadata );
@@ -102,29 +124,54 @@ public class DefaultMetadataResolver
}
try
{
+ for ( RepositoryListener listener : listeners )
+ {
+ listener.addArtifact( session, repoId, namespace, projectId, metadata );
+ }
metadataRepository.updateProjectVersion( repoId, namespace, projectId, metadata );
}
catch ( MetadataRepositoryException e )
{
log.warn( "Unable to persist resolved information: " + e.getMessage(), e );
}
+
+ session.markDirty();
+ }
+ catch ( RepositoryStorageMetadataInvalidException e )
+ {
+ for ( RepositoryListener listener : listeners )
+ {
+ listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e );
+ }
+ throw new MetadataResolutionException( e.getMessage(), e );
+ }
+ catch ( RepositoryStorageMetadataNotFoundException e )
+ {
+ for ( RepositoryListener listener : listeners )
+ {
+ listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e );
+ }
+ // no need to rethrow - return null
}
}
return metadata;
}
- public Collection<ProjectVersionReference> resolveProjectReferences( String repoId, String namespace,
- String projectId, String projectVersion )
+ public Collection<ProjectVersionReference> resolveProjectReferences( RepositorySession session, String repoId,
+ String namespace, String projectId,
+ String projectVersion )
throws MetadataResolutionException
{
// 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
+ MetadataRepository metadataRepository = session.getRepository();
return metadataRepository.getProjectReferences( repoId, namespace, projectId, projectVersion );
}
- public Collection<String> resolveRootNamespaces( String repoId )
+ public Collection<String> resolveRootNamespaces( RepositorySession session, String repoId )
throws MetadataResolutionException
{
+ MetadataRepository metadataRepository = session.getRepository();
Collection<String> namespaces = metadataRepository.getRootNamespaces( repoId );
Collection<String> storageNamespaces = repositoryStorage.listRootNamespaces( repoId, new ExcludesFilter<String>(
namespaces ) );
@@ -145,15 +192,18 @@ public class DefaultMetadataResolver
log.warn( "Unable to persist resolved information: " + e.getMessage(), e );
}
}
+ session.markDirty();
+
namespaces = new ArrayList<String>( namespaces );
namespaces.addAll( storageNamespaces );
}
return namespaces;
}
- public Collection<String> resolveNamespaces( String repoId, String namespace )
+ public Collection<String> resolveNamespaces( RepositorySession session, String repoId, String namespace )
throws MetadataResolutionException
{
+ MetadataRepository metadataRepository = session.getRepository();
Collection<String> namespaces = metadataRepository.getNamespaces( repoId, namespace );
Collection<String> exclusions = new ArrayList<String>( namespaces );
exclusions.addAll( metadataRepository.getProjects( repoId, namespace ) );
@@ -177,15 +227,18 @@ public class DefaultMetadataResolver
log.warn( "Unable to persist resolved information: " + e.getMessage(), e );
}
}
+ session.markDirty();
+
namespaces = new ArrayList<String>( namespaces );
namespaces.addAll( storageNamespaces );
}
return namespaces;
}
- public Collection<String> resolveProjects( String repoId, String namespace )
+ public Collection<String> resolveProjects( RepositorySession session, String repoId, String namespace )
throws MetadataResolutionException
{
+ MetadataRepository metadataRepository = session.getRepository();
Collection<String> projects = metadataRepository.getProjects( repoId, namespace );
Collection<String> exclusions = new ArrayList<String>( projects );
exclusions.addAll( metadataRepository.getNamespaces( repoId, namespace ) );
@@ -212,15 +265,19 @@ public class DefaultMetadataResolver
}
}
}
+ session.markDirty();
+
projects = new ArrayList<String>( projects );
projects.addAll( storageProjects );
}
return projects;
}
- public Collection<String> resolveProjectVersions( String repoId, String namespace, String projectId )
+ public Collection<String> resolveProjectVersions( RepositorySession session, String repoId, String namespace,
+ String projectId )
throws MetadataResolutionException
{
+ MetadataRepository metadataRepository = session.getRepository();
Collection<String> projectVersions = metadataRepository.getProjectVersions( repoId, namespace, projectId );
Collection<String> storageProjectVersions = repositoryStorage.listProjectVersions( repoId, namespace, projectId,
new ExcludesFilter<String>(
@@ -239,39 +296,55 @@ public class DefaultMetadataResolver
namespace,
projectId,
projectVersion );
- if ( versionMetadata != null )
+ for ( RepositoryListener listener : listeners )
{
- metadataRepository.updateProjectVersion( repoId, namespace, projectId, versionMetadata );
+ listener.addArtifact( session, repoId, namespace, projectId, versionMetadata );
}
+
+ metadataRepository.updateProjectVersion( repoId, namespace, projectId, versionMetadata );
+ }
+ catch ( MetadataRepositoryException e )
+ {
+ log.warn( "Unable to persist resolved information: " + e.getMessage(), e );
}
- catch ( MetadataResolutionException e )
+ catch ( RepositoryStorageMetadataInvalidException e )
{
log.warn( "Not update project in metadata repository due to an error resolving it from storage: " +
e.getMessage() );
+
+ for ( RepositoryListener listener : listeners )
+ {
+ listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e );
+ }
}
- catch ( MetadataRepositoryException e )
+ catch ( RepositoryStorageMetadataNotFoundException e )
{
- log.warn( "Unable to persist resolved information: " + e.getMessage(), e );
+ for ( RepositoryListener listener : listeners )
+ {
+ listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e );
+ }
}
}
+ session.markDirty();
+
projectVersions = new ArrayList<String>( projectVersions );
projectVersions.addAll( storageProjectVersions );
}
return projectVersions;
}
- public Collection<ArtifactMetadata> resolveArtifacts( String repoId, String namespace, String projectId,
- String projectVersion )
+ public Collection<ArtifactMetadata> resolveArtifacts( RepositorySession session, String repoId, String namespace,
+ String projectId, String projectVersion )
throws MetadataResolutionException
{
+ MetadataRepository metadataRepository = session.getRepository();
Collection<ArtifactMetadata> artifacts = metadataRepository.getArtifacts( repoId, namespace, projectId,
projectVersion );
+ ExcludesFilter<String> filter = new ExcludesFilter<String>( createArtifactIdList( artifacts ) );
Collection<ArtifactMetadata> storageArtifacts = repositoryStorage.readArtifactsMetadata( repoId, namespace,
projectId,
projectVersion,
- new ExcludesFilter<String>(
- createArtifactIdList(
- artifacts ) ) );
+ filter );
if ( storageArtifacts != null && !storageArtifacts.isEmpty() )
{
if ( log.isDebugEnabled() )
@@ -289,6 +362,8 @@ public class DefaultMetadataResolver
log.warn( "Unable to persist resolved information: " + e.getMessage(), e );
}
}
+ session.markDirty();
+
artifacts = new ArrayList<ArtifactMetadata>( artifacts );
artifacts.addAll( storageArtifacts );
}
Modified: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java (original)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java Wed Dec 29 06:14:04 2010
@@ -27,8 +27,8 @@ import java.util.Collection;
public interface MetadataResolver
{
- ProjectVersionMetadata resolveProjectVersion( String repoId, String namespace, String projectId,
- String projectVersion )
+ ProjectVersionMetadata resolveProjectVersion( RepositorySession session, String repoId, String namespace,
+ String projectId, String projectVersion )
throws MetadataResolutionException;
/**
@@ -42,23 +42,25 @@ public interface MetadataResolver
* @param projectVersion the version of the project to get references to
* @return a list of project references
*/
- Collection<ProjectVersionReference> resolveProjectReferences( String repoId, String namespace, String projectId,
+ Collection<ProjectVersionReference> resolveProjectReferences( RepositorySession session, String repoId,
+ String namespace, String projectId,
String projectVersion )
throws MetadataResolutionException;
- Collection<String> resolveRootNamespaces( String repoId )
+ Collection<String> resolveRootNamespaces( RepositorySession session, String repoId )
throws MetadataResolutionException;
- Collection<String> resolveNamespaces( String repoId, String namespace )
+ Collection<String> resolveNamespaces( RepositorySession session, String repoId, String namespace )
throws MetadataResolutionException;
- Collection<String> resolveProjects( String repoId, String namespace )
+ Collection<String> resolveProjects( RepositorySession session, String repoId, String namespace )
throws MetadataResolutionException;
- Collection<String> resolveProjectVersions( String repoId, String namespace, String projectId )
+ Collection<String> resolveProjectVersions( RepositorySession session, String repoId, String namespace,
+ String projectId )
throws MetadataResolutionException;
- Collection<ArtifactMetadata> resolveArtifacts( String repoId, String namespace, String projectId,
- String projectVersion )
+ Collection<ArtifactMetadata> resolveArtifacts( RepositorySession session, String repoId, String namespace,
+ String projectId, String projectVersion )
throws MetadataResolutionException;
}
Added: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java?rev=1053542&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java (added)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySession.java Wed Dec 29 06:14:04 2010
@@ -0,0 +1,96 @@
+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.
+ */
+
+/**
+ * The repository session provides a single interface to accessing Archiva repositories. It provides access to three
+ * resources:
+ * <ul>
+ * <li>{@link MetadataRepository} - the metadata content repository for read/write access, in its current state (no
+ * remote resources will be retrieved in the process</li>
+ * <li>{@link MetadataResolver} - access to resolve metadata content, accommodating metadata not yet stored or up to
+ * date in the content repository (i.e. virtualised repositories, remote proxied content, or metadata in a different
+ * model format in the repository storage)</li>
+ * <li>{@link org.apache.archiva.metadata.repository.storage.RepositoryStorage} - access to the physical storage of a
+ * repository and the source artifacts and project models</li>
+ * </ul>
+ */
+public class RepositorySession
+{
+ private final MetadataRepository repository;
+
+ private final MetadataResolver resolver;
+
+ private boolean dirty;
+
+ // FIXME: include storage here too - perhaps a factory based on repository ID, or one per type to retrieve and
+ // operate on a given repo within the storage API
+
+ public RepositorySession( MetadataRepository metadataRepository, MetadataResolver resolver )
+ {
+ this.repository = metadataRepository;
+ this.resolver = resolver;
+ }
+
+ public MetadataRepository getRepository()
+ {
+ return repository;
+ }
+
+ public MetadataResolver getResolver()
+ {
+ return resolver;
+ }
+
+ public void save()
+ {
+ // FIXME
+
+ dirty = false;
+ }
+
+ public void revert()
+ {
+ // FIXME
+
+ dirty = false;
+ }
+
+ /**
+ * Close the session. Required to be called for all open sessions to ensure resources are properly released.
+ * If the session has been marked as dirty, it will be saved. This may save partial changes in the case of a typical
+ * <code>try { ... } finally { ... }</code> approach - if this is a problem, ensure you revert changes when an
+ * exception occurs.
+ */
+ public void close()
+ {
+ if ( dirty )
+ {
+ save();
+ }
+
+ // FIXME
+ }
+
+ public void markDirty()
+ {
+ this.dirty = true;
+ }
+}
Added: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java?rev=1053542&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java (added)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/RepositorySessionFactory.java Wed Dec 29 06:14:04 2010
@@ -0,0 +1,25 @@
+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 interface RepositorySessionFactory
+{
+ RepositorySession createSession();
+}
Modified: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java (original)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java Wed Dec 29 06:14:04 2010
@@ -22,7 +22,6 @@ package org.apache.archiva.metadata.repo
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.MetadataResolutionException;
import org.apache.archiva.metadata.repository.filter.Filter;
import java.util.Collection;
@@ -30,12 +29,11 @@ import java.util.Collection;
// FIXME: we should drop the repoId parameters and attach this to an instance of a repository storage
public interface RepositoryStorage
{
- ProjectMetadata readProjectMetadata( String repoId, String namespace, String projectId )
- throws MetadataResolutionException;
+ ProjectMetadata readProjectMetadata( String repoId, String namespace, String projectId );
ProjectVersionMetadata readProjectVersionMetadata( String repoId, String namespace, String projectId,
String projectVersion )
- throws MetadataResolutionException;
+ throws RepositoryStorageMetadataInvalidException, RepositoryStorageMetadataNotFoundException;
Collection<String> listRootNamespaces( String repoId, Filter<String> filter );
Added: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java?rev=1053542&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java (added)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataException.java Wed Dec 29 06:14:04 2010
@@ -0,0 +1,45 @@
+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.
+ */
+
+public class RepositoryStorageMetadataException
+ extends Exception
+{
+ private final String id;
+
+ protected RepositoryStorageMetadataException( String id, String msg )
+ {
+ super( msg );
+
+ this.id = id;
+ }
+
+ protected RepositoryStorageMetadataException( String id, String msg, Throwable throwable )
+ {
+ super( msg, throwable );
+
+ this.id = id;
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+}
Added: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java?rev=1053542&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java (added)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataInvalidException.java Wed Dec 29 06:14:04 2010
@@ -0,0 +1,34 @@
+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.
+ */
+
+public class RepositoryStorageMetadataInvalidException
+ extends RepositoryStorageMetadataException
+{
+ public RepositoryStorageMetadataInvalidException( String id, String msg )
+ {
+ super( id, msg );
+ }
+
+ public RepositoryStorageMetadataInvalidException( String id, String msg, Throwable throwable )
+ {
+ super( id, msg, throwable );
+ }
+}
Added: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java?rev=1053542&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java (added)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorageMetadataNotFoundException.java Wed Dec 29 06:14:04 2010
@@ -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.
+ */
+
+public class RepositoryStorageMetadataNotFoundException
+ extends RepositoryStorageMetadataException
+{
+ public RepositoryStorageMetadataNotFoundException( String msg )
+ {
+ super( "missing-pom", msg );
+ }
+}
Modified: archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java (original)
+++ archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/repository/events/RepositoryListener.java Wed Dec 29 06:14:04 2010
@@ -19,15 +19,30 @@ package org.apache.archiva.repository.ev
* under the License.
*/
+import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.RepositorySession;
+import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataException;
+
/**
- * Listen to events on the repository. This class is a stopgap
- * refactoring measure until an event bus is in place to handle
+ * Listen to events on the repository. This class is a stopgap
+ * refactoring measure until an event bus is in place to handle
* generic events such as these.
+ *
+ * This assumes that the events occur before the action has completed, though they don't currently offer any mechanism
+ * to prevent an event from occurring or guarantee that it will happen.
+ *
+ * FIXME: this needs to be made more permanent since 3rd party plugins will depend on it heavily
*/
-public interface RepositoryListener
+public interface RepositoryListener
{
- /**
- * Event for the deletion of a given artifact.
- */
- void deleteArtifact( String repositoryId, String namespace, String project, String version, String id );
+ void deleteArtifact( MetadataRepository metadataRepository, String repositoryId, String namespace, String project,
+ String version, String id );
+
+ void addArtifact( RepositorySession session, String repoId, String namespace, String projectId,
+ ProjectVersionMetadata metadata );
+
+ // FIXME: this would be better as a "processException" method, with the event information captured in a single class
+ void addArtifactProblem( RepositorySession session, String repoId, String namespace, String projectId,
+ String projectVersion, RepositoryStorageMetadataException exception );
}
Modified: archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java?rev=1053542&r1=1053541&r2=1053542&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java (original)
+++ archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java Wed Dec 29 06:14:04 2010
@@ -19,6 +19,7 @@ package org.apache.archiva.audit;
* under the License.
*/
+import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataRepositoryException;
import java.util.Collection;
@@ -27,36 +28,39 @@ import java.util.List;
public interface AuditManager
{
- List<AuditEvent> getMostRecentAuditEvents( List<String> repositoryIds )
+ List<AuditEvent> getMostRecentAuditEvents( MetadataRepository metadataRepository, List<String> repositoryIds )
throws MetadataRepositoryException;
- void addAuditEvent( AuditEvent event )
+ void addAuditEvent( MetadataRepository repository, AuditEvent event )
throws MetadataRepositoryException;
- void deleteAuditEvents( String repositoryId )
+ void deleteAuditEvents( MetadataRepository metadataRepository, String repositoryId )
throws MetadataRepositoryException;
/**
* Get all audit events from the given repositories that match a certain range
*
- * @param repositoryIds the repositories to retrieve events for
- * @param startTime find events only after this time
- * @param endTime find events only before this time
+ * @param metadataRepository
+ * @param repositoryIds the repositories to retrieve events for
+ * @param startTime find events only after this time
+ * @param endTime find events only before this time
* @return the list of events found
*/
- List<AuditEvent> getAuditEventsInRange( Collection<String> repositoryIds, Date startTime, Date endTime )
+ List<AuditEvent> getAuditEventsInRange( MetadataRepository metadataRepository, Collection<String> repositoryIds,
+ Date startTime, Date endTime )
throws MetadataRepositoryException;
/**
* Get all audit events from the given repositories that match a certain range and resource pattern
*
- * @param repositoryIds the repositories to retrieve events for
- * @param resourcePattern find all events whose resources start with this string
- * @param startTime find events only after this time
- * @param endTime find events only before this time
+ * @param metadataRepository
+ * @param repositoryIds the repositories to retrieve events for
+ * @param resourcePattern find all events whose resources start with this string
+ * @param startTime find events only after this time
+ * @param endTime find events only before this time
* @return the list of events found
*/
- List<AuditEvent> getAuditEventsInRange( Collection<String> repositoryIds, String resourcePattern, Date startTime,
- Date endTime )
+ List<AuditEvent> getAuditEventsInRange( MetadataRepository metadataRepository, Collection<String> repositoryIds,
+ String resourcePattern, Date startTime, Date endTime )
throws MetadataRepositoryException;
}