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." );
* 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;
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.
@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";
{
this.registry = registry;
}
+
+ public void setRepositoryTaskScheduler( RepositoryArchivaTaskScheduler repositoryTaskScheduler )
+ {
+ this.repositoryTaskScheduler = repositoryTaskScheduler;
+ }
protected void addRepository( ManagedRepositoryConfiguration repository, Configuration configuration )
throws IOException
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 );
+ }
}
}
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;
}
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 )
{
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
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 )
{
*/
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;
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;
private MockControl registryControl;
private ArchivaConfiguration archivaConfiguration;
+
+ private MockControl repositoryTaskSchedulerControl;
+
+ private RepositoryArchivaTaskScheduler repositoryTaskScheduler;
@Override
protected void setUp()
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" );
}
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();
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;
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;
private MockControl registryControl;
private MetadataRepository metadataRepository;
+
+ private MockControl repositoryTaskSchedulerControl;
+
+ private RepositoryArchivaTaskScheduler repositoryTaskScheduler;
@Override
protected void setUp()
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" );
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 );
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 );
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 );
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 );
}
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;
}
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,
* 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
{
static final String SCAN_TIMESTAMP_FORMAT = "yyyy/MM/dd/HHmmss.SSS";
- private Map<String, Long> totalCountForType = new HashMap<String, Long>();
+ private Map<String, Long> totalCountForType = new ZeroForNullHashMap<String, Long>();
private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone( "UTC" );
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<K, V extends Long> extends HashMap<K, V>
+ {
+ @Override
+ public V get(Object key) {
+ V value = super.get( key );
+
+ return value != null ? value : ( V ) Long.valueOf( 0L );
+ }
+ }
}