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;
 }