Author: olamy
Date: Fri Aug 19 17:14:32 2011
New Revision: 1159688

URL: http://svn.apache.org/viewvc?rev=1159688&view=rev
Log:
[MRM-1490] expose services tru rest
add some managed repo admin support

Modified:
    
archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/ManagedRepository.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org.apache.archiva.rest.services/DefaultRepositoriesService.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java

Modified: 
archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java?rev=1159688&r1=1159687&r2=1159688&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java
 Fri Aug 19 17:14:32 2011
@@ -251,6 +251,22 @@ public class RepositoryArchivaTaskSchedu
         }
     }
 
+    public boolean unQueueTask( RepositoryTask task )
+        throws TaskQueueException
+    {
+        synchronized ( repositoryScanningQueue )
+        {
+            if ( isProcessingRepositoryTask( task ) )
+            {
+                log.info( "cannot unuqueue Repository task '{}' not already 
queued.", task );
+                return false;
+            }
+            else
+            {
+                return repositoryScanningQueue.remove( task );
+            }
+        }
+    }
     public void configurationEvent( ConfigurationEvent event )
     {
         if ( event.getType() == ConfigurationEvent.SAVED )

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/ManagedRepository.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/ManagedRepository.java?rev=1159688&r1=1159687&r2=1159688&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/ManagedRepository.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/model/ManagedRepository.java
 Fri Aug 19 17:14:32 2011
@@ -41,12 +41,19 @@ public class ManagedRepository
 
     private boolean releases = false;
 
+    private boolean blockRedeployments;
+
+    private boolean stageRepoNeeded;
+
+    private String cronExpression;
+
     public ManagedRepository()
     {
         // no op
     }
 
-    public ManagedRepository( String id, String name, String url, String 
layout, boolean snapshots, boolean releases )
+    public ManagedRepository( String id, String name, String url, String 
layout, boolean snapshots, boolean releases,
+                              boolean blockRedeployments, boolean 
stageRepoNeeded, String cronExpression )
     {
         this.id = id;
         this.name = name;
@@ -54,9 +61,11 @@ public class ManagedRepository
         this.layout = layout;
         this.snapshots = snapshots;
         this.releases = releases;
+        this.blockRedeployments = blockRedeployments;
+        this.stageRepoNeeded = stageRepoNeeded;
+        this.cronExpression = cronExpression;
     }
 
-
     public String getId()
     {
         return this.id;
@@ -121,6 +130,36 @@ public class ManagedRepository
         this.url = url;
     }
 
+    public boolean isBlockRedeployments()
+    {
+        return blockRedeployments;
+    }
+
+    public void setBlockRedeployments( boolean blockRedeployments )
+    {
+        this.blockRedeployments = blockRedeployments;
+    }
+
+    public String getCronExpression()
+    {
+        return cronExpression;
+    }
+
+    public void setCronExpression( String cronExpression )
+    {
+        this.cronExpression = cronExpression;
+    }
+
+    public boolean isStageRepoNeeded()
+    {
+        return stageRepoNeeded;
+    }
+
+    public void setStageRepoNeeded( boolean stageRepoNeeded )
+    {
+        this.stageRepoNeeded = stageRepoNeeded;
+    }
+
 
     public int hashCode()
     {
@@ -151,6 +190,8 @@ public class ManagedRepository
     public String toString()
     {
         return "ManagedRepository{" + "id='" + id + '\'' + ", name='" + name + 
'\'' + ", url='" + url + '\''
-            + ", layout='" + layout + '\'' + ", snapshots=" + snapshots + ", 
releases=" + releases + '}';
+            + ", layout='" + layout + '\'' + ", snapshots=" + snapshots + ", 
releases=" + releases
+            + ", blockRedeployments=" + blockRedeployments + ", 
cronExpression='" + cronExpression + '\''
+            + ", stageRepoNeeded=" + stageRepoNeeded + '}';
     }
 }
\ No newline at end of file

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java?rev=1159688&r1=1159687&r2=1159688&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
 Fri Aug 19 17:14:32 2011
@@ -24,7 +24,9 @@ import org.apache.archiva.rest.api.model
 import org.apache.maven.archiva.security.ArchivaRoleConstants;
 import org.codehaus.plexus.redback.authorization.RedbackAuthorization;
 
+import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -45,6 +47,29 @@ public interface RepositoriesService
     @RedbackAuthorization( permission = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     List<ManagedRepository> getManagedRepositories();
 
+    @Path( "getManagedRepository/{repositoryId}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @RedbackAuthorization( permission = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    ManagedRepository getManagedRepository( @PathParam( "repositoryId" ) 
String repositoryId );
+
+    @Path( "deleteManagedRepository/{repositoryId}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @RedbackAuthorization( permission = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    Boolean deleteManagedRepository( @PathParam( "repositoryId" ) String 
repositoryId )
+        throws Exception;
+
+
+    @Path( "addManagedRepository" )
+    @POST
+    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @RedbackAuthorization( permission = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
+    Boolean addManagedRepository( ManagedRepository managedRepository )
+        throws Exception;
+
+
     @Path( "getRemoteRepositories" )
     @GET
     @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
@@ -64,4 +89,11 @@ public interface RepositoriesService
     @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
     @RedbackAuthorization( permission = 
ArchivaRoleConstants.OPERATION_RUN_INDEXER )
     Boolean alreadyScanning( @PathParam( "repositoryId" ) String repositoryId 
);
+
+    @Path( "removeScanningTaskFromQueue/{repositoryId}" )
+    @GET
+    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @RedbackAuthorization( permission = 
ArchivaRoleConstants.OPERATION_RUN_INDEXER )
+    Boolean removeScanningTaskFromQueue( @PathParam( "repositoryId" ) String 
repositoryId );
+
 }

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml?rev=1159688&r1=1159687&r2=1159688&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/pom.xml
 Fri Aug 19 17:14:32 2011
@@ -83,10 +83,22 @@
       <groupId>org.codehaus.redback</groupId>
       <artifactId>redback-rest-api</artifactId>
     </dependency>
+
+    <dependency>
+      <groupId>commons-validator</groupId>
+      <artifactId>commons-validator</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>oro</groupId>
+      <artifactId>oro</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>javax.ws.rs</groupId>
       <artifactId>jsr311-api</artifactId>
     </dependency>
+
     <!-- normally not needed but here for wadl feature currently in cxf -->
     <dependency>
       <groupId>org.apache.cxf</groupId>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org.apache.archiva.rest.services/DefaultRepositoriesService.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org.apache.archiva.rest.services/DefaultRepositoriesService.java?rev=1159688&r1=1159687&r2=1159688&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org.apache.archiva.rest.services/DefaultRepositoriesService.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org.apache.archiva.rest.services/DefaultRepositoriesService.java
 Fri Aug 19 17:14:32 2011
@@ -1,15 +1,28 @@
 package org.apache.archiva.rest.services;
 
+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.stats.RepositoryStatisticsManager;
 import org.apache.archiva.rest.api.model.ManagedRepository;
 import org.apache.archiva.rest.api.model.RemoteRepository;
 import org.apache.archiva.rest.api.services.RepositoriesService;
 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.commons.validator.GenericValidator;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
+import 
org.apache.maven.archiva.configuration.IndeterminateConfigurationException;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration;
 import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration;
+import org.codehaus.plexus.registry.Registry;
+import org.codehaus.plexus.registry.RegistryException;
 import org.codehaus.plexus.taskqueue.TaskQueueException;
+import org.codehaus.redback.components.scheduler.CronExpressionValidator;
+import org.codehaus.redback.components.scheduler.Scheduler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -17,8 +30,11 @@ import org.springframework.stereotype.Se
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.ws.rs.PathParam;
+import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author Olivier Lamy
@@ -28,9 +44,17 @@ import java.util.List;
 public class DefaultRepositoriesService
     implements RepositoriesService
 {
-
     private Logger log = LoggerFactory.getLogger( getClass() );
 
+    // FIXME duplicate from xmlrpc
+    // olamy move this to a common remote services api
+    private static final String REPOSITORY_ID_VALID_EXPRESSION = 
"^[a-zA-Z0-9._-]+$";
+
+    private static final String REPOSITORY_NAME_VALID_EXPRESSION = 
"^([a-zA-Z0-9.)/_(-]|\\s)+$";
+
+    private static final String REPOSITORY_LOCATION_VALID_EXPRESSION = 
"^[-a-zA-Z0-9._/~:?!&amp;=\\\\]+$";
+
+
     @Inject
     protected ArchivaConfiguration archivaConfiguration;
 
@@ -38,6 +62,16 @@ public class DefaultRepositoriesService
     @Named( value = "archivaTaskScheduler#repository" )
     private RepositoryArchivaTaskScheduler repositoryTaskScheduler;
 
+    @Inject
+    @Named( value = "commons-configuration" )
+    private Registry registry;
+
+    @Inject
+    private RepositoryStatisticsManager repositoryStatisticsManager;
+
+    @Inject
+    private RepositorySessionFactory repositorySessionFactory;
+
     public List<ManagedRepository> getManagedRepositories()
     {
         List<ManagedRepositoryConfiguration> managedRepoConfigs =
@@ -48,15 +82,100 @@ public class DefaultRepositoriesService
         for ( ManagedRepositoryConfiguration repoConfig : managedRepoConfigs )
         {
             // TODO fix resolution of repo url!
+            // TODO staging repo too
             ManagedRepository repo =
                 new ManagedRepository( repoConfig.getId(), 
repoConfig.getName(), "URL", repoConfig.getLayout(),
-                                       repoConfig.isSnapshots(), 
repoConfig.isReleases() );
+                                       repoConfig.isSnapshots(), 
repoConfig.isReleases(),
+                                       repoConfig.isBlockRedeployments(), 
false,
+                                       repoConfig.getRefreshCronExpression() );
             managedRepos.add( repo );
         }
 
         return managedRepos;
     }
 
+    public ManagedRepository getManagedRepository( String repositoryId )
+    {
+        List<ManagedRepository> repos = getManagedRepositories();
+        for ( ManagedRepository repo : repos )
+        {
+            if ( StringUtils.equals( repo.getId(), repositoryId ) )
+            {
+                return repo;
+            }
+        }
+        return null;
+    }
+
+    // FIXME duplicate of xml rpc
+    // move this in a common place archiva commons remote service
+    public Boolean deleteManagedRepository( String repoId )
+        throws Exception
+    {
+        Configuration config = archivaConfiguration.getConfiguration();
+
+        ManagedRepositoryConfiguration repository = 
config.findManagedRepositoryById( repoId );
+
+        if ( repository == null )
+        {
+            throw new Exception( "A repository with that id does not exist" );
+        }
+
+        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
+        {
+            saveConfiguration( config );
+        }
+        catch ( Exception e )
+        {
+            throw new Exception( "Error saving configuration for delete 
action" + e.getMessage() );
+        }
+
+        File dir = new File( repository.getLocation() );
+        if ( !FileUtils.deleteQuietly( dir ) )
+        {
+            throw new IOException( "Cannot delete repository " + dir );
+        }
+
+        List<ProxyConnectorConfiguration> proxyConnectors = 
config.getProxyConnectors();
+        for ( ProxyConnectorConfiguration proxyConnector : proxyConnectors )
+        {
+            if ( StringUtils.equals( proxyConnector.getSourceRepoId(), 
repository.getId() ) )
+            {
+                archivaConfiguration.getConfiguration().removeProxyConnector( 
proxyConnector );
+            }
+        }
+
+        Map<String, List<String>> repoToGroupMap = 
archivaConfiguration.getConfiguration().getRepositoryToGroupMap();
+        if ( repoToGroupMap != null )
+        {
+            if ( repoToGroupMap.containsKey( repository.getId() ) )
+            {
+                List<String> repoGroups = repoToGroupMap.get( 
repository.getId() );
+                for ( String repoGroup : repoGroups )
+                {
+                    
archivaConfiguration.getConfiguration().findRepositoryGroupById( repoGroup 
).removeRepository(
+                        repository.getId() );
+                }
+            }
+        }
+
+        return Boolean.TRUE;
+    }
+
     public List<RemoteRepository> getRemoteRepositories()
     {
         Configuration config = archivaConfiguration.getConfiguration();
@@ -90,6 +209,7 @@ public class DefaultRepositoriesService
         catch ( TaskQueueException e )
         {
             log.error( "failed to schedule scanning of repo with id {}", 
repositoryId, e );
+            return false;
         }
         return true;
     }
@@ -98,4 +218,205 @@ public class DefaultRepositoriesService
     {
         return repositoryTaskScheduler.isProcessingRepositoryTask( 
repositoryId );
     }
+
+    public Boolean removeScanningTaskFromQueue( @PathParam( "repositoryId" ) 
String repositoryId )
+    {
+        RepositoryTask task = new RepositoryTask();
+        task.setRepositoryId( repositoryId );
+        try
+        {
+            return repositoryTaskScheduler.unQueueTask( task );
+        }
+        catch ( TaskQueueException e )
+        {
+            log.error( "failed to unschedule scanning of repo with id {}", 
repositoryId, e );
+            return false;
+        }
+    }
+
+    public Boolean addManagedRepository( ManagedRepository managedRepository )
+        throws Exception
+    {
+        return addManagedRepository( managedRepository.getId(), 
managedRepository.getLayout(),
+                                     managedRepository.getName(), 
managedRepository.getUrl(),
+                                     managedRepository.isBlockRedeployments(), 
managedRepository.isReleases(),
+                                     managedRepository.isSnapshots(), 
managedRepository.isStageRepoNeeded(),
+                                     managedRepository.getCronExpression() );
+    }
+
+    private Boolean addManagedRepository( String repoId, String layout, String 
name, String location,
+                                          boolean blockRedeployments, boolean 
releasesIncluded,
+                                          boolean snapshotsIncluded, boolean 
stageRepoNeeded, String cronExpression )
+        throws Exception
+    {
+
+        Configuration config = archivaConfiguration.getConfiguration();
+
+        CronExpressionValidator validator = new CronExpressionValidator();
+
+        if ( config.getManagedRepositoriesAsMap().containsKey( repoId ) )
+        {
+            throw new Exception( "Unable to add new repository with id [" + 
repoId
+                                     + "], that id already exists as a managed 
repository." );
+        }
+        else if ( config.getRemoteRepositoriesAsMap().containsKey( repoId ) )
+        {
+            throw new Exception( "Unable to add new repository with id [" + 
repoId
+                                     + "], that id already exists as a remote 
repository." );
+        }
+        else if ( config.getRepositoryGroupsAsMap().containsKey( repoId ) )
+        {
+            throw new Exception( "Unable to add new repository with id [" + 
repoId
+                                     + "], that id already exists as a 
repository group." );
+        }
+
+        if ( !validator.validate( cronExpression ) )
+        {
+            throw new Exception( "Invalid cron expression." );
+        }
+
+        if ( !GenericValidator.matchRegexp( repoId, 
REPOSITORY_ID_VALID_EXPRESSION ) )
+        {
+            throw new Exception(
+                "Invalid repository ID. Identifier must only contain 
alphanumeric characters, underscores(_), dots(.), and dashes(-)." );
+        }
+
+        if ( !GenericValidator.matchRegexp( name, 
REPOSITORY_NAME_VALID_EXPRESSION ) )
+        {
+            throw new Exception(
+                "Invalid repository name. Repository Name must only contain 
alphanumeric characters, white-spaces(' '), "
+                    + "forward-slashes(/), open-parenthesis('('), 
close-parenthesis(')'),  underscores(_), dots(.), and dashes(-)." );
+        }
+
+        String repoLocation = removeExpressions( location );
+
+        if ( !GenericValidator.matchRegexp( repoLocation, 
REPOSITORY_LOCATION_VALID_EXPRESSION ) )
+        {
+            throw new Exception(
+                "Invalid repository location. Directory must only contain 
alphanumeric characters, equals(=), question-marks(?), "
+                    + "exclamation-points(!), ampersands(&amp;), 
forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), 
tildes(~), and dashes(-)." );
+        }
+
+        ManagedRepositoryConfiguration repository = new 
ManagedRepositoryConfiguration();
+
+        repository.setId( repoId );
+        repository.setBlockRedeployments( blockRedeployments );
+        repository.setReleases( releasesIncluded );
+        repository.setSnapshots( snapshotsIncluded );
+        repository.setName( name );
+        repository.setLocation( repoLocation );
+        repository.setLayout( layout );
+        repository.setRefreshCronExpression( cronExpression );
+
+        addRepository( repository, config );
+
+        if ( stageRepoNeeded )
+        {
+            ManagedRepositoryConfiguration stagingRepository = 
getStageRepoConfig( repository );
+            addRepository( stagingRepository, config );
+        }
+
+        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;
+    }
+
+    //-----------------------------------------------
+    // util methods
+    // FIXME most are copied from xmlrpc
+    // olamt move those in common utility classes
+    //-----------------------------------------------
+
+    public Boolean executeRepositoryScanner( String repoId )
+        throws Exception
+    {
+        return scanRepository( repoId, true );
+    }
+
+    private void saveConfiguration( Configuration config )
+        throws Exception
+    {
+        try
+        {
+            archivaConfiguration.save( config );
+        }
+        catch ( RegistryException e )
+        {
+            throw new Exception( "Error occurred in the registry." );
+        }
+        catch ( IndeterminateConfigurationException e )
+        {
+            throw new Exception( "Error occurred while saving the 
configuration." );
+        }
+    }
+
+    protected void addRepository( ManagedRepositoryConfiguration repository, 
Configuration configuration )
+        throws IOException
+    {
+        // Normalize the path
+        File file = new File( repository.getLocation() );
+        repository.setLocation( file.getCanonicalPath() );
+        if ( !file.exists() )
+        {
+            file.mkdirs();
+        }
+        if ( !file.exists() || !file.isDirectory() )
+        {
+            throw new IOException(
+                "Unable to add repository - no write access, can not create 
the root directory: " + file );
+        }
+
+        configuration.addManagedRepository( repository );
+    }
+
+    private ManagedRepositoryConfiguration getStageRepoConfig( 
ManagedRepositoryConfiguration repository )
+    {
+        ManagedRepositoryConfiguration stagingRepository = new 
ManagedRepositoryConfiguration();
+        stagingRepository.setId( repository.getId() + "-stage" );
+        stagingRepository.setLayout( repository.getLayout() );
+        stagingRepository.setName( repository.getName() + "-stage" );
+        stagingRepository.setBlockRedeployments( 
repository.isBlockRedeployments() );
+        stagingRepository.setDaysOlder( repository.getDaysOlder() );
+        stagingRepository.setDeleteReleasedSnapshots( 
repository.isDeleteReleasedSnapshots() );
+        stagingRepository.setIndexDir( repository.getIndexDir() );
+        String path = repository.getLocation();
+        int lastIndex = path.lastIndexOf( '/' );
+        stagingRepository.setLocation( path.substring( 0, lastIndex ) + "/" + 
stagingRepository.getId() );
+        stagingRepository.setRefreshCronExpression( 
repository.getRefreshCronExpression() );
+        stagingRepository.setReleases( repository.isReleases() );
+        stagingRepository.setRetentionCount( repository.getRetentionCount() );
+        stagingRepository.setScanned( repository.isScanned() );
+        stagingRepository.setSnapshots( repository.isSnapshots() );
+        return stagingRepository;
+    }
+
+
+    private String removeExpressions( String directory )
+    {
+        String value = StringUtils.replace( directory, "${appserver.base}",
+                                            registry.getString( 
"appserver.base", "${appserver.base}" ) );
+        value = StringUtils.replace( value, "${appserver.home}",
+                                     registry.getString( "appserver.home", 
"${appserver.home}" ) );
+        return value;
+    }
+
 }
+
+

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java?rev=1159688&r1=1159687&r2=1159688&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java
 Fri Aug 19 17:14:32 2011
@@ -19,16 +19,14 @@ package org.apache.archiva.rest.services
  * under the License.
  */
 
+import org.apache.archiva.rest.api.model.ManagedRepository;
 import org.apache.archiva.rest.api.model.RemoteRepository;
 import org.apache.archiva.rest.api.services.RepositoriesService;
 import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
 import org.apache.cxf.jaxrs.client.ServerWebApplicationException;
 import org.apache.cxf.jaxrs.client.WebClient;
-import org.codehaus.plexus.taskqueue.TaskQueue;
 import org.junit.Test;
 
-import javax.inject.Inject;
-import javax.inject.Named;
 import java.util.List;
 
 /**
@@ -37,8 +35,6 @@ import java.util.List;
 public class RepositoriesServiceTest
     extends AbstractArchivaRestTest
 {
-    @Inject @Named("taskQueue#repository-scanning")
-    private TaskQueue repositoryScanningQueue;
 
     RepositoriesService getRepositoriesService()
     {
@@ -101,12 +97,7 @@ public class RepositoriesServiceTest
         WebClient.client( service ).header( "Authorization", 
authorizationHeader );
         WebClient.getConfig( service 
).getHttpConduit().getClient().setReceiveTimeout( 300000 );
         String repoId = service.getManagedRepositories().get( 0 ).getId();
-        /*
-        while ( service.alreadyScanning( repoId ) )
-        {
-            Thread.sleep( 1 );
-        }
-        */
+
         assertTrue( service.scanRepository( repoId, true ) );
 
         log.info( "sanRepo call ok " );
@@ -114,4 +105,28 @@ public class RepositoriesServiceTest
         assertTrue( service.alreadyScanning( repoId ) );
 
     }
+
+    @Test
+    public void addManagedRepo()
+        throws Exception
+    {
+        RepositoriesService service = getRepositoriesService();
+        WebClient.client( service ).header( "Authorization", 
authorizationHeader );
+        WebClient.getConfig( service 
).getHttpConduit().getClient().setReceiveTimeout( 300000 );
+        ManagedRepository repo = getTestManagedRepository();
+        if ( service.getManagedRepository( repo.getId() ) != null )
+        {
+            service.deleteManagedRepository( repo.getId() );
+            assertNull( service.getManagedRepository( repo.getId() ) );
+        }
+        service.addManagedRepository( repo );
+        assertNotNull( service.getManagedRepository( repo.getId() ) );
+    }
+
+
+    private ManagedRepository getTestManagedRepository()
+    {
+        return new ManagedRepository( "TEST", "test", "foo", "default", true, 
true, false, false, "2 * * * * ?" );
+    }
+
 }


Reply via email to