From 2db95ef56d57f3e919ecb83b6da7bcc184197654 Mon Sep 17 00:00:00 2001 From: Brett Porter Date: Tue, 28 Jun 2011 06:44:30 +0000 Subject: [PATCH] [MRM-1324] repository statistics report doesn't appear to be working correctly Submitted by: Greg Michael Meneses git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1140450 13f79535-47bb-0310-9956-ffa450edef68 --- .../scanner/DefaultRepositoryScanner.java | 4 +- .../AbstractManagedRepositoriesAction.java | 33 ++++++++++++++- .../AddManagedRepositoryAction.java | 22 ++++++++++ .../EditManagedRepositoryAction.java | 24 ++++++++++- .../AddManagedRepositoryActionTest.java | 19 +++++++++ .../EditManagedRepositoryActionTest.java | 42 ++++++++++++++++++- .../services/AdministrationServiceImpl.java | 18 ++++++++ .../AdministrationServiceImplTest.java | 22 ++++++++++ .../stats/RepositoryStatistics.java | 19 ++++++--- 9 files changed, 192 insertions(+), 11 deletions(-) diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/DefaultRepositoryScanner.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/DefaultRepositoryScanner.java index ee149272d..cec42af4a 100644 --- a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/DefaultRepositoryScanner.java +++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/DefaultRepositoryScanner.java @@ -82,7 +82,9 @@ public class DefaultRepositoryScanner File repositoryBase = new File( repository.getLocation() ); - if ( !repositoryBase.exists() ) + //MRM-1342 Repository statistics report doesn't appear to be working correctly + //create the repo if not existing to have an empty stats + if ( !repositoryBase.exists() && !repositoryBase.mkdirs() ) { throw new UnsupportedOperationException( "Unable to scan a repository, directory " + repositoryBase.getPath() + " does not exist." ); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoriesAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoriesAction.java index 7dd646963..63bbb3a76 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoriesAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoriesAction.java @@ -19,6 +19,8 @@ package org.apache.maven.archiva.web.action.admin.repositories; * under the License. */ +import org.apache.archiva.scheduler.repository.RepositoryArchivaTaskScheduler; +import org.apache.archiva.scheduler.repository.RepositoryTask; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.Configuration; @@ -27,11 +29,12 @@ import org.apache.maven.archiva.security.ArchivaRoleConstants; import org.codehaus.plexus.redback.role.RoleManager; import org.codehaus.plexus.redback.role.RoleManagerException; import org.codehaus.plexus.registry.Registry; +import org.codehaus.plexus.taskqueue.TaskQueueException; -import javax.inject.Inject; -import javax.inject.Named; import java.io.File; import java.io.IOException; +import javax.inject.Inject; +import javax.inject.Named; /** * Abstract ManagedRepositories Action. @@ -57,6 +60,13 @@ public abstract class AbstractManagedRepositoriesAction @Inject @Named( value = "commons-configuration" ) private Registry registry; + + /** + * plexus.requirement role="org.apache.archiva.scheduler.ArchivaTaskScheduler" role-hint="repository" + */ + @Inject + @Named( value = "archivaTaskScheduler#repository" ) + private RepositoryArchivaTaskScheduler repositoryTaskScheduler; public static final String CONFIRM = "confirm"; @@ -74,6 +84,11 @@ public abstract class AbstractManagedRepositoriesAction { this.registry = registry; } + + public void setRepositoryTaskScheduler( RepositoryArchivaTaskScheduler repositoryTaskScheduler ) + { + this.repositoryTaskScheduler = repositoryTaskScheduler; + } protected void addRepository( ManagedRepositoryConfiguration repository, Configuration configuration ) throws IOException @@ -158,5 +173,19 @@ public abstract class AbstractManagedRepositoriesAction value = StringUtils.replace( value, "${appserver.home}", registry.getString( "appserver.home", "${appserver.home}" ) ); return value; + } + + //MRM-1342 Repository statistics report doesn't appear to be working correctly + //provide a method to scan repository + protected void executeRepositoryScanner( String repoId ) + throws TaskQueueException + { + RepositoryTask task = new RepositoryTask(); + task.setRepositoryId( repoId ); + + if ( repositoryTaskScheduler.isProcessingRepositoryTask( repoId ) ) + { + repositoryTaskScheduler.queueTask( task ); + } } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java index d8996f886..6be92c44f 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java @@ -26,6 +26,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; import org.codehaus.plexus.redback.role.RoleManagerException; +import org.codehaus.plexus.taskqueue.TaskQueueException; import org.codehaus.redback.components.scheduler.CronExpressionValidator; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; @@ -112,6 +113,27 @@ public class AddManagedRepositoryAction } result = saveConfiguration( configuration ); + + //MRM-1342 Repository statistics report doesn't appear to be working correctly + //scan repository when adding of repository is successful + if ( result.equals( SUCCESS ) ) + { + try + { + executeRepositoryScanner( repository.getId() ); + + if ( stageNeeded ) + { + ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig(); + executeRepositoryScanner( stagingRepository.getId() ); + } + } + catch ( TaskQueueException e ) + { + log.warn( new StringBuilder( "Unable to scan repository [" ).append( repository.getId() ).append( "]: " ).append( + e.getMessage() ).toString(), e ); + } + } } catch ( RoleManagerException e ) { diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java index 88233b278..4e731f1d8 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java @@ -29,13 +29,14 @@ import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; import org.codehaus.plexus.redback.role.RoleManagerException; +import org.codehaus.plexus.taskqueue.TaskQueueException; import org.codehaus.redback.components.scheduler.CronExpressionValidator; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; -import javax.inject.Inject; import java.io.File; import java.io.IOException; +import javax.inject.Inject; /** * AddManagedRepositoryAction @@ -167,6 +168,27 @@ public class EditManagedRepositoryAction repositoryStatisticsManager.deleteStatistics( repositorySession.getRepository(), repository.getId() ); repositorySession.save(); } + if ( result.equals( SUCCESS ) ) + { + //MRM-1342 Repository statistics report doesn't appear to be working correctly + //scan repository when modification of repository is successful + if ( result.equals( SUCCESS ) ) + { + try + { + executeRepositoryScanner( repository.getId() ); + if ( stageNeeded ) + { + executeRepositoryScanner( stagingRepository.getId() ); + } + } + catch ( TaskQueueException e ) + { + log.warn( new StringBuilder( "Unable to scan repository [" ).append( repository.getId() ).append( "]: " ).append( + e.getMessage() ).toString(), e ); + } + } + } } catch ( IOException e ) { diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java index aa09b0379..c8d7e0046 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java @@ -20,6 +20,8 @@ package org.apache.maven.archiva.web.action.admin.repositories; */ import com.opensymphony.xwork2.Action; +import org.apache.archiva.scheduler.repository.RepositoryArchivaTaskScheduler; +import org.apache.archiva.scheduler.repository.RepositoryTask; import org.apache.commons.io.FileUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; @@ -31,6 +33,7 @@ import org.codehaus.plexus.registry.Registry; import org.codehaus.redback.integration.interceptor.SecureActionBundle; import org.codehaus.redback.integration.interceptor.SecureActionException; import org.easymock.MockControl; +import org.easymock.classextension.MockClassControl; import java.io.File; import java.util.ArrayList; @@ -60,6 +63,10 @@ public class AddManagedRepositoryActionTest private MockControl registryControl; private ArchivaConfiguration archivaConfiguration; + + private MockControl repositoryTaskSchedulerControl; + + private RepositoryArchivaTaskScheduler repositoryTaskScheduler; @Override protected void setUp() @@ -81,6 +88,10 @@ public class AddManagedRepositoryActionTest registry = (Registry) registryControl.getMock(); action.setRegistry( registry ); + repositoryTaskSchedulerControl = MockClassControl.createControl( RepositoryArchivaTaskScheduler.class ); + repositoryTaskScheduler = ( RepositoryArchivaTaskScheduler ) repositoryTaskSchedulerControl.getMock(); + action.setRepositoryTaskScheduler( repositoryTaskScheduler ); + location = new File( "target/test/location" ); } @@ -146,6 +157,14 @@ public class AddManagedRepositoryActionTest registryControl.setReturnValue( "target/test" ); registryControl.replay(); + + RepositoryTask task = new RepositoryTask(); + task.setRepositoryId( REPO_ID ); + repositoryTaskScheduler.isProcessingRepositoryTask( REPO_ID ); + repositoryTaskSchedulerControl.setReturnValue( false ); + repositoryTaskScheduler.queueTask( task ); + repositoryTaskSchedulerControl.setVoidCallable(); + repositoryTaskSchedulerControl.replay(); Configuration configuration = new Configuration(); archivaConfiguration.getConfiguration(); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java index 1bcc749d3..2d80279ce 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java @@ -24,6 +24,8 @@ import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.RepositorySession; import org.apache.archiva.metadata.repository.memory.TestRepositorySessionFactory; import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager; +import org.apache.archiva.scheduler.repository.RepositoryArchivaTaskScheduler; +import org.apache.archiva.scheduler.repository.RepositoryTask; import org.apache.commons.io.FileUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; @@ -35,6 +37,7 @@ import org.codehaus.plexus.registry.Registry; import org.codehaus.redback.integration.interceptor.SecureActionBundle; import org.codehaus.redback.integration.interceptor.SecureActionException; import org.easymock.MockControl; +import org.easymock.classextension.MockClassControl; import java.io.File; import java.io.IOException; @@ -70,6 +73,10 @@ public class EditManagedRepositoryActionTest private MockControl registryControl; private MetadataRepository metadataRepository; + + private MockControl repositoryTaskSchedulerControl; + + private RepositoryArchivaTaskScheduler repositoryTaskScheduler; @Override protected void setUp() @@ -90,6 +97,10 @@ public class EditManagedRepositoryActionTest registryControl = MockControl.createControl( Registry.class ); registry = (Registry) registryControl.getMock(); action.setRegistry( registry ); + + repositoryTaskSchedulerControl = MockClassControl.createControl( RepositoryArchivaTaskScheduler.class ); + repositoryTaskScheduler = ( RepositoryArchivaTaskScheduler ) repositoryTaskSchedulerControl.getMock(); + action.setRepositoryTaskScheduler( repositoryTaskScheduler ); location = new File( "target/test/location" ); @@ -148,10 +159,12 @@ public class EditManagedRepositoryActionTest public void testEditRepository() throws Exception { + String stageRepoId = REPO_ID + "-stage"; + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID ); roleManagerControl.setReturnValue( false ); - roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID + "-stage" ); + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, stageRepoId ); roleManagerControl.setReturnValue( false ); roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_OBSERVER, REPO_ID ); @@ -159,7 +172,7 @@ public class EditManagedRepositoryActionTest roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID ); roleManagerControl.setReturnValue( false ); - roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID + "-stage" ); + roleManager.templatedRoleExists( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, stageRepoId ); roleManagerControl.setReturnValue( false ); roleManager.createTemplatedRole( ArchivaRoleConstants.TEMPLATE_REPOSITORY_MANAGER, REPO_ID ); @@ -174,6 +187,22 @@ public class EditManagedRepositoryActionTest registryControl.replay(); + RepositoryTask task = new RepositoryTask(); + task.setRepositoryId( REPO_ID ); + repositoryTaskScheduler.isProcessingRepositoryTask( REPO_ID ); + repositoryTaskSchedulerControl.setReturnValue( false ); + repositoryTaskScheduler.queueTask( task ); + repositoryTaskSchedulerControl.setVoidCallable(); + + RepositoryTask stageTask = new RepositoryTask(); + stageTask.setRepositoryId( stageRepoId ); + repositoryTaskScheduler.isProcessingRepositoryTask( stageRepoId ); + repositoryTaskSchedulerControl.setReturnValue( false ); + repositoryTaskScheduler.queueTask( stageTask ); + repositoryTaskSchedulerControl.setVoidCallable(); + + repositoryTaskSchedulerControl.replay(); + Configuration configuration = createConfigurationForEditing( createRepository() ); archivaConfiguration.getConfiguration(); archivaConfigurationControl.setReturnValue( configuration ); @@ -248,6 +277,15 @@ public class EditManagedRepositoryActionTest registryControl.replay(); + RepositoryTask task = new RepositoryTask(); + task.setRepositoryId( REPO_ID ); + repositoryTaskScheduler.isProcessingRepositoryTask( REPO_ID ); + repositoryTaskSchedulerControl.setReturnValue( false ); + repositoryTaskScheduler.queueTask( task ); + repositoryTaskSchedulerControl.setVoidCallable(); + + repositoryTaskSchedulerControl.replay(); + Configuration configuration = createConfigurationForEditing( createRepository() ); archivaConfiguration.getConfiguration(); archivaConfigurationControl.setReturnValue( configuration ); diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java index 73ace70a0..b819eff91 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/main/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImpl.java @@ -433,6 +433,24 @@ public class AdministrationServiceImpl } saveConfiguration( config ); + + //MRM-1342 Repository statistics report doesn't appear to be working correctly + //scan repository when adding of repository is successful + try + { + executeRepositoryScanner( repoId ); + if ( stageRepoNeeded ) + { + ManagedRepositoryConfiguration stagingRepository = getStageRepoConfig( repository ); + executeRepositoryScanner( stagingRepository.getId() ); + } + } + catch ( Exception e ) + { + log.warn( new StringBuilder( "Unable to scan repository [" ).append( repoId ).append( "]: " ).append( + e.getMessage() ).toString(), e ); + } + return Boolean.TRUE; } diff --git a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java index 38fcd358b..9acec835a 100644 --- a/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java +++ b/archiva-modules/archiva-web/archiva-xmlrpc/archiva-xmlrpc-services/src/test/java/org/apache/archiva/web/xmlrpc/services/AdministrationServiceImplTest.java @@ -959,9 +959,31 @@ public class AdministrationServiceImplTest archivaConfig.save( config ); archivaConfigControl.setVoidCallable(); + //managed repo + repositoryTaskSchedulerControl.expectAndReturn( repositoryTaskScheduler.isProcessingRepositoryTask( repoId ), false ); + + RepositoryTask task = new RepositoryTask(); + task.setRepositoryId( repoId ); + archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config ); + + configControl.expectAndReturn( config.findManagedRepositoryById( repoId ), managedRepo ); + repositoryTaskScheduler.queueTask( task ); + repositoryTaskSchedulerControl.setVoidCallable(); + + //staged repo + repositoryTaskSchedulerControl.expectAndReturn( repositoryTaskScheduler.isProcessingRepositoryTask( repoId + STAGE ), false ); + task = new RepositoryTask(); + task.setRepositoryId( repoId + STAGE ); + archivaConfigControl.expectAndReturn( archivaConfig.getConfiguration(), config ); + + configControl.expectAndReturn( config.findManagedRepositoryById( repoId + STAGE ), managedRepo ); + repositoryTaskScheduler.queueTask( task ); + repositoryTaskSchedulerControl.setVoidCallable(); + archivaConfigControl.replay(); configControl.replay(); registryControl.replay(); + repositoryTaskSchedulerControl.replay(); assertFalse( new File( releaseLocation ).isDirectory() ); assertFalse( new File( stageLocation ).isDirectory() ); boolean success = service.addManagedRepository( repoId, layout, name, "${appserver.base}/test-repository/" + projId + ".releases", true, true, false, true, diff --git a/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatistics.java b/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatistics.java index 9c288278d..8e0863478 100644 --- a/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatistics.java +++ b/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatistics.java @@ -19,14 +19,14 @@ package org.apache.archiva.metadata.repository.stats; * under the License. */ +import org.apache.archiva.metadata.model.MetadataFacet; + import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; -import org.apache.archiva.metadata.model.MetadataFacet; - public class RepositoryStatistics implements MetadataFacet { @@ -50,7 +50,7 @@ public class RepositoryStatistics static final String SCAN_TIMESTAMP_FORMAT = "yyyy/MM/dd/HHmmss.SSS"; - private Map totalCountForType = new HashMap(); + private Map totalCountForType = new ZeroForNullHashMap(); private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" ); @@ -279,12 +279,21 @@ public class RepositoryStatistics public long getTotalCountForType( String type ) { - Long value = totalCountForType.get( type ); - return value != null ? value : 0; + return totalCountForType.get( type ); } public void setTotalCountForType( String type, long count ) { totalCountForType.put( type, count ); } + + private static final class ZeroForNullHashMap extends HashMap + { + @Override + public V get(Object key) { + V value = super.get( key ); + + return value != null ? value : ( V ) Long.valueOf( 0L ); + } + } } -- 2.39.5