Repository: archiva
Updated Branches:
  refs/heads/master e2eb9fe94 -> c544376af


http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
 
b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
index 0e5a37f..46dec05 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
@@ -20,6 +20,7 @@ package org.apache.archiva.repository.maven2;
  */
 
 import org.apache.archiva.common.utils.PathUtil;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.repository.AbstractManagedRepository;
 import org.apache.archiva.repository.ReleaseScheme;
 import org.apache.archiva.repository.RepositoryCapabilities;
@@ -54,9 +55,11 @@ public class MavenManagedRepository extends 
AbstractManagedRepository
     public static final String DEFAULT_LAYOUT = "default";
     public static final String LEGACY_LAYOUT = "legacy";
     private ArtifactCleanupFeature artifactCleanupFeature = new 
ArtifactCleanupFeature( );
-    private IndexCreationFeature indexCreationFeature = new 
IndexCreationFeature(  );
+    private IndexCreationFeature indexCreationFeature;
     private StagingRepositoryFeature stagingRepositoryFeature = new 
StagingRepositoryFeature(  );
 
+    
+
     private static final RepositoryCapabilities CAPABILITIES = new 
StandardCapabilities(
         new ReleaseScheme[] { ReleaseScheme.RELEASE, ReleaseScheme.SNAPSHOT },
         new String[] { DEFAULT_LAYOUT, LEGACY_LAYOUT},
@@ -73,6 +76,7 @@ public class MavenManagedRepository extends 
AbstractManagedRepository
     public MavenManagedRepository( String id, String name, Path basePath )
     {
         super( RepositoryType.MAVEN, id, name, basePath);
+        this.indexCreationFeature = new IndexCreationFeature(id, this);
     }
 
     public MavenManagedRepository( Locale primaryLocale, String id, String 
name, Path basePath )
@@ -134,4 +138,5 @@ public class MavenManagedRepository extends 
AbstractManagedRepository
             }
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
 
b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
index c857196..f549e46 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
@@ -1,5 +1,6 @@
 package org.apache.archiva.repository.maven2;
 
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.repository.AbstractRemoteRepository;
 import org.apache.archiva.repository.ReleaseScheme;
 import org.apache.archiva.repository.RemoteRepository;
@@ -10,7 +11,10 @@ import 
org.apache.archiva.repository.UnsupportedFeatureException;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.archiva.repository.features.RepositoryFeature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Locale;
 
@@ -39,8 +43,11 @@ import java.util.Locale;
 public class MavenRemoteRepository extends AbstractRemoteRepository
     implements RemoteRepository
 {
+
+    Logger log = LoggerFactory.getLogger(MavenRemoteRepository.class);
+
     final private RemoteIndexFeature remoteIndexFeature = new 
RemoteIndexFeature();
-    final private IndexCreationFeature indexCreationFeature = new 
IndexCreationFeature(  );
+    final private IndexCreationFeature indexCreationFeature;
 
     private static final RepositoryCapabilities CAPABILITIES = new 
StandardCapabilities(
         new ReleaseScheme[] { ReleaseScheme.RELEASE, ReleaseScheme.SNAPSHOT },
@@ -57,11 +64,14 @@ public class MavenRemoteRepository extends 
AbstractRemoteRepository
     public MavenRemoteRepository( String id, String name, Path basePath )
     {
         super( RepositoryType.MAVEN, id, name, basePath );
+        this.indexCreationFeature = new IndexCreationFeature(id, this);
+
     }
 
     public MavenRemoteRepository( Locale primaryLocale, String id, String 
name, Path basePath )
     {
         super( primaryLocale, RepositoryType.MAVEN, id, name, basePath );
+        this.indexCreationFeature = new IndexCreationFeature(id, this);
     }
 
     @Override
@@ -97,4 +107,6 @@ public class MavenRemoteRepository extends 
AbstractRemoteRepository
             return false;
         }
     }
+
+
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
 
b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
index 331f44b..f50d725 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
@@ -24,18 +24,7 @@ import 
org.apache.archiva.configuration.AbstractRepositoryConfiguration;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
-import org.apache.archiva.repository.EditableManagedRepository;
-import org.apache.archiva.repository.EditableRemoteRepository;
-import org.apache.archiva.repository.EditableRepository;
-import org.apache.archiva.repository.ManagedRepository;
-import org.apache.archiva.repository.PasswordCredentials;
-import org.apache.archiva.repository.ReleaseScheme;
-import org.apache.archiva.repository.RemoteRepository;
-import org.apache.archiva.repository.RepositoryCredentials;
-import org.apache.archiva.repository.RepositoryException;
-import org.apache.archiva.repository.RepositoryProvider;
-import org.apache.archiva.repository.RepositoryType;
-import org.apache.archiva.repository.UnsupportedURIException;
+import org.apache.archiva.repository.*;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
@@ -298,7 +287,7 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
 
     @Override
     public ManagedRepositoryConfiguration 
getManagedConfiguration(ManagedRepository managedRepository) throws 
RepositoryException {
-        if (!(managedRepository instanceof MavenManagedRepository)) {
+        if (!(managedRepository instanceof MavenManagedRepository || 
managedRepository instanceof BasicManagedRepository)) {
             log.error("Wrong remote repository type " + 
managedRepository.getClass().getName());
             throw new RepositoryException("The given repository type cannot be 
handled by the maven provider: " + managedRepository.getClass().getName());
         }
@@ -397,4 +386,9 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
     public void setArchivaConfiguration(ArchivaConfiguration 
archivaConfiguration) {
         this.archivaConfiguration = archivaConfiguration;
     }
+
+    @Override
+    public <T> void raise(RepositoryEvent<T> event) {
+        //
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/MockRepoAdmin.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/MockRepoAdmin.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/MockRepoAdmin.java
index 450cee5..c6fa3cc 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/MockRepoAdmin.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/MockRepoAdmin.java
@@ -30,6 +30,7 @@ import 
org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin;
 import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin;
 import 
org.apache.archiva.admin.model.proxyconnector.ProxyConnectorOrderComparator;
 import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.index.context.IndexingContext;
 import org.modelmapper.ModelMapper;
@@ -189,18 +190,6 @@ public class MockRepoAdmin
         return null;  //To change body of implemented methods use File | 
Settings | File Templates.
     }
 
-    @Override
-    public IndexingContext createIndexContext( ManagedRepository repository )
-        throws RepositoryAdminException
-    {
-        return null;  //To change body of implemented methods use File | 
Settings | File Templates.
-    }
-
-    @Override
-    public IndexingContext createIndexContext( 
org.apache.archiva.repository.ManagedRepository repository ) throws 
RepositoryAdminException
-    {
-        return null;
-    }
 
     @Override
     public List<ProxyConnector> getProxyConnectors()

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
index 4a55180..95084a5 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
@@ -107,7 +107,7 @@ public class TestConfiguration
 
     @Override
     public Path getRepositoryBaseDir() {
-        return getDataDirectory().resolve("repositories");
+        return getDataDirectory().resolve("");
     }
 
     @Override
@@ -117,10 +117,11 @@ public class TestConfiguration
 
     @Override
     public Path getDataDirectory() {
-        if (configuration!=null && 
StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory()))
 {
+        if (configuration!=null && 
configuration.getArchivaRuntimeConfiguration()!=null &&
+                
StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory()))
 {
             return 
Paths.get(configuration.getArchivaRuntimeConfiguration().getDataDirectory());
         } else {
-            return getAppServerBaseDir().resolve("data");
+            return getAppServerBaseDir().resolve("");
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
index ebb2677..ff52b6c 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411RepoGroupTest.java
@@ -27,6 +27,7 @@ import org.apache.archiva.metadata.repository.filter.Filter;
 import org.apache.archiva.metadata.repository.storage.ReadMetadataRequest;
 import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.proxy.common.WagonFactoryRequest;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
 import org.apache.commons.io.FileUtils;
 import org.apache.maven.wagon.Wagon;
@@ -88,6 +89,9 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
     @Named ( "archivaConfiguration#default" )
     private ArchivaConfiguration configuration;
 
+    @Inject
+    RepositoryRegistry repositoryRegistry;
+
     private WagonFactory wagonFactory;
 
     ManagedRepositoryConfiguration testRepo;
@@ -149,6 +153,7 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
         c.addRepositoryGroup( repoGroup );
 
         configuration.save( c );
+        repositoryRegistry.reload();
 
         assertFalse( c.getManagedRepositories().get( 0 ).isSnapshots() );
         assertTrue( c.getManagedRepositories().get( 0 ).isReleases() );
@@ -169,8 +174,12 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
     public void testGetProjectVersionMetadataWithParentSuccessful()
         throws Exception
     {
-        copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-artifact-module-a",
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-module-a",
                                     
"target/test-repository/com/example/test/test-artifact-module-a" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-root",
+                "target/test-repository/com/example/test/test-artifact-root" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-parent",
+                "target/test-repository/com/example/test/test-artifact-parent" 
);
 
         ReadMetadataRequest readMetadataRequest =
             new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( 
"com.example.test" ).projectId(
@@ -221,8 +230,12 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
 
         configuration.save( config );
 
-        copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-artifact-module-a",
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-module-a",
                                     
"target/test-repository/com/example/test/test-artifact-module-a" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-root",
+                "target/test-repository/com/example/test/test-artifact-root" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-parent",
+                "target/test-repository/com/example/test/test-artifact-parent" 
);
 
         ReadMetadataRequest readMetadataRequest =
             new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( 
"com.example.test" ).projectId(
@@ -248,7 +261,7 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
     public void testGetProjectVersionMetadataWithParentNotInAnyRemoteRepo()
         throws Exception
     {
-        copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-artifact-module-a",
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-module-a",
                                     
"target/test-repository/com/example/test/test-artifact-module-a" );
 
         ReadMetadataRequest readMetadataRequest =
@@ -281,6 +294,8 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
                                     
"target/test-repositorys/com/example/test/test-snapshot-artifact-module-a" );
         copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-snapshot-artifact-root",
                                     
"target/test-repositorys/com/example/test/test-snapshot-artifact-root" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-parent",
+                
"target/test-repositorys/com/example/test/test-artifact-parent" );
 
         ReadMetadataRequest readMetadataRequest =
             new ReadMetadataRequest( TEST_SNAP_REPO_ID, "com.example.test", 
"test-snapshot-artifact-module-a",
@@ -324,6 +339,10 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
     {
         copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-snapshot-artifact-module-a",
                                     
"target/test-repositorys/com/example/test/test-snapshot-artifact-module-a" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-parent",
+                
"target/test-repositorys/com/example/test/test-artifact-parent" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-snapshot-artifact-root",
+                
"target/test-repositorys/com/example/test/test-snapshot-artifact-root" );
 
         ReadMetadataRequest readMetadataRequest =
             new ReadMetadataRequest().repositoryId( TEST_SNAP_REPO_ID 
).namespace( "com.example.test" ).projectId(
@@ -365,8 +384,10 @@ public class 
Maven2RepositoryMetadataResolverMRM1411RepoGroupTest
     public void 
testGetProjectVersionMetadataWithParentSnapshotVersionAndSnapNotAllowed2()
         throws Exception
     {
-        copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-artifact-module-b",
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-artifact-module-b",
                                     
"target/test-repository/com/example/test/test-artifact-module-b" );
+        copyTestArtifactWithParent( 
"src/test/resources/com/example/test/test-snapshot-artifact-root",
+                
"target/test-repositorys/com/example/test/test-snapshot-artifact-root" );
 
         ReadMetadataRequest readMetadataRequest =
             new ReadMetadataRequest().repositoryId( TEST_REPO_ID ).namespace( 
"com.example.test" ).projectId(

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
index d7678ed..6bc69f4 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverMRM1411Test.java
@@ -28,6 +28,7 @@ import 
org.apache.archiva.metadata.repository.storage.ReadMetadataRequest;
 import 
org.apache.archiva.metadata.repository.storage.RepositoryStorageRuntimeException;
 import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.proxy.common.WagonFactoryRequest;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
 import org.apache.commons.io.FileUtils;
 import org.apache.maven.wagon.Wagon;
@@ -85,6 +86,9 @@ public class Maven2RepositoryMetadataResolverMRM1411Test
     @Named ( "archivaConfiguration#default" )
     private ArchivaConfiguration configuration;
 
+    @Inject
+    RepositoryRegistry repositoryRegistry;
+
     private WagonFactory wagonFactory;
 
     ManagedRepositoryConfiguration testRepo;
@@ -122,6 +126,8 @@ public class Maven2RepositoryMetadataResolverMRM1411Test
 
         configuration.save( c );
 
+        repositoryRegistry.reload();
+
         assertTrue( c.getManagedRepositories().get( 0 ).isSnapshots() );
         assertTrue( c.getManagedRepositories().get( 0 ).isReleases() );
 
@@ -288,6 +294,7 @@ public class Maven2RepositoryMetadataResolverMRM1411Test
     {
         testRepo.setSnapshots( false );
         configuration.save( c );
+        repositoryRegistry.reload();
         assertFalse( c.getManagedRepositories().get( 0 ).isSnapshots() );
         copyTestArtifactWithParent( 
"target/test-classes/com/example/test/test-snapshot-artifact-module-a",
                                     
"target/test-repository/com/example/test/test-snapshot-artifact-module-a" );

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedReleaseTest.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedReleaseTest.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedReleaseTest.java
index c2549ac..bda26dc 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedReleaseTest.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedReleaseTest.java
@@ -25,6 +25,7 @@ import org.apache.archiva.metadata.repository.filter.Filter;
 import org.apache.archiva.metadata.repository.storage.ReadMetadataRequest;
 import 
org.apache.archiva.metadata.repository.storage.RepositoryStorageRuntimeException;
 import org.apache.archiva.proxy.common.WagonFactory;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -41,6 +42,9 @@ public class 
Maven2RepositoryMetadataResolverManagedReleaseTest
     @Named ( "repositoryStorage#maven2")
     private Maven2RepositoryStorage storage;
 
+    @Inject
+    RepositoryRegistry repositoryRegistry;
+
     private static final String TEST_REPO_ID = "test";
 
     private static final String TEST_REMOTE_REPO_ID = "central";
@@ -75,6 +79,8 @@ public class 
Maven2RepositoryMetadataResolverManagedReleaseTest
 
         configuration.save( c );
 
+        repositoryRegistry.reload();
+
         assertFalse( c.getManagedRepositories().get( 0 ).isSnapshots() );
         assertTrue( c.getManagedRepositories().get( 0 ).isReleases() );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedSnapshotTest.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedSnapshotTest.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedSnapshotTest.java
index dbbe8e8..03a67cd 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedSnapshotTest.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverManagedSnapshotTest.java
@@ -24,6 +24,7 @@ import 
org.apache.archiva.metadata.repository.filter.AllFilter;
 import org.apache.archiva.metadata.repository.filter.Filter;
 import org.apache.archiva.metadata.repository.storage.ReadMetadataRequest;
 import 
org.apache.archiva.metadata.repository.storage.RepositoryStorageRuntimeException;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -39,6 +40,9 @@ public class 
Maven2RepositoryMetadataResolverManagedSnapshotTest
     @Named ( "repositoryStorage#maven2")
     private Maven2RepositoryStorage storage;
 
+    @Inject
+    RepositoryRegistry repositoryRegistry;
+
     private static final String TEST_REPO_ID = "test";
 
     private static final String TEST_REMOTE_REPO_ID = "central";
@@ -73,6 +77,8 @@ public class 
Maven2RepositoryMetadataResolverManagedSnapshotTest
 
         configuration.save( c );
 
+        repositoryRegistry.reload();
+
         assertTrue( c.getManagedRepositories().get( 0 ).isSnapshots() );
         assertFalse( c.getManagedRepositories().get( 0 ).isReleases() );
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
index 24ce464..18ae3cd 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
@@ -31,6 +31,7 @@ import 
org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataI
 import 
org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException;
 import org.apache.archiva.proxy.common.WagonFactory;
 import org.apache.archiva.proxy.common.WagonFactoryRequest;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
 import org.apache.commons.io.FileUtils;
 import org.apache.maven.wagon.Wagon;
@@ -63,6 +64,9 @@ public class Maven2RepositoryMetadataResolverTest
     @Named ( "repositoryStorage#maven2" )
     private Maven2RepositoryStorage storage;
 
+    @Inject
+    RepositoryRegistry repositoryRegistry;
+
     private static final String TEST_REPO_ID = "test";
 
     private static final String TEST_REMOTE_REPO_ID = "central";
@@ -101,6 +105,8 @@ public class Maven2RepositoryMetadataResolverTest
         super.setUp();
 
         c = new Configuration();
+
+        c.setVersion("2.0");
         testRepo = new ManagedRepositoryConfiguration();
         testRepo.setId( TEST_REPO_ID );
         testRepo.setLocation( Paths.get( "target/test-repository" 
).toAbsolutePath().toString() );
@@ -122,7 +128,12 @@ public class Maven2RepositoryMetadataResolverTest
         proxyConnector.setDisabled( false );
         c.addProxyConnector( proxyConnector );
 
+        RepositoryScanningConfiguration scCfg = new 
RepositoryScanningConfiguration();
+        c.setRepositoryScanning(scCfg);
+
         configuration.save( c );
+        assertFalse(configuration.isDefaulted());
+        repositoryRegistry.reload();
 
         assertTrue( c.getManagedRepositories().get( 0 ).isSnapshots() );
         assertTrue( c.getManagedRepositories().get( 0 ).isReleases() );
@@ -553,7 +564,7 @@ public class Maven2RepositoryMetadataResolverTest
     public void testGetRootNamespaces()
         throws Exception
     {
-        assertEquals( Arrays.asList( "com", "org" ), 
storage.listRootNamespaces( TEST_REPO_ID, ALL ) );
+        assertEquals( Arrays.asList( "com", "org", "remotes"), 
storage.listRootNamespaces( TEST_REPO_ID, ALL ) );
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/MockWagon.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/MockWagon.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/MockWagon.java
index fee3410..b85889a 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/MockWagon.java
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/MockWagon.java
@@ -44,7 +44,7 @@ public class MockWagon
     public void get( String s, File file )
         throws TransferFailedException, ResourceDoesNotExistException, 
AuthorizationException
     {
-        String sourceFile = getBasedir() + "/target/test-classes/" + s;
+        String sourceFile = getBasedir() + "/src/test/resources/" + s;
 
         try
         {

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
new file mode 100644
index 0000000..7211494
--- /dev/null
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
@@ -0,0 +1,780 @@
+package org.apache.archiva.repository.index.mock;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.admin.model.RepositoryAdminException;
+import org.apache.archiva.admin.model.beans.NetworkProxy;
+import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin;
+import org.apache.archiva.common.utils.FileUtils;
+import org.apache.archiva.common.utils.PathUtil;
+import org.apache.archiva.configuration.ArchivaConfiguration;
+import org.apache.archiva.indexer.*;
+import org.apache.archiva.proxy.common.WagonFactory;
+import org.apache.archiva.proxy.common.WagonFactoryException;
+import org.apache.archiva.proxy.common.WagonFactoryRequest;
+import org.apache.archiva.repository.*;
+import org.apache.archiva.repository.features.IndexCreationFeature;
+import org.apache.archiva.repository.features.RemoteIndexFeature;
+import org.apache.commons.lang.StringUtils;
+import org.apache.maven.index.*;
+import org.apache.maven.index.context.IndexCreator;
+import org.apache.maven.index.context.IndexingContext;
+import org.apache.maven.index.packer.IndexPacker;
+import org.apache.maven.index.packer.IndexPackingRequest;
+import org.apache.maven.index.updater.IndexUpdateRequest;
+import org.apache.maven.index.updater.IndexUpdater;
+import org.apache.maven.index.updater.ResourceFetcher;
+import org.apache.maven.index_shaded.lucene.index.IndexFormatTooOldException;
+import org.apache.maven.wagon.*;
+import org.apache.maven.wagon.authentication.AuthenticationException;
+import org.apache.maven.wagon.authentication.AuthenticationInfo;
+import org.apache.maven.wagon.authorization.AuthorizationException;
+import org.apache.maven.wagon.events.TransferEvent;
+import org.apache.maven.wagon.events.TransferListener;
+import org.apache.maven.wagon.proxy.ProxyInfo;
+import org.apache.maven.wagon.shared.http.AbstractHttpClientWagon;
+import org.apache.maven.wagon.shared.http.HttpConfiguration;
+import org.apache.maven.wagon.shared.http.HttpMethodConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.inject.Inject;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.stream.Collectors;
+
+/**
+ * @author Martin Stockhammer <[email protected]>
+ */
+@Service("archivaIndexManager#maven")
+public class ArchivaIndexManagerMock implements ArchivaIndexManager {
+    private static final Logger log = LoggerFactory.getLogger( 
ArchivaIndexManagerMock.class );
+
+    @Inject
+    private Indexer indexer;
+
+    @Inject
+    private IndexerEngine indexerEngine;
+
+    @Inject
+    private List<? extends IndexCreator> indexCreators;
+
+    @Inject
+    private IndexPacker indexPacker;
+
+    @Inject
+    private Scanner scanner;
+
+    @Inject
+    private ArchivaConfiguration archivaConfiguration;
+
+    @Inject
+    private WagonFactory wagonFactory;
+
+    @Inject
+    private NetworkProxyAdmin networkProxyAdmin;
+
+
+    @Inject
+    private ArtifactContextProducer artifactContextProducer;
+
+    private ConcurrentSkipListSet<Path> activeContexts = new 
ConcurrentSkipListSet<>( );
+
+    private static final int WAIT_TIME = 100;
+    private static final int MAX_WAIT = 10;
+
+
+    public static IndexingContext getMvnContext(ArchivaIndexingContext context 
) throws UnsupportedBaseContextException
+    {
+        if ( !context.supports( IndexingContext.class ) )
+        {
+            log.error( "The provided archiva index context does not support 
the maven IndexingContext" );
+            throw new UnsupportedBaseContextException( "The context does not 
support the Maven IndexingContext" );
+        }
+        return context.getBaseContext( IndexingContext.class );
+    }
+
+    private Path getIndexPath( ArchivaIndexingContext ctx )
+    {
+        return PathUtil.getPathFromUri( ctx.getPath( ) );
+    }
+
+    @FunctionalInterface
+    interface IndexUpdateConsumer
+    {
+
+        void accept( IndexingContext indexingContext ) throws 
IndexUpdateFailedException;
+    }
+
+    /*
+     * This method is used to do some actions around the update execution 
code. And to make sure, that no other
+     * method is running on the same index.
+     */
+    private void executeUpdateFunction( ArchivaIndexingContext context, 
IndexUpdateConsumer function ) throws IndexUpdateFailedException
+    {
+        IndexingContext indexingContext = null;
+        try
+        {
+            indexingContext = getMvnContext( context );
+        }
+        catch ( UnsupportedBaseContextException e )
+        {
+            throw new IndexUpdateFailedException( "Maven index is not 
supported by this context", e );
+        }
+        final Path ctxPath = getIndexPath( context );
+        int loop = MAX_WAIT;
+        boolean active = false;
+        while ( loop-- > 0 && !active )
+        {
+            active = activeContexts.add( ctxPath );
+            try
+            {
+                Thread.currentThread( ).sleep( WAIT_TIME );
+            }
+            catch ( InterruptedException e )
+            {
+                // Ignore this
+            }
+        }
+        if ( active )
+        {
+            try
+            {
+                function.accept( indexingContext );
+            }
+            finally
+            {
+                activeContexts.remove( ctxPath );
+            }
+        }
+        else
+        {
+            throw new IndexUpdateFailedException( "Timeout while waiting for 
index release on context " + context.getId( ) );
+        }
+    }
+
+    @Override
+    public void pack( final ArchivaIndexingContext context ) throws 
IndexUpdateFailedException
+    {
+        executeUpdateFunction( context, indexingContext -> {
+                    try
+                    {
+                        IndexPackingRequest request = new IndexPackingRequest( 
indexingContext,
+                                indexingContext.acquireIndexSearcher( 
).getIndexReader( ),
+                                indexingContext.getIndexDirectoryFile( ) );
+                        indexPacker.packIndex( request );
+                        indexingContext.updateTimestamp( true );
+                    }
+                    catch ( IOException e )
+                    {
+                        log.error( "IOException while packing index of context 
" + context.getId( ) + ( StringUtils.isNotEmpty( e.getMessage( ) ) ? ": " + 
e.getMessage( ) : "" ) );
+                        throw new IndexUpdateFailedException( "IOException 
during update of " + context.getId( ), e );
+                    }
+                }
+        );
+
+    }
+
+    @Override
+    public void scan(final ArchivaIndexingContext context) throws 
IndexUpdateFailedException
+    {
+        executeUpdateFunction( context, indexingContext -> {
+            DefaultScannerListener listener = new DefaultScannerListener( 
indexingContext, indexerEngine, true, null );
+            ScanningRequest request = new ScanningRequest( indexingContext, 
listener );
+            ScanningResult result = scanner.scan( request );
+            if ( result.hasExceptions( ) )
+            {
+                log.error( "Exceptions occured during index scan of " + 
context.getId( ) );
+                result.getExceptions( ).stream( ).map( e -> e.getMessage( ) 
).distinct( ).limit( 5 ).forEach(
+                        s -> log.error( "Message: " + s )
+                );
+            }
+
+        } );
+    }
+
+    @Override
+    public void update(final ArchivaIndexingContext context, final boolean 
fullUpdate) throws IndexUpdateFailedException
+    {
+        log.info( "start download remote index for remote repository {}", 
context.getRepository( ).getId( ) );
+        URI remoteUpdateUri;
+        if ( !( context.getRepository( ) instanceof RemoteRepository) || 
!(context.getRepository().supportsFeature(RemoteIndexFeature.class)) )
+        {
+            throw new IndexUpdateFailedException( "The context is not 
associated to a remote repository with remote index " + context.getId( ) );
+        } else {
+            RemoteIndexFeature rif = 
context.getRepository().getFeature(RemoteIndexFeature.class).get();
+            remoteUpdateUri = 
context.getRepository().getLocation().resolve(rif.getIndexUri());
+        }
+        final RemoteRepository remoteRepository = (RemoteRepository) 
context.getRepository( );
+
+        executeUpdateFunction( context,
+                indexingContext -> {
+                    try
+                    {
+                        // create a temp directory to download files
+                        Path tempIndexDirectory = Paths.get( 
indexingContext.getIndexDirectoryFile( ).getParent( ), ".tmpIndex" );
+                        Path indexCacheDirectory = Paths.get( 
indexingContext.getIndexDirectoryFile( ).getParent( ), ".indexCache" );
+                        Files.createDirectories( indexCacheDirectory );
+                        if ( Files.exists( tempIndexDirectory ) )
+                        {
+                            
org.apache.archiva.common.utils.FileUtils.deleteDirectory( tempIndexDirectory );
+                        }
+                        Files.createDirectories( tempIndexDirectory );
+                        tempIndexDirectory.toFile( ).deleteOnExit( );
+                        String baseIndexUrl = 
indexingContext.getIndexUpdateUrl( );
+
+                        String wagonProtocol = remoteUpdateUri.toURL( 
).getProtocol( );
+
+                        NetworkProxy networkProxy = null;
+                        if ( remoteRepository.supportsFeature( 
RemoteIndexFeature.class ) )
+                        {
+                            RemoteIndexFeature rif = 
remoteRepository.getFeature( RemoteIndexFeature.class ).get( );
+                            if ( StringUtils.isNotBlank( rif.getProxyId( ) ) )
+                            {
+                                try
+                                {
+                                    networkProxy = 
networkProxyAdmin.getNetworkProxy( rif.getProxyId( ) );
+                                }
+                                catch ( RepositoryAdminException e )
+                                {
+                                    log.error( "Error occured while retrieving 
proxy {}", e.getMessage( ) );
+                                }
+                                if ( networkProxy == null )
+                                {
+                                    log.warn(
+                                            "your remote repository is 
configured to download remote index trought a proxy we cannot find id:{}",
+                                            rif.getProxyId( ) );
+                                }
+                            }
+
+                            final StreamWagon wagon = (StreamWagon) 
wagonFactory.getWagon(
+                                    new WagonFactoryRequest( wagonProtocol, 
remoteRepository.getExtraHeaders( ) ).networkProxy(
+                                            networkProxy )
+                            );
+                            int readTimeout = (int) rif.getDownloadTimeout( 
).toMillis( ) * 1000;
+                            wagon.setReadTimeout( readTimeout );
+                            wagon.setTimeout( (int) 
remoteRepository.getTimeout( ).toMillis( ) * 1000 );
+
+                            if ( wagon instanceof AbstractHttpClientWagon)
+                            {
+                                HttpConfiguration httpConfiguration = new 
HttpConfiguration( );
+                                HttpMethodConfiguration 
httpMethodConfiguration = new HttpMethodConfiguration( );
+                                httpMethodConfiguration.setUsePreemptive( true 
);
+                                httpMethodConfiguration.setReadTimeout( 
readTimeout );
+                                httpConfiguration.setGet( 
httpMethodConfiguration );
+                                AbstractHttpClientWagon.class.cast( wagon 
).setHttpConfiguration( httpConfiguration );
+                            }
+
+                            wagon.addTransferListener( new DownloadListener( ) 
);
+                            ProxyInfo proxyInfo = null;
+                            if ( networkProxy != null )
+                            {
+                                proxyInfo = new ProxyInfo( );
+                                proxyInfo.setType( networkProxy.getProtocol( ) 
);
+                                proxyInfo.setHost( networkProxy.getHost( ) );
+                                proxyInfo.setPort( networkProxy.getPort( ) );
+                                proxyInfo.setUserName( 
networkProxy.getUsername( ) );
+                                proxyInfo.setPassword( 
networkProxy.getPassword( ) );
+                            }
+                            AuthenticationInfo authenticationInfo = null;
+                            if ( remoteRepository.getLoginCredentials( ) != 
null && ( remoteRepository.getLoginCredentials( ) instanceof 
PasswordCredentials) )
+                            {
+                                PasswordCredentials creds = 
(PasswordCredentials) remoteRepository.getLoginCredentials( );
+                                authenticationInfo = new AuthenticationInfo( );
+                                authenticationInfo.setUserName( 
creds.getUsername( ) );
+                                authenticationInfo.setPassword( new String( 
creds.getPassword( ) ) );
+                            }
+                            wagon.connect( new 
org.apache.maven.wagon.repository.Repository( remoteRepository.getId( ), 
baseIndexUrl ), authenticationInfo,
+                                    proxyInfo );
+
+                            Path indexDirectory = 
indexingContext.getIndexDirectoryFile( ).toPath( );
+                            if ( !Files.exists( indexDirectory ) )
+                            {
+                                Files.createDirectories( indexDirectory );
+                            }
+
+                            ResourceFetcher resourceFetcher =
+                                    new WagonResourceFetcher( log, 
tempIndexDirectory, wagon, remoteRepository );
+                            IndexUpdateRequest request = new 
IndexUpdateRequest( indexingContext, resourceFetcher );
+                            request.setForceFullUpdate( fullUpdate );
+                            request.setLocalIndexCacheDir( 
indexCacheDirectory.toFile( ) );
+
+                            // indexUpdater.fetchAndUpdateIndex( request );
+
+                            indexingContext.updateTimestamp( true );
+                        }
+
+                    }
+                    catch ( AuthenticationException e )
+                    {
+                        log.error( "Could not login to the remote proxy for 
updating index of {}", remoteRepository.getId( ), e );
+                        throw new IndexUpdateFailedException( "Login in to 
proxy failed while updating remote repository " + remoteRepository.getId( ), e 
);
+                    }
+                    catch ( ConnectionException e )
+                    {
+                        log.error( "Connection error during index update for 
remote repository {}", remoteRepository.getId( ), e );
+                        throw new IndexUpdateFailedException( "Connection 
error during index update for remote repository " + remoteRepository.getId( ), 
e );
+                    }
+                    catch ( MalformedURLException e )
+                    {
+                        log.error( "URL for remote index update of remote 
repository {} is not correct {}", remoteRepository.getId( ), remoteUpdateUri, e 
);
+                        throw new IndexUpdateFailedException( "URL for remote 
index update of repository is not correct " + remoteUpdateUri, e );
+                    }
+                    catch ( IOException e )
+                    {
+                        log.error( "IOException during index update of remote 
repository {}: {}", remoteRepository.getId( ), e.getMessage( ), e );
+                        throw new IndexUpdateFailedException( "IOException 
during index update of remote repository " + remoteRepository.getId( )
+                                + ( StringUtils.isNotEmpty( e.getMessage( ) ) 
? ": " + e.getMessage( ) : "" ), e );
+                    }
+                    catch ( WagonFactoryException e )
+                    {
+                        log.error( "Wagon for remote index download of {} 
could not be created: {}", remoteRepository.getId( ), e.getMessage( ), e );
+                        throw new IndexUpdateFailedException( "Error while 
updating the remote index of " + remoteRepository.getId( ), e );
+                    }
+                } );
+
+    }
+
+    @Override
+    public void addArtifactsToIndex( final ArchivaIndexingContext context, 
final Collection<URI> artifactReference ) throws IndexUpdateFailedException
+    {
+        final URI ctxUri = context.getPath();
+        executeUpdateFunction(context, indexingContext -> {
+            Collection<ArtifactContext> artifacts = 
artifactReference.stream().map(r -> 
artifactContextProducer.getArtifactContext(indexingContext, 
Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
+            try {
+                indexer.addArtifactsToIndex(artifacts, indexingContext);
+            } catch (IOException e) {
+                log.error("IOException while adding artifact {}", 
e.getMessage(), e);
+                throw new IndexUpdateFailedException("Error occured while 
adding artifact to index of "+context.getId()
+                        + (StringUtils.isNotEmpty(e.getMessage()) ? ": 
"+e.getMessage() : ""));
+            }
+        });
+    }
+
+    @Override
+    public void removeArtifactsFromIndex( ArchivaIndexingContext context, 
Collection<URI> artifactReference ) throws IndexUpdateFailedException
+    {
+        final URI ctxUri = context.getPath();
+        executeUpdateFunction(context, indexingContext -> {
+            Collection<ArtifactContext> artifacts = 
artifactReference.stream().map(r -> 
artifactContextProducer.getArtifactContext(indexingContext, 
Paths.get(ctxUri.resolve(r)).toFile())).collect(Collectors.toList());
+            try {
+                indexer.deleteArtifactsFromIndex(artifacts, indexingContext);
+            } catch (IOException e) {
+                log.error("IOException while removing artifact {}", 
e.getMessage(), e);
+                throw new IndexUpdateFailedException("Error occured while 
removing artifact from index of "+context.getId()
+                        + (StringUtils.isNotEmpty(e.getMessage()) ? ": 
"+e.getMessage() : ""));
+            }
+        });
+
+    }
+
+    @Override
+    public boolean supportsRepository( RepositoryType type )
+    {
+        return type == RepositoryType.MAVEN;
+    }
+
+    @Override
+    public ArchivaIndexingContext createContext( Repository repository ) 
throws IndexCreationFailedException
+    {
+        log.debug("Creating context for repo {}, type: {}", 
repository.getId(), repository.getType());
+        if ( repository.getType( ) != RepositoryType.MAVEN )
+        {
+            throw new UnsupportedRepositoryTypeException( repository.getType( 
) );
+        }
+        IndexingContext mvnCtx = null;
+        try
+        {
+            if ( repository instanceof RemoteRepository )
+            {
+                mvnCtx = createRemoteContext( (RemoteRepository) repository );
+            }
+            else if ( repository instanceof ManagedRepository )
+            {
+                mvnCtx = createManagedContext( (ManagedRepository) repository 
);
+            }
+        }
+        catch ( IOException e )
+        {
+            log.error( "IOException during context creation " + e.getMessage( 
), e );
+            throw new IndexCreationFailedException( "Could not create index 
context for repository " + repository.getId( )
+                    + ( StringUtils.isNotEmpty( e.getMessage( ) ) ? ": " + 
e.getMessage( ) : "" ), e );
+        }
+        MavenIndexContextMock context = new MavenIndexContextMock( repository, 
mvnCtx );
+
+        return context;
+    }
+
+    @Override
+    public ArchivaIndexingContext reset(ArchivaIndexingContext context) throws 
IndexUpdateFailedException {
+        ArchivaIndexingContext ctx;
+        executeUpdateFunction(context, indexingContext -> {
+            try {
+                indexingContext.close(true);
+            } catch (IOException e) {
+                log.warn("Index close failed");
+            }
+            try {
+                FileUtils.deleteDirectory(Paths.get(context.getPath()));
+            } catch (IOException e) {
+                throw new IndexUpdateFailedException("Could not delete index 
files");
+            }
+        });
+        try {
+            Repository repo = context.getRepository();
+            ctx = createContext(context.getRepository());
+            if (repo instanceof EditableRepository) {
+                ((EditableRepository)repo).setIndexingContext(ctx);
+            }
+        } catch (IndexCreationFailedException e) {
+            throw new IndexUpdateFailedException("Could not create index");
+        }
+        return ctx;
+    }
+
+    @Override
+    public ArchivaIndexingContext move(ArchivaIndexingContext context, 
Repository repo) throws IndexCreationFailedException {
+        if (context==null) {
+            return null;
+        }
+        if (context.supports(IndexingContext.class)) {
+            try {
+                Path newPath = getIndexPath(repo);
+                IndexingContext ctx = 
context.getBaseContext(IndexingContext.class);
+                Path oldPath = ctx.getIndexDirectoryFile().toPath();
+                if (oldPath.equals(newPath)) {
+                    // Nothing to do, if path does not change
+                    return context;
+                }
+                if (!Files.exists(oldPath)) {
+                    return createContext(repo);
+                } else if (context.isEmpty()) {
+                    context.close();
+                    return createContext(repo);
+                } else {
+                    context.close(false);
+                    Files.move(oldPath, newPath);
+                    return createContext(repo);
+                }
+            } catch (IOException e) {
+                log.error("IOException while moving index directory {}", 
e.getMessage(), e);
+                throw new IndexCreationFailedException("Could not recreated 
the index.", e);
+            } catch (UnsupportedBaseContextException e) {
+                throw new IndexCreationFailedException("The given context, is 
not a maven context.");
+            }
+        } else {
+            throw new IndexCreationFailedException("Bad context type. This is 
not a maven context.");
+        }
+    }
+
+    private Path getIndexPath(Repository repo) throws IOException {
+        IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
+        Path repoDir = repo.getLocalPath();
+        URI indexDir = icf.getIndexPath();
+        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( ".index" );
+        }
+
+        if ( !Files.exists( indexDirectory ) )
+        {
+            Files.createDirectories( indexDirectory );
+        }
+        return indexDirectory;
+    }
+
+    private IndexingContext createRemoteContext(RemoteRepository 
remoteRepository ) throws IOException
+    {
+        Path appServerBase = archivaConfiguration.getAppServerBaseDir( );
+
+        String contextKey = "remote-" + remoteRepository.getId( );
+
+
+        // create remote repository path
+        Path repoDir = remoteRepository.getLocalPath();
+        if ( !Files.exists( repoDir ) )
+        {
+            Files.createDirectories( repoDir );
+        }
+
+        Path indexDirectory = null;
+
+        // is there configured indexDirectory ?
+        if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
+        {
+            RemoteIndexFeature rif = remoteRepository.getFeature( 
RemoteIndexFeature.class ).get( );
+            indexDirectory = getIndexPath(remoteRepository);
+            String remoteIndexUrl = calculateIndexRemoteUrl( 
remoteRepository.getLocation( ), rif );
+            try
+            {
+
+                return getIndexingContext( remoteRepository, contextKey, 
repoDir, indexDirectory, remoteIndexUrl );
+            }
+            catch ( IndexFormatTooOldException e )
+            {
+                // existing index with an old lucene format so we need to 
delete it!!!
+                // delete it first then recreate it.
+                log.warn( "the index of repository {} is too old we have to 
delete and recreate it", //
+                        remoteRepository.getId( ) );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory );
+                return getIndexingContext( remoteRepository, contextKey, 
repoDir, indexDirectory, remoteIndexUrl );
+
+            }
+        }
+        else
+        {
+            throw new IOException( "No remote index defined" );
+        }
+    }
+
+    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws 
IOException
+    {
+        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.toFile( ),
+                repository.getLocation( ) == null ? null : 
repository.getLocation( ).toString( ),
+                indexUrl,
+                true, false,
+                indexCreators );
+    }
+
+    private IndexingContext createManagedContext( ManagedRepository repository 
) throws IOException
+    {
+
+        IndexingContext context;
+        // take care first about repository location as can be relative
+        Path repositoryDirectory = repository.getLocalPath();
+
+        if ( !Files.exists( repositoryDirectory ) )
+        {
+            try
+            {
+                Files.createDirectories( repositoryDirectory );
+            }
+            catch ( IOException e )
+            {
+                log.error( "Could not create directory {}", 
repositoryDirectory );
+            }
+        }
+
+        Path indexDirectory = null;
+
+        if ( repository.supportsFeature( IndexCreationFeature.class ) )
+        {
+            indexDirectory = getIndexPath(repository);
+
+            String indexUrl = repositoryDirectory.toUri( ).toURL( 
).toExternalForm( );
+            try
+            {
+                context = getIndexingContext( repository, repository.getId( ), 
repositoryDirectory, indexDirectory, indexUrl );
+                context.setSearchable( repository.isScanned( ) );
+            }
+            catch ( IndexFormatTooOldException e )
+            {
+                // existing index with an old lucene format so we need to 
delete it!!!
+                // delete it first then recreate it.
+                log.warn( "the index of repository {} is too old we have to 
delete and recreate it", //
+                        repository.getId( ) );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory );
+                context = getIndexingContext( repository, repository.getId( ), 
repositoryDirectory, indexDirectory, indexUrl );
+                context.setSearchable( repository.isScanned( ) );
+            }
+            return context;
+        }
+        else
+        {
+            throw new IOException( "No repository index defined" );
+        }
+    }
+
+    private String calculateIndexRemoteUrl( URI baseUri, RemoteIndexFeature 
rif )
+    {
+        if ( rif.getIndexUri( ) == null )
+        {
+            return baseUri.resolve( ".index" ).toString( );
+        }
+        else
+        {
+            return baseUri.resolve( rif.getIndexUri( ) ).toString( );
+        }
+    }
+
+    private static final class DownloadListener
+            implements TransferListener
+    {
+        private Logger log = LoggerFactory.getLogger( getClass( ) );
+
+        private String resourceName;
+
+        private long startTime;
+
+        private int totalLength = 0;
+
+        @Override
+        public void transferInitiated( TransferEvent transferEvent )
+        {
+            startTime = System.currentTimeMillis( );
+            resourceName = transferEvent.getResource( ).getName( );
+            log.debug( "initiate transfer of {}", resourceName );
+        }
+
+        @Override
+        public void transferStarted( TransferEvent transferEvent )
+        {
+            this.totalLength = 0;
+            resourceName = transferEvent.getResource( ).getName( );
+            log.info( "start transfer of {}", transferEvent.getResource( 
).getName( ) );
+        }
+
+        @Override
+        public void transferProgress( TransferEvent transferEvent, byte[] 
buffer, int length )
+        {
+            log.debug( "transfer of {} : {}/{}", transferEvent.getResource( 
).getName( ), buffer.length, length );
+            this.totalLength += length;
+        }
+
+        @Override
+        public void transferCompleted( TransferEvent transferEvent )
+        {
+            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 );
+        }
+
+        @Override
+        public void transferError( TransferEvent transferEvent )
+        {
+            log.info( "error of transfer file {}: {}", 
transferEvent.getResource( ).getName( ),
+                    transferEvent.getException( ).getMessage( ), 
transferEvent.getException( ) );
+        }
+
+        @Override
+        public void debug( String message )
+        {
+            log.debug( "transfer debug {}", message );
+        }
+    }
+
+    private static class WagonResourceFetcher
+            implements ResourceFetcher
+    {
+
+        Logger log;
+
+        Path tempIndexDirectory;
+
+        Wagon wagon;
+
+        RemoteRepository remoteRepository;
+
+        private WagonResourceFetcher( Logger log, Path tempIndexDirectory, 
Wagon wagon,
+                                      RemoteRepository remoteRepository )
+        {
+            this.log = log;
+            this.tempIndexDirectory = tempIndexDirectory;
+            this.wagon = wagon;
+            this.remoteRepository = remoteRepository;
+        }
+
+        @Override
+        public void connect( String id, String url )
+                throws IOException
+        {
+            //no op
+        }
+
+        @Override
+        public void disconnect( )
+                throws IOException
+        {
+            // no op
+        }
+
+        @Override
+        public InputStream retrieve(String name )
+                throws IOException, FileNotFoundException
+        {
+            try
+            {
+                log.info( "index update retrieve file, name:{}", name );
+                Path file = tempIndexDirectory.resolve( name );
+                Files.deleteIfExists( file );
+                file.toFile( ).deleteOnExit( );
+                wagon.get( addParameters( name, remoteRepository ), 
file.toFile( ) );
+                return Files.newInputStream( file );
+            }
+            catch ( AuthorizationException | TransferFailedException e )
+            {
+                throw new IOException( e.getMessage( ), e );
+            }
+            catch ( ResourceDoesNotExistException e )
+            {
+                FileNotFoundException fnfe = new FileNotFoundException( 
e.getMessage( ) );
+                fnfe.initCause( e );
+                throw fnfe;
+            }
+        }
+
+        // FIXME remove crappy copy/paste
+        protected String addParameters( String path, RemoteRepository 
remoteRepository )
+        {
+            if ( remoteRepository.getExtraParameters( ).isEmpty( ) )
+            {
+                return path;
+            }
+
+            boolean question = false;
+
+            StringBuilder res = new StringBuilder( path == null ? "" : path );
+
+            for ( Map.Entry<String, String> entry : 
remoteRepository.getExtraParameters( ).entrySet( ) )
+            {
+                if ( !question )
+                {
+                    res.append( '?' ).append( entry.getKey( ) ).append( '=' 
).append( entry.getValue( ) );
+                }
+            }
+
+            return res.toString( );
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/MavenIndexContextMock.java
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/MavenIndexContextMock.java
 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/MavenIndexContextMock.java
new file mode 100644
index 0000000..d5f323c
--- /dev/null
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/index/mock/MavenIndexContextMock.java
@@ -0,0 +1,136 @@
+package org.apache.archiva.repository.index.mock;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.indexer.ArchivaIndexingContext;
+import org.apache.archiva.repository.Repository;
+import org.apache.maven.index.context.IndexingContext;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.sql.Date;
+import java.time.ZonedDateTime;
+import java.util.Set;
+
+/**
+ * Maven implementation of index context
+ */
+public class MavenIndexContextMock implements ArchivaIndexingContext {
+
+    private IndexingContext delegate;
+    private Repository repository;
+
+    MavenIndexContextMock(Repository repository, IndexingContext delegate) {
+        this.delegate = delegate;
+        this.repository = repository;
+
+    }
+
+    @Override
+    public String getId() {
+        return delegate.getId();
+    }
+
+    @Override
+    public Repository getRepository() {
+        return repository;
+    }
+
+    @Override
+    public URI getPath() {
+        return delegate.getIndexDirectoryFile().toURI();
+    }
+
+    @Override
+    public boolean isEmpty() throws IOException {
+        return 
Files.list(delegate.getIndexDirectoryFile().toPath()).count()==0;
+    }
+
+    @Override
+    public void commit() throws IOException {
+        delegate.commit();
+    }
+
+    @Override
+    public void rollback() throws IOException {
+        delegate.rollback();
+    }
+
+    @Override
+    public void optimize() throws IOException {
+        delegate.optimize();
+    }
+
+    @Override
+    public void close(boolean deleteFiles) throws IOException {
+        try {
+            delegate.close(deleteFiles);
+        } catch (NoSuchFileException e) {
+            // Ignore missing directory
+        }
+    }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            delegate.close(false);
+        } catch (NoSuchFileException e) {
+            // Ignore missing directory
+        }
+    }
+
+    @Override
+    public void purge() throws IOException {
+        delegate.purge();
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return IndexingContext.class.equals(clazz);
+    }
+
+    @Override
+    public <T> T getBaseContext(Class<T> clazz) throws 
UnsupportedOperationException {
+        if (IndexingContext.class.equals(clazz)) {
+            return (T) delegate;
+        } else {
+            throw new UnsupportedOperationException("The class "+clazz+" is 
not supported by the maven indexer");
+        }
+    }
+
+    @Override
+    public Set<String> getGroups() throws IOException {
+        return delegate.getAllGroups();
+    }
+
+    @Override
+    public void updateTimestamp(boolean save) throws IOException {
+        delegate.updateTimestamp(save);
+    }
+
+    @Override
+    public void updateTimestamp(boolean save, ZonedDateTime time) throws 
IOException {
+        delegate.updateTimestamp(save, Date.from(time.toInstant()));
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/archiva/blob/c544376a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
----------------------------------------------------------------------
diff --git 
a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
 
b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
index 197d7e4..064fdb6 100644
--- 
a/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
+++ 
b/archiva-modules/plugins/maven2-repository/src/test/resources/spring-context.xml
@@ -28,7 +28,7 @@
        default-lazy-init="true">
 
   <context:annotation-config/>
-  <context:component-scan 
base-package="org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.content.maven2"/>
+  <context:component-scan 
base-package="org.apache.archiva.configuration,org.apache.archiva.metadata.repository,org.apache.archiva.repository.index.mock"/>
 
 
   <alias name="archivaConfiguration#test" 
alias="archivaConfiguration#default"/>

Reply via email to