]> source.dussan.org Git - archiva.git/commitdiff
Adding packedIndexDir
authorMartin Stockhammer <martin.stockhammer@ars.de>
Thu, 29 Mar 2018 21:47:13 +0000 (23:47 +0200)
committerMartin Stockhammer <martin.stockhammer@ars.de>
Thu, 29 Mar 2018 21:47:13 +0000 (23:47 +0200)
19 files changed:
archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
archiva-modules/archiva-base/archiva-maven2-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/AbstractRepository.java
archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/AbstractRepositoryAdmin.java
archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/managed/DefaultManagedRepositoryAdmin.java
archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/remote/DefaultRemoteRepositoryAdmin.java
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/features/RemoteIndexFeature.java
archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRemoteRepository.java
archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutor.java
archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DefaultDownloadRemoteIndexScheduler.java
archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java
archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTaskRequest.java
archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/AbstractArchivaRestTest.java
archiva-modules/archiva-web/archiva-web-common/src/test/java/org/apache/archiva/remotedownload/DownloadMergedIndexTest.java
archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java

index d687ba6af58bcaff9955234da8198a3ae2206df2..746f2c472bfb12ef15d5167803c476f3fc58f985 100644 (file)
             The directory for the indexes of this repository.
           </description>
         </field>
+        <field>
+          <name>packedIndexDir</name>
+          <version>3.0.0+</version>
+          <type>String</type>
+          <defaultValue></defaultValue>
+          <description>
+            The directory for the packed indexes of this repository.
+          </description>
+        </field>
         <field>
           <name>description</name>
           <version>1.0.0+</version>
index 718cd7dcb95662c534405b7dd3f0c4d91c64d284..f80e39baf452aec4f57f2508f8e81761666cb2c1 100644 (file)
@@ -123,10 +123,9 @@ public class MavenIndexManager implements ArchivaIndexManager {
     @Inject
     private ArtifactContextProducer artifactContextProducer;
 
-    @Inject
-    RepositoryRegistry repositoryRegistry;
 
     public static final String DEFAULT_INDEXER_DIR = ".indexer";
+    public static final String DEFAULT_PACKED_INDEX_DIR = ".index";
 
     private ConcurrentSkipListSet<Path> activeContexts = new ConcurrentSkipListSet<>( );
 
@@ -523,6 +522,7 @@ public class MavenIndexManager implements ArchivaIndexManager {
             IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
             try {
                 icf.setLocalIndexPath(getIndexPath(repo));
+                icf.setLocalPackedIndexPath(getPackedIndexPath(repo));
             } catch (IOException e) {
                 log.error("Could not set local index path for {}. New URI: {}", repo.getId(), icf.getIndexPath());
             }
@@ -556,6 +556,33 @@ public class MavenIndexManager implements ArchivaIndexManager {
         return indexDirectory;
     }
 
+    private Path getPackedIndexPath(Repository repo) throws IOException {
+        IndexCreationFeature icf = repo.getFeature(IndexCreationFeature.class).get();
+        Path repoDir = repo.getLocalPath();
+        URI indexDir = icf.getPackedIndexPath();
+        Path indexDirectory = null;
+        if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
+        {
+
+            indexDirectory = PathUtil.getPathFromUri( indexDir );
+            // not absolute so create it in repository directory
+            if ( !indexDirectory.isAbsolute( ) )
+            {
+                indexDirectory = repoDir.resolve( indexDirectory );
+            }
+        }
+        else
+        {
+            indexDirectory = repoDir.resolve( DEFAULT_PACKED_INDEX_DIR );
+        }
+
+        if ( !Files.exists( indexDirectory ) )
+        {
+            Files.createDirectories( indexDirectory );
+        }
+        return indexDirectory;
+    }
+
     private IndexingContext createRemoteContext(RemoteRepository remoteRepository ) throws IOException
     {
         Path appServerBase = archivaConfiguration.getAppServerBaseDir( );
index 3ab65bcb23bef0ec31619d86e385f9a56bb1a765..2bb82d50d6b5b105c3dab11836668aa1f93f1ea7 100644 (file)
@@ -20,27 +20,19 @@ package org.apache.archiva.proxy;
  */
 
 import net.sf.ehcache.CacheManager;
-import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
 import org.apache.archiva.admin.repository.managed.DefaultManagedRepositoryAdmin;
-import org.apache.archiva.common.plexusbridge.PlexusSisuBridge;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.archiva.configuration.ProxyConnectorConfiguration;
 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
-import org.apache.archiva.policies.CachedFailuresPolicy;
-import org.apache.archiva.policies.ChecksumPolicy;
-import org.apache.archiva.policies.PropagateErrorsDownloadPolicy;
-import org.apache.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy;
-import org.apache.archiva.policies.ReleasesPolicy;
-import org.apache.archiva.policies.SnapshotsPolicy;
+import org.apache.archiva.policies.*;
 import org.apache.archiva.proxy.model.RepositoryProxyConnectors;
 import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.RepositoryContentProvider;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.maven2.MavenManagedRepository;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
-import org.apache.commons.io.FileUtils;
 import org.apache.maven.index.NexusIndexer;
 import org.apache.maven.index.context.IndexingContext;
 import org.apache.maven.wagon.Wagon;
@@ -124,10 +116,6 @@ public abstract class AbstractProxyTestCase
 
     WagonDelegate delegate;
 
-
-    @Inject
-    protected NexusIndexer nexusIndexer;
-
     @Before
     public void setUp()
         throws Exception
@@ -155,9 +143,6 @@ public abstract class AbstractProxyTestCase
 
         applicationContext.getBean( RepositoryRegistry.class ).putRepository( repoConfig );
 
-        // to prevent windauze file leaking
-        removeMavenIndexes();
-
         repositoryRegistry.setArchivaConfiguration( config );
 
         // Setup target (proxied to) repository.
@@ -199,25 +184,6 @@ public abstract class AbstractProxyTestCase
         log.info( "\n.\\ {}() \\._________________________________________\n", name );
     }
 
-    @After
-    public void shutdown()
-        throws Exception
-    {
-        removeMavenIndexes();
-    }
-
-
-    protected void removeMavenIndexes()
-        throws Exception
-    {
-
-        for ( IndexingContext indexingContext : nexusIndexer.getIndexingContexts().values() )
-        {
-            nexusIndexer.removeIndexingContext( indexingContext, false );
-        }
-    }
-
-
     protected void assertChecksums( Path expectedFile, String expectedSha1Contents, String expectedMd5Contents )
         throws Exception
     {
index 0f2ce93b81be0b36dcd39e3877632a5762e5fd7d..fb50b8421173dc1e898221a165c51de6385973b0 100644 (file)
@@ -54,6 +54,11 @@ public class AbstractRepository
 
     private String indexDirectory;
 
+    /*
+     * @since 3.0.0
+     */
+    private String packedIndexDirectory;
+
     private String toStringCache = null;
 
 
@@ -136,6 +141,7 @@ public class AbstractRepository
 
     public void setIndexDirectory( String indexDirectory )
     {
+        this.toStringCache=null;
         this.indexDirectory = indexDirectory;
     }
 
@@ -202,9 +208,19 @@ public class AbstractRepository
     }
 
     public void setType(String type) {
+        toStringCache=null;
         this.type = type;
     }
 
+    public String getPackedIndexDirectory() {
+        return packedIndexDirectory;
+    }
+
+    public void setPackedIndexDirectory(String packedIndexDirectory) {
+        toStringCache=null;
+        this.packedIndexDirectory = packedIndexDirectory;
+    }
+
     @Override
     public String toString()
     {
@@ -214,12 +230,13 @@ public class AbstractRepository
         {
             final StringBuilder sb = new StringBuilder( );
             sb.append( "AbstractRepository" );
-            sb.append( "{id='" ).append( id ).append( '\'' );
-            sb.append(", type='").append(type).append('\'');
-            sb.append( ", name='" ).append( getLocaleString( name ) ).append( '\'' );
-            sb.append( ", layout='" ).append( layout ).append( '\'' );
-            sb.append( ", indexDirectory='" ).append( indexDirectory ).append( '\'' );
-            sb.append( ", description='" ).append( getLocaleString( description ) ).append( '\'' );
+            sb.append( "{ id=\"" ).append( id ).append( '"' );
+            sb.append( ", type=\"").append(type).append('"');
+            sb.append( ", name=\"" ).append( getLocaleString( name ) ).append( '"' );
+            sb.append( ", layout=\"" ).append( layout ).append( '"' );
+            sb.append( ", indexDirectory=\"" ).append( indexDirectory ).append( '"' );
+            sb.append( ", packedIndexDirectory=\"").append(packedIndexDirectory).append('"');
+            sb.append( ", description=\"" ).append( getLocaleString( description ) ).append( '"' );
             sb.append( '}' );
             toStringCache=sb.toString( );
             return toStringCache;
index 1a8ccc712fb14cba437f91c01c0be2282598d267..8041817a58547dfd020ba8f2c89d9ef53d5236ac 100644 (file)
@@ -125,6 +125,7 @@ public abstract class AbstractRepositoryAdmin
         if (repo.supportsFeature( IndexCreationFeature.class )) {
             IndexCreationFeature icf = repo.getFeature( IndexCreationFeature.class ).get();
             adminRepo.setIndexDirectory( convertUriToString( icf.getIndexPath() ) );
+            adminRepo.setPackedIndexDirectory(convertUriToString(icf.getPackedIndexPath()));
         }
     }
 
@@ -134,6 +135,7 @@ public abstract class AbstractRepositoryAdmin
         repoConfig.setLayout( repo.getLayout() );
         repoConfig.setDescription( repo.getDescription() );
         repoConfig.setIndexDir( repo.getIndexDirectory() );
+        repoConfig.setPackedIndexDir(repo.getPackedIndexDirectory());
         repoConfig.setType( StringUtils.isEmpty( repo.getType() ) ? "MAVEN" : repo.getType() );
     }
 
index 9e47f1004e7bab331908dd5b133609dba198b3bf..7d87e048ff632be4f22dc384d133d73566ad0451 100644 (file)
@@ -145,7 +145,6 @@ public class DefaultManagedRepositoryAdmin
         adminRepo.setCronExpression( repo.getSchedulingDefinition() );
         if (repo.supportsFeature( IndexCreationFeature.class )) {
             IndexCreationFeature icf = repo.getFeature( IndexCreationFeature.class ).get();
-            adminRepo.setIndexDirectory(convertUriToString( icf.getIndexPath() ));
             adminRepo.setSkipPackedIndexCreation( icf.isSkipPackedIndexCreation() );
         }
         adminRepo.setScanned( repo.isScanned() );
@@ -180,6 +179,7 @@ public class DefaultManagedRepositoryAdmin
         repoConfig.setDeleteReleasedSnapshots( repo.isDeleteReleasedSnapshots() );
         repoConfig.setSkipPackedIndexCreation( repo.isSkipPackedIndexCreation());
         repoConfig.setStageRepoNeeded( repo.isStageRepoNeeded() );
+
         return repoConfig;
     }
 
index add16ee83c25684619bbd1634aa439eee0720902..6b063e36e8f1efb90cbe50781fb182ebbcaf2189 100644 (file)
@@ -216,6 +216,7 @@ public class DefaultRemoteRepositoryAdmin
         Configuration configuration = getArchivaConfiguration().getConfiguration();
         RemoteRepositoryConfiguration remoteRepositoryConfiguration =
             getRepositoryConfiguration( remoteRepository );
+        log.debug("Adding remote repo {}", remoteRepositoryConfiguration);
 
         try
         {
index dca455a7fdeb19a030d0a2f13a4d0f03865fc8bc..660f3e4ce883e6d6bb250872509397fa0d40e989 100644 (file)
@@ -133,4 +133,13 @@ public class RemoteIndexFeature implements RepositoryFeature<RemoteIndexFeature>
     public boolean hasIndex() {
         return this.indexUri!=null && !StringUtils.isEmpty( this.indexUri.getPath() );
     }
+
+    @Override
+    public String toString() {
+        StringBuilder str = new StringBuilder();
+        return str.append("RemoteIndexFeature:{downloadRemoteIndex=").append(downloadRemoteIndex)
+                .append(",indexURI=").append(indexUri)
+                .append(",downloadOnStartup=").append(downloadRemoteIndexOnStartup)
+                .append(",timeout=").append(downloadTimeout).append("}").toString();
+    }
 }
index 131aad664d7c672358373053eff14f513281cced..26a3fb50a1bf49c689493bec9bd300a07a73c8e5 100644 (file)
@@ -151,4 +151,10 @@ public abstract class AbstractRemoteRepository extends AbstractRepository implem
         return repositoryBase.resolve(getId());
     }
 
+    @Override
+    public String toString() {
+        StringBuilder str = new StringBuilder();
+        return str.append("checkPath=").append(checkPath)
+                .append(",creds:").append(credentials).toString();
+    }
 }
index 984a2f6f6553cae5e80e736d14bbf8fa9849c142..8843ce62308a0ded24e584405a5e097ef11dfded 100644 (file)
@@ -21,7 +21,6 @@ package org.apache.archiva.repository;
 
 import org.apache.archiva.configuration.*;
 import org.apache.archiva.indexer.*;
-import org.apache.archiva.metadata.model.facets.AuditEvent;
 import org.apache.archiva.redback.components.registry.RegistryException;
 import org.apache.archiva.repository.features.IndexCreationEvent;
 import org.apache.archiva.repository.features.IndexCreationFeature;
@@ -1017,7 +1016,7 @@ public class RepositoryRegistry implements ConfigurationListener, RepositoryEven
 
     @Override
     public <T> void raise(RepositoryEvent<T> event) {
-        if (event.getType().equals(IndexCreationEvent.Index.URI_CHANGE)) {
+        if (event instanceof IndexCreationEvent ) {
             if (managedRepositories.containsKey(event.getRepository().getId()) ||
                     remoteRepositories.containsKey(event.getRepository().getId())) {
                 EditableRepository repo = (EditableRepository) event.getRepository();
index 4893bcda8a745eb4b0b20f44bf4938d0f9c915d1..03a95be75db1c8c982d98351c0e7c38e29b137a0 100644 (file)
@@ -66,9 +66,6 @@ public class ArchivaIndexingTaskExecutor
     @Inject
     private ArtifactContextProducer artifactContextProducer;
 
-    @Inject
-    private ManagedRepositoryAdmin managedRepositoryAdmin;
-
     @Inject
     private NexusIndexer nexusIndexer;
 
@@ -241,23 +238,25 @@ public class ArchivaIndexingTaskExecutor
         try
         {
 
+            log.debug("Finishing indexing");
             context.optimize( );
 
             if ( repository.supportsFeature( IndexCreationFeature.class ) )
             {
                 IndexCreationFeature icf = repository.getFeature( IndexCreationFeature.class ).get( );
-                if ( !icf.isSkipPackedIndexCreation( ) )
+                if ( !icf.isSkipPackedIndexCreation( ) && icf.getLocalPackedIndexPath()!=null)
                 {
 
+                    log.debug("Creating packed index from {} on {}", context.getIndexDirectoryFile(), icf.getLocalPackedIndexPath());
                     IndexPackingRequest request = new IndexPackingRequest( context, //
                         context.acquireIndexSearcher( ).getIndexReader( ),
                         //
-                        context.getIndexDirectoryFile( ) );
+                        icf.getLocalPackedIndexPath().toFile() );
 
                     indexPacker.packIndex( request );
                     context.updateTimestamp( true );
 
-                    log.debug( "Index file packaged at '{}'.", context.getIndexDirectoryFile( ) );
+                    log.debug( "Index file packed at '{}'.", icf.getLocalPackedIndexPath() );
                 } else {
                     log.debug( "skip packed index creation" );
                 }
index d936bddd26d839d7b8cdfdb2136aa321e4ebd867..d5da807d9ef116a8a8dd7a53a6e7679437b0d8e8 100644 (file)
@@ -20,10 +20,7 @@ package org.apache.archiva.scheduler.indexing;
 
 import org.apache.archiva.admin.model.RepositoryAdminException;
 import org.apache.archiva.admin.model.beans.NetworkProxy;
-import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin;
-import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin;
-import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
 import org.apache.archiva.common.ArchivaException;
 import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException;
 import org.apache.archiva.configuration.ArchivaConfiguration;
@@ -34,7 +31,6 @@ import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.commons.lang.StringUtils;
-import org.apache.maven.index.NexusIndexer;
 import org.apache.maven.index.context.IndexingContext;
 import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
 import org.apache.maven.index.packer.IndexPacker;
@@ -46,7 +42,6 @@ import org.springframework.scheduling.support.CronTrigger;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Named;
 import java.io.IOException;
@@ -78,18 +73,9 @@ public class DefaultDownloadRemoteIndexScheduler
     @Inject
     private WagonFactory wagonFactory;
 
-    @Inject
-    private RemoteRepositoryAdmin remoteRepositoryAdmin;
-
-    @Inject
-    private ProxyConnectorAdmin proxyConnectorAdmin;
-
     @Inject
     private NetworkProxyAdmin networkProxyAdmin;
 
-    @Inject
-    private NexusIndexer nexusIndexer;
-
     @Inject
     private IndexUpdater indexUpdater;
 
@@ -101,8 +87,8 @@ public class DefaultDownloadRemoteIndexScheduler
 
     @PostConstruct
     public void startup()
-            throws ArchivaException, RepositoryAdminException, PlexusSisuBridgeException, IOException,
-            UnsupportedExistingLuceneIndexException, DownloadRemoteIndexException, UnsupportedBaseContextException {
+            throws
+            DownloadRemoteIndexException, UnsupportedBaseContextException {
         archivaConfiguration.addListener( this );
         // TODO add indexContexts even if null
 
@@ -129,22 +115,6 @@ public class DefaultDownloadRemoteIndexScheduler
 
     }
 
-    @PreDestroy
-    public void shutdown()
-        throws RepositoryAdminException, IOException
-    {
-        for ( RemoteRepository remoteRepository : remoteRepositoryAdmin.getRemoteRepositories() )
-        {
-            String contextKey = "remote-" + remoteRepository.getId();
-            IndexingContext context = nexusIndexer.getIndexingContexts().get( contextKey );
-            if ( context == null )
-            {
-                continue;
-            }
-            nexusIndexer.removeIndexingContext( context, false );
-        }
-    }
-
     @Override
     public void configurationEvent( ConfigurationEvent event )
     {
@@ -158,36 +128,41 @@ public class DefaultDownloadRemoteIndexScheduler
     {
         try
         {
-            RemoteRepository remoteRepository = remoteRepositoryAdmin.getRemoteRepository( repositoryId );
-            if ( remoteRepository == null )
+            org.apache.archiva.repository.RemoteRepository remoteRepo = repositoryRegistry.getRemoteRepository(repositoryId);
+
+            if ( remoteRepo == null )
             {
                 log.warn( "ignore scheduleDownloadRemote for repo with id {} as not exists", repositoryId );
                 return;
             }
+            if (!remoteRepo.supportsFeature(RemoteIndexFeature.class)) {
+                log.warn("ignore scheduleDownloadRemote for repo with id {}. Does not support remote index.", repositoryId);
+                return;
+            }
+            RemoteIndexFeature rif = remoteRepo.getFeature(RemoteIndexFeature.class).get();
             NetworkProxy networkProxy = null;
-            if ( StringUtils.isNotBlank( remoteRepository.getRemoteDownloadNetworkProxyId() ) )
+            if ( StringUtils.isNotBlank( rif.getProxyId() ) )
             {
-                networkProxy = networkProxyAdmin.getNetworkProxy( remoteRepository.getRemoteDownloadNetworkProxyId() );
+                networkProxy = networkProxyAdmin.getNetworkProxy( rif.getProxyId() );
                 if ( networkProxy == null )
                 {
                     log.warn(
                         "your remote repository is configured to download remote index trought a proxy we cannot find id:{}",
-                        remoteRepository.getRemoteDownloadNetworkProxyId() );
+                        rif.getProxyId() );
                 }
             }
 
             DownloadRemoteIndexTaskRequest downloadRemoteIndexTaskRequest = new DownloadRemoteIndexTaskRequest() //
-                .setRemoteRepository( remoteRepository ) //
+                .setRemoteRepository( remoteRepo ) //
                 .setNetworkProxy( networkProxy ) //
                 .setFullDownload( fullDownload ) //
                 .setWagonFactory( wagonFactory ) //
-                .setRemoteRepositoryAdmin( remoteRepositoryAdmin ) //
                 .setIndexUpdater( indexUpdater ) //
                 .setIndexPacker( this.indexPacker );
 
             if ( now )
             {
-                log.info( "schedule download remote index for repository {}", remoteRepository.getId() );
+                log.info( "schedule download remote index for repository {}", remoteRepo.getId() );
                 // do it now
                 taskScheduler.schedule(
                     new DownloadRemoteIndexTask( downloadRemoteIndexTaskRequest, this.runningRemoteDownloadIds ),
@@ -196,10 +171,10 @@ public class DefaultDownloadRemoteIndexScheduler
             else
             {
                 log.info( "schedule download remote index for repository {} with cron expression {}",
-                          remoteRepository.getId(), remoteRepository.getCronExpression() );
+                          remoteRepo.getId(), remoteRepo.getSchedulingDefinition());
                 try
                 {
-                    CronTrigger cronTrigger = new CronTrigger( remoteRepository.getCronExpression() );
+                    CronTrigger cronTrigger = new CronTrigger( remoteRepo.getSchedulingDefinition());
                     taskScheduler.schedule(
                         new DownloadRemoteIndexTask( downloadRemoteIndexTaskRequest, this.runningRemoteDownloadIds ),
                         cronTrigger );
@@ -209,11 +184,11 @@ public class DefaultDownloadRemoteIndexScheduler
                     log.warn( "Unable to schedule remote index download: {}", e.getLocalizedMessage() );
                 }
 
-                if ( remoteRepository.isDownloadRemoteIndexOnStartup() )
+                if ( rif.isDownloadRemoteIndexOnStartup() )
                 {
                     log.info(
                         "remote repository {} configured with downloadRemoteIndexOnStartup schedule now a download",
-                        remoteRepository.getId() );
+                        remoteRepo.getId() );
                     taskScheduler.schedule(
                         new DownloadRemoteIndexTask( downloadRemoteIndexTaskRequest, this.runningRemoteDownloadIds ),
                         new Date() );
index 96acdfb448cbcc2e7bf3b5b3cb587f805420929a..63c8b5e0d73d293d0044b76de8065edde3604b9d 100644 (file)
@@ -19,15 +19,22 @@ package org.apache.archiva.scheduler.indexing;
  */
 
 import org.apache.archiva.admin.model.beans.NetworkProxy;
-import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
 import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.proxy.common.WagonFactoryRequest;
+import org.apache.archiva.repository.PasswordCredentials;
+import org.apache.archiva.repository.RemoteRepository;
+import org.apache.archiva.repository.RepositoryException;
+import org.apache.archiva.repository.RepositoryType;
+import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.commons.lang.time.StopWatch;
+import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.maven.index.context.IndexingContext;
 import org.apache.maven.index.updater.IndexUpdateRequest;
+import org.apache.maven.index.updater.IndexUpdateResult;
 import org.apache.maven.index.updater.IndexUpdater;
 import org.apache.maven.index.updater.ResourceFetcher;
+import org.apache.maven.index_shaded.lucene.index.IndexNotFoundException;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
 import org.apache.maven.wagon.StreamWagon;
 import org.apache.maven.wagon.TransferFailedException;
@@ -65,8 +72,6 @@ public class DownloadRemoteIndexTask
 
     private RemoteRepository remoteRepository;
 
-    private RemoteRepositoryAdmin remoteRepositoryAdmin;
-
     private WagonFactory wagonFactory;
 
     private NetworkProxy networkProxy;
@@ -87,7 +92,6 @@ public class DownloadRemoteIndexTask
         this.fullDownload = downloadRemoteIndexTaskRequest.isFullDownload();
         this.runningRemoteDownloadIds = runningRemoteDownloadIds;
         this.indexUpdater = downloadRemoteIndexTaskRequest.getIndexUpdater();
-        this.remoteRepositoryAdmin = downloadRemoteIndexTaskRequest.getRemoteRepositoryAdmin();
     }
 
     @Override
@@ -112,8 +116,17 @@ public class DownloadRemoteIndexTask
         try
         {
             log.info( "start download remote index for remote repository {}", this.remoteRepository.getId() );
-            IndexingContext indexingContext = remoteRepositoryAdmin.createIndexContext( this.remoteRepository );
-
+            if (this.remoteRepository.getIndexingContext()==null) {
+                throw new IndexNotFoundException("No index context set for repository "+remoteRepository.getId());
+            }
+            if (this.remoteRepository.getType()!= RepositoryType.MAVEN) {
+                throw new RepositoryException("Bad repository type");
+            }
+            if (!this.remoteRepository.supportsFeature(RemoteIndexFeature.class)) {
+                throw new RepositoryException("Repository does not support RemotIndexFeature "+remoteRepository.getId());
+            }
+            RemoteIndexFeature rif = this.remoteRepository.getFeature(RemoteIndexFeature.class).get();
+            IndexingContext indexingContext = this.remoteRepository.getIndexingContext().getBaseContext(IndexingContext.class);
             // create a temp directory to download files
             tempIndexDirectory = Paths.get(indexingContext.getIndexDirectoryFile().getParent(), ".tmpIndex" );
             Path indexCacheDirectory = Paths.get( indexingContext.getIndexDirectoryFile().getParent(), ".indexCache" );
@@ -126,22 +139,22 @@ public class DownloadRemoteIndexTask
             tempIndexDirectory.toFile().deleteOnExit();
             String baseIndexUrl = indexingContext.getIndexUpdateUrl();
 
-            String wagonProtocol = new URL( this.remoteRepository.getUrl() ).getProtocol();
+            String wagonProtocol = this.remoteRepository.getLocation().getScheme();
 
             final StreamWagon wagon = (StreamWagon) wagonFactory.getWagon(
                 new WagonFactoryRequest( wagonProtocol, this.remoteRepository.getExtraHeaders() ).networkProxy(
                     this.networkProxy )
             );
             // FIXME olamy having 2 config values
-            wagon.setReadTimeout( remoteRepository.getRemoteDownloadTimeout() * 1000 );
-            wagon.setTimeout( remoteRepository.getTimeout() * 1000 );
+            wagon.setReadTimeout( (int)rif.getDownloadTimeout().toMillis());
+            wagon.setTimeout( (int)remoteRepository.getTimeout().toMillis());
 
             if ( wagon instanceof AbstractHttpClientWagon )
             {
                 HttpConfiguration httpConfiguration = new HttpConfiguration();
                 HttpMethodConfiguration httpMethodConfiguration = new HttpMethodConfiguration();
                 httpMethodConfiguration.setUsePreemptive( true );
-                httpMethodConfiguration.setReadTimeout( remoteRepository.getRemoteDownloadTimeout() * 1000 );
+                httpMethodConfiguration.setReadTimeout( (int)rif.getDownloadTimeout().toMillis() );
                 httpConfiguration.setGet( httpMethodConfiguration );
                 AbstractHttpClientWagon.class.cast( wagon ).setHttpConfiguration( httpConfiguration );
             }
@@ -158,12 +171,14 @@ public class DownloadRemoteIndexTask
                 proxyInfo.setPassword( this.networkProxy.getPassword() );
             }
             AuthenticationInfo authenticationInfo = null;
-            if ( this.remoteRepository.getUserName() != null )
+            if ( this.remoteRepository.getLoginCredentials()!=null && this.remoteRepository.getLoginCredentials() instanceof PasswordCredentials )
             {
+                PasswordCredentials creds = (PasswordCredentials) this.remoteRepository.getLoginCredentials();
                 authenticationInfo = new AuthenticationInfo();
-                authenticationInfo.setUserName( this.remoteRepository.getUserName() );
-                authenticationInfo.setPassword( this.remoteRepository.getPassword() );
+                authenticationInfo.setUserName( creds.getUsername());
+                authenticationInfo.setPassword( new String(creds.getPassword()) );
             }
+            log.debug("Connection to {}, authInfo={}", this.remoteRepository.getId(), authenticationInfo);
             wagon.connect( new Repository( this.remoteRepository.getId(), baseIndexUrl ), authenticationInfo,
                            proxyInfo );
 
@@ -172,6 +187,8 @@ public class DownloadRemoteIndexTask
             {
                 Files.createDirectories( indexDirectory );
             }
+            log.debug("Downloading index file to {}", indexDirectory);
+            log.debug("Index cache dir {}", indexCacheDirectory);
 
             ResourceFetcher resourceFetcher =
                 new WagonResourceFetcher( log, tempIndexDirectory, wagon, remoteRepository );
@@ -179,10 +196,11 @@ public class DownloadRemoteIndexTask
             request.setForceFullUpdate( this.fullDownload );
             request.setLocalIndexCacheDir( indexCacheDirectory.toFile() );
 
-            this.indexUpdater.fetchAndUpdateIndex( request );
+            IndexUpdateResult result = this.indexUpdater.fetchAndUpdateIndex(request);
+            log.debug("Update result success: {}", result.isSuccessful());
             stopWatch.stop();
-            log.info( "time update index from remote for repository {}: {} s", this.remoteRepository.getId(),
-                      ( stopWatch.getTime() / 1000 ) );
+            log.info( "time update index from remote for repository {}: {}ms", this.remoteRepository.getId(),
+                      ( stopWatch.getTime() ) );
 
             // index packing optionnal ??
             //IndexPackingRequest indexPackingRequest =
@@ -241,6 +259,7 @@ public class DownloadRemoteIndexTask
         {
             this.totalLength = 0;
             resourceName = transferEvent.getResource().getName();
+            log.info("Transferring: {}, {}",  transferEvent.getResource().getContentLength(), transferEvent.getLocalFile().toString());
             log.info( "start transfer of {}", transferEvent.getResource().getName() );
         }
 
@@ -256,8 +275,8 @@ public class DownloadRemoteIndexTask
         {
             resourceName = transferEvent.getResource().getName();
             long endTime = System.currentTimeMillis();
-            log.info( "end of transfer file {} {} kb: {}s", transferEvent.getResource().getName(),
-                      this.totalLength / 1024, ( endTime - startTime ) / 1000 );
+            log.info( "end of transfer file {}: {}b, {}ms", transferEvent.getResource().getName(),
+                      this.totalLength, ( endTime - startTime ) );
         }
 
         @Override
index f797ac4ab007f07ace9df1061f7c2ac4561654a1..9c5223c7a51181e93fc4b90a9f8f5777e7f8f308 100644 (file)
@@ -19,9 +19,9 @@ package org.apache.archiva.scheduler.indexing;
  */
 
 import org.apache.archiva.admin.model.beans.NetworkProxy;
-import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
 import org.apache.archiva.proxy.common.WagonFactory;
+import org.apache.archiva.repository.RemoteRepository;
 import org.apache.maven.index.packer.IndexPacker;
 import org.apache.maven.index.updater.IndexUpdater;
 
@@ -33,8 +33,6 @@ public class DownloadRemoteIndexTaskRequest
 {
     private RemoteRepository remoteRepository;
 
-    private RemoteRepositoryAdmin remoteRepositoryAdmin;
-
     private WagonFactory wagonFactory;
 
     private NetworkProxy networkProxy;
@@ -106,17 +104,6 @@ public class DownloadRemoteIndexTaskRequest
         return this;
     }
 
-    public RemoteRepositoryAdmin getRemoteRepositoryAdmin()
-    {
-        return remoteRepositoryAdmin;
-    }
-
-    public DownloadRemoteIndexTaskRequest setRemoteRepositoryAdmin( RemoteRepositoryAdmin remoteRepositoryAdmin )
-    {
-        this.remoteRepositoryAdmin = remoteRepositoryAdmin;
-        return this;
-    }
-
     public IndexPacker getIndexPacker()
     {
         return indexPacker;
index ebfcb5546a0e4c112979c4d70bcf584b3e231b4b..2cc9af6fa324e2a75b20c84e9e29eadf4ddd60c5 100644 (file)
@@ -160,7 +160,7 @@ public class ArchivaIndexingTaskExecutorTest
         FlatSearchResponse response = indexer.searchFlat( request );
 
         assertTrue( Files.exists(basePath.resolve( ".indexer" )) );
-        assertFalse( Files.exists(basePath.resolve(".index" )) );
+        assertTrue( Files.exists(basePath.resolve(".index" )) );
         assertEquals( 1, response.getTotalHits() );
 
         Set<ArtifactInfo> results = response.getResults();
@@ -204,7 +204,7 @@ public class ArchivaIndexingTaskExecutorTest
         ctx.releaseIndexSearcher( searcher );
 
         assertTrue( Files.exists(basePath.resolve(".indexer" )) );
-        assertFalse( Files.exists(basePath.resolve(".index" )) );
+        assertTrue( Files.exists(basePath.resolve(".index" )) );
 
         // should only return 1 hit!
         assertEquals( 1, topDocs.totalHits );
@@ -239,7 +239,7 @@ public class ArchivaIndexingTaskExecutorTest
         FlatSearchResponse response = indexer.searchFlat( flatSearchRequest );
 
         assertTrue( Files.exists(basePath.resolve(".indexer" )) );
-        assertFalse( Files.exists(basePath.resolve( ".index" )) );
+        assertTrue( Files.exists(basePath.resolve( ".index" )) );
 
         // should return 1 hit
         assertEquals( 1, response.getTotalHitsCount() );
@@ -261,7 +261,7 @@ public class ArchivaIndexingTaskExecutorTest
                BooleanClause.Occur.SHOULD );
 
         assertTrue( Files.exists(basePath.resolve( ".indexer" )) );
-        assertFalse( Files.exists(basePath.resolve(".index" )) );
+        assertTrue( Files.exists(basePath.resolve(".index" )) );
 
         flatSearchRequest = new FlatSearchRequest( q, getIndexingContext() );
 
@@ -278,9 +278,9 @@ public class ArchivaIndexingTaskExecutorTest
     {
 
         Path basePath = PathUtil.getPathFromUri( repositoryConfig.getLocation());
-        Path indexerDirectory =basePath.resolve( ".indexer" );
+        Path indexDirectory = basePath.resolve(".index");
 
-        Files.list(indexerDirectory).filter( path -> path.getFileName().toString().startsWith("nexus-maven-repository-index") )
+        Files.list(indexDirectory).filter( path -> path.getFileName().toString().startsWith("nexus-maven-repository-index") )
             .forEach( path ->
             {
                 try
@@ -311,19 +311,19 @@ public class ArchivaIndexingTaskExecutorTest
 
         indexingExecutor.executeTask( task );
 
-        assertTrue( Files.exists(indexerDirectory) );
+        assertTrue( Files.exists(indexDirectory) );
 
         // test packed index file creation
         //no more zip
         //Assertions.assertThat(new File( indexerDirectory, "nexus-maven-repository-index.zip" )).exists();
-        Assertions.assertThat( Files.exists(indexerDirectory.resolve("nexus-maven-repository-index.properties" ) ));
-        Assertions.assertThat( Files.exists(indexerDirectory.resolve("nexus-maven-repository-index.gz" ) ));
+        Assertions.assertThat( Files.exists(indexDirectory.resolve("nexus-maven-repository-index.properties" ) ));
+        Assertions.assertThat( Files.exists(indexDirectory.resolve("nexus-maven-repository-index.gz" ) ));
 
         // unpack .zip index
-        Path destDir = basePath.resolve( ".indexer/tmp" );
+        Path destDir = basePath.resolve( ".index/tmp" );
         //unzipIndex( indexerDirectory.getPath(), destDir.getPath() );
 
-        DefaultIndexUpdater.FileFetcher fetcher = new DefaultIndexUpdater.FileFetcher( indexerDirectory.toFile() );
+        DefaultIndexUpdater.FileFetcher fetcher = new DefaultIndexUpdater.FileFetcher( indexDirectory.toFile() );
         IndexUpdateRequest updateRequest = new IndexUpdateRequest( getIndexingContext(), fetcher );
         //updateRequest.setLocalIndexCacheDir( indexerDirectory );
         indexUpdater.fetchAndUpdateIndex( updateRequest );
index c4247c0f088ec063f60cbd98b2cc8816980b579f..bb4e949fd81c6f017f2ee8b9f0886172e67967be 100644 (file)
@@ -447,8 +447,11 @@ public abstract class AbstractArchivaRestTest
         }
 
         managedRepository.setLocation( Paths.get( repoPath ).toString() );
+        String suffix = Long.toString( new Date().getTime() );
+        String baseDir = System.getProperty("java.io.tmpdir");
         managedRepository.setIndexDirectory(
-            System.getProperty( "java.io.tmpdir" ) + "/.index-" + Long.toString( new Date().getTime() ) );
+            baseDir + "/.indexer-" + suffix );
+        managedRepository.setPackedIndexDirectory(baseDir + "/.index-" + suffix);
 
         managedRepository.setStageRepoNeeded( stageNeeded );
         managedRepository.setSnapshots( true );
index f870d42f672e07fb4523d3f4a3e2c6ad3fd7d76e..36b96f4ad640ff3686f9d575098a9e1ebc3fc7f3 100644 (file)
@@ -161,7 +161,7 @@ public class DownloadMergedIndexTest
         remoteRepository.setName( "all-merged" );
         remoteRepository.setDownloadRemoteIndex( true );
         remoteRepository.setUrl( "http://localhost:" + port + "/repository/test-group" );
-        remoteRepository.setRemoteIndexUrl( "http://localhost:" + port + "/repository/test-group/.indexer" );
+        remoteRepository.setRemoteIndexUrl( "http://localhost:" + port + "/repository/test-group/.index" );
         remoteRepository.setUserName( RedbackRoleConstants.ADMINISTRATOR_ACCOUNT_NAME );
         remoteRepository.setPassword( FakeCreateAdminService.ADMIN_TEST_PWD );
 
index 55305ca091aa2d943317182a857071cd1c310dc6..15b212e8e813feaab433be78b1618114c596fad7 100644 (file)
@@ -108,5 +108,8 @@ public class MavenRemoteRepository extends AbstractRemoteRepository
         }
     }
 
-
+    @Override
+    public String toString() {
+        return super.toString()+", remoteIndexFeature="+remoteIndexFeature.toString()+", indexCreationFeature="+indexCreationFeature.toString();
+    }
 }
index f50d7259e1d90ad05fffc6b2cba17fe17fcb9da9..c779baa42b448de02cb3a173084cf7a3109506a1 100644 (file)
@@ -150,6 +150,9 @@ public class MavenRepositoryProvider implements RepositoryProvider {
         IndexCreationFeature indexCreationFeature = repo.getFeature(IndexCreationFeature.class).get();
         indexCreationFeature.setSkipPackedIndexCreation(cfg.isSkipPackedIndexCreation());
         indexCreationFeature.setIndexPath(getURIFromString(cfg.getIndexDir()));
+        indexCreationFeature.setPackedIndexPath(getURIFromString(cfg.getPackedIndexDir()));
+        /* -> Should be created by MavenIndexProvider
+
         Path indexPath;
         if (indexCreationFeature.getIndexPath().getScheme() == null) {
             indexPath = Paths.get(indexCreationFeature.getIndexPath().getPath());
@@ -167,7 +170,7 @@ public class MavenRepositoryProvider implements RepositoryProvider {
         } catch (IOException e) {
             log.error("Could not create index directory {}", absoluteIndexPath);
             throw new RepositoryException("Could not create index directory " + absoluteIndexPath);
-        }
+        }*/
 
         ArtifactCleanupFeature artifactCleanupFeature = repo.getFeature(ArtifactCleanupFeature.class).get();
 
@@ -237,10 +240,14 @@ public class MavenRepositoryProvider implements RepositoryProvider {
         } else {
             credentials.setPassword(new char[0]);
         }
+        IndexCreationFeature indexCreationFeature = repo.getFeature(IndexCreationFeature.class).get();
         if (cfg.getIndexDir() != null) {
-            IndexCreationFeature indexCreationFeature = repo.getFeature(IndexCreationFeature.class).get();
             indexCreationFeature.setIndexPath(getURIFromString(cfg.getIndexDir()));
         }
+        if (cfg.getPackedIndexDir() != null) {
+            indexCreationFeature.setPackedIndexPath(getURIFromString(cfg.getPackedIndexDir()));
+        }
+        log.debug("Updated remote instance {}", repo);
     }
 
     @Override
@@ -272,6 +279,7 @@ public class MavenRepositoryProvider implements RepositoryProvider {
 
         IndexCreationFeature indexCreationFeature = remoteRepository.getFeature(IndexCreationFeature.class).get();
         cfg.setIndexDir(convertUriToPath(indexCreationFeature.getIndexPath()));
+        cfg.setPackedIndexDir(convertUriToPath(indexCreationFeature.getPackedIndexPath()));
 
         RemoteIndexFeature remoteIndexFeature = remoteRepository.getFeature(RemoteIndexFeature.class).get();
         cfg.setRemoteIndexUrl(remoteIndexFeature.getIndexUri().toString());
@@ -305,6 +313,7 @@ public class MavenRepositoryProvider implements RepositoryProvider {
         cfg.setStageRepoNeeded(stagingRepositoryFeature.isStageRepoNeeded());
         IndexCreationFeature indexCreationFeature = managedRepository.getFeature(IndexCreationFeature.class).get();
         cfg.setIndexDir(convertUriToPath(indexCreationFeature.getIndexPath()));
+        cfg.setPackedIndexDir(convertUriToPath(indexCreationFeature.getPackedIndexPath()));
         cfg.setSkipPackedIndexCreation(indexCreationFeature.isSkipPackedIndexCreation());
 
         ArtifactCleanupFeature artifactCleanupFeature = managedRepository.getFeature(ArtifactCleanupFeature.class).get();
@@ -345,7 +354,7 @@ public class MavenRepositoryProvider implements RepositoryProvider {
             try {
                 indexDir = Paths.get(new URI(repository.getIndexDir().startsWith("file://") ? repository.getIndexDir() : "file://" + repository.getIndexDir()));
                 if (indexDir.isAbsolute()) {
-                    Path newDir = Paths.get(new URI(stagingRepository.getLocation().startsWith("file://") ? stagingRepository.getLocation() : "file://" + stagingRepository.getLocation())).resolve(".index");
+                    Path newDir = indexDir.getParent().resolve(indexDir.getFileName() + StagingRepositoryFeature.STAGING_REPO_POSTFIX);
                     log.debug("Changing index directory {} -> {}", indexDir, newDir);
                     stagingRepository.setIndexDir(newDir.toString());
                 } else {
@@ -358,6 +367,24 @@ public class MavenRepositoryProvider implements RepositoryProvider {
             }
             // in case of absolute dir do not use the same
         }
+        if (StringUtils.isNotBlank(repository.getPackedIndexDir())) {
+            Path packedIndexDir = null;
+            try {
+                packedIndexDir = Paths.get(new URI(repository.getPackedIndexDir().startsWith("file://") ? repository.getPackedIndexDir() : "file://" + repository.getPackedIndexDir()));
+                if (packedIndexDir.isAbsolute()) {
+                    Path newDir = packedIndexDir.getParent().resolve(packedIndexDir.getFileName() + StagingRepositoryFeature.STAGING_REPO_POSTFIX);
+                    log.debug("Changing index directory {} -> {}", packedIndexDir, newDir);
+                    stagingRepository.setPackedIndexDir(newDir.toString());
+                } else {
+                    log.debug("Keeping index directory {}", repository.getPackedIndexDir());
+                    stagingRepository.setPackedIndexDir(repository.getPackedIndexDir());
+                }
+            } catch (URISyntaxException e) {
+                log.error("Could not parse index path as uri {}", repository.getPackedIndexDir());
+                stagingRepository.setPackedIndexDir("");
+            }
+            // in case of absolute dir do not use the same
+        }
         stagingRepository.setRefreshCronExpression(repository.getRefreshCronExpression());
         stagingRepository.setReleases(repository.isReleases());
         stagingRepository.setRetentionCount(repository.getRetentionCount());