This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch feature/storage_refactoring
in repository https://gitbox.apache.org/repos/asf/archiva.git


The following commit(s) were added to refs/heads/feature/storage_refactoring by 
this push:
     new 9ca52f4  Fixing tests after refactoring
9ca52f4 is described below

commit 9ca52f4e279159bfd5623585d2a84c2cde0e3421
Author: Martin Stockhammer <[email protected]>
AuthorDate: Sun Jun 30 22:47:24 2019 +0200

    Fixing tests after refactoring
---
 .../configuration/DefaultArchivaConfiguration.java |  16 +-
 .../RepositoryGroupConfiguration.java              |   3 +-
 .../configuration/ArchivaConfigurationTest.java    |   3 +-
 .../src/test/resources/spring-context.xml          |   8 +-
 .../src/test/java/RepositoryProviderMock.java      |   5 +
 .../archiva/admin/model/beans/RepositoryGroup.java |   4 +-
 .../archiva/indexer/ArchivaIndexManager.java       |   3 +
 .../archiva/indexer/merger/IndexMergerRequest.java |   4 +-
 .../archiva/repository/content/StorageAsset.java   |  12 +
 .../repository/features/IndexCreationFeature.java  |   5 +-
 .../archiva/repository/AbstractRepository.java     |   7 +-
 .../repository/AbstractRepositoryGroup.java        |   9 +-
 .../archiva/repository/RepositoryRegistry.java     |  10 +-
 .../repository/content/FilesystemAsset.java        |  54 ++-
 .../repository/content/FilesystemStorage.java      |   6 +-
 .../repository/scanner/RepositoryScanner.java      |   7 +-
 .../scanner/RepositoryScannerInstance.java         |   3 +-
 .../archiva/indexer/maven/MavenIndexManager.java   |  26 +-
 .../search/AbstractMavenRepositorySearch.java      |   4 +-
 .../maven2/ManagedDefaultRepositoryContent.java    |  27 +-
 .../repository/maven2/MavenRepositoryProvider.java |  30 +-
 .../archiva/mock/ArchivaIndexManagerMock.java}     | 379 ++++++++-------------
 .../apache/archiva/mock/MavenIndexContextMock.java | 137 ++++++++
 .../src/test/resources/archiva-test.xml            |   1 +
 .../apache/archiva/webdav/ArchivaDavResource.java  |  39 +--
 .../archiva/webdav/ArchivaDavResourceFactory.java  |  29 +-
 .../webdav/AbstractRepositoryServletTestCase.java  |  14 +-
 .../webdav/ArchivaDavResourceFactoryTest.java      |   9 +-
 .../org/apache/archiva/webdav/DavResourceTest.java |  10 +-
 .../webdav/RepositoryServletBrowseTest.java        |   2 +-
 .../RepositoryServletRepositoryGroupTest.java      |  31 +-
 .../src/test/resources/log4j2-test.xml             |   1 +
 32 files changed, 524 insertions(+), 374 deletions(-)

diff --git 
a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
 
b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
index 13e8a28..8b633c7 100644
--- 
a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
+++ 
b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
@@ -606,7 +606,7 @@ public class DefaultArchivaConfiguration
 
         if (!writeFile("user configuration", userConfigFilename, contents)) {
             fileLocation = altConfigFilename;
-            if (!writeFile("alternative configuration", altConfigFilename, 
contents)) {
+            if (!writeFile("alternative configuration", altConfigFilename, 
contents, true)) {
                 throw new RegistryException(
                         "Unable to create configuration file in either user [" 
+ userConfigFilename + "] or alternative ["
                                 + altConfigFilename
@@ -632,6 +632,10 @@ public class DefaultArchivaConfiguration
         return section == null ? new CommonsConfigurationRegistry(new 
BaseConfiguration()) : section;
     }
 
+    private boolean writeFile(String filetype, String path, String contents) {
+        return writeFile( filetype, path, contents, false );
+    }
+
     /**
      * Attempts to write the contents to a file, if an IOException occurs, 
return false.
      * <p/>
@@ -642,14 +646,18 @@ public class DefaultArchivaConfiguration
      * @param contents the contents to write.
      * @return true if write successful.
      */
-    private boolean writeFile(String filetype, String path, String contents) {
+    private boolean writeFile(String filetype, String path, String contents, 
boolean createDirs) {
         Path file = Paths.get(path);
 
         try {
             // Check parent directory (if it is declared)
-            if (file.getParent() != null) {
+            final Path parent = file.getParent();
+            if (parent != null) {
                 // Check that directory exists
-                if (!Files.isDirectory(file.getParent())) {
+                if (!Files.exists( parent ) && createDirs) {
+                    Files.createDirectories( parent );
+                }
+                if (!Files.isDirectory(parent)) {
                     // Directory to file must exist for file to be created
                     return false;
                 }
diff --git 
a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/RepositoryGroupConfiguration.java
 
b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/RepositoryGroupConfiguration.java
index db3498b..cf51895 100644
--- 
a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/RepositoryGroupConfiguration.java
+++ 
b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/RepositoryGroupConfiguration.java
@@ -69,8 +69,7 @@ public class RepositoryGroupConfiguration
     /**
      * 
      *           When to run the index merging for this group.
-     *           No default value.
-     *           
+     *
      */
     private String cronExpression = "";
 
diff --git 
a/archiva-modules/archiva-base/archiva-configuration/src/test/java/org/apache/archiva/configuration/ArchivaConfigurationTest.java
 
b/archiva-modules/archiva-base/archiva-configuration/src/test/java/org/apache/archiva/configuration/ArchivaConfigurationTest.java
index cd1635d..288986a 100644
--- 
a/archiva-modules/archiva-base/archiva-configuration/src/test/java/org/apache/archiva/configuration/ArchivaConfigurationTest.java
+++ 
b/archiva-modules/archiva-base/archiva-configuration/src/test/java/org/apache/archiva/configuration/ArchivaConfigurationTest.java
@@ -34,6 +34,7 @@ import org.springframework.test.context.ContextConfiguration;
 
 import javax.inject.Inject;
 import java.nio.charset.Charset;
+import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -508,7 +509,7 @@ public class ArchivaConfigurationTest
         throws Exception
     {
         String propFile = System.getProperty( 
ArchivaConfiguration.USER_CONFIG_PROPERTY );
-        System.setProperty( ArchivaConfiguration.USER_CONFIG_PROPERTY, 
"${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml" );
+        System.setProperty( ArchivaConfiguration.USER_CONFIG_PROPERTY, 
"/../../..//*intentionally:invalid*/.m2/archiva-user.xml" );
         ArchivaConfiguration archivaConfiguration =
             lookup( ArchivaConfiguration.class, 
"test-not-allowed-to-write-to-both" );
         Configuration config = archivaConfiguration.getConfiguration();
diff --git 
a/archiva-modules/archiva-base/archiva-configuration/src/test/resources/spring-context.xml
 
b/archiva-modules/archiva-base/archiva-configuration/src/test/resources/spring-context.xml
index fd941cc..f0bd4e1 100755
--- 
a/archiva-modules/archiva-base/archiva-configuration/src/test/resources/spring-context.xml
+++ 
b/archiva-modules/archiva-base/archiva-configuration/src/test/resources/spring-context.xml
@@ -283,8 +283,8 @@
 
   <bean name="archivaConfiguration#test-not-allowed-to-write-to-both"  
class="org.apache.archiva.configuration.DefaultArchivaConfiguration">
     <property name="registry" 
ref="registry#test-not-allowed-to-write-to-both"/>
-    <property name="userConfigFilename" 
value="${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml"/>
-    <property name="altConfigFilename" 
value="${basedir}/target/*intentionally:invalid*/conf/archiva.xml"/>
+    <property name="userConfigFilename" 
value="/../../..//target/*intentionally:invalid*/.m2/archiva-user.xml"/>
+    <property name="altConfigFilename" 
value="/../../..//target/*intentionally:invalid*/conf/archiva.xml"/>
   </bean>
 
   <bean name="registry#test-not-allowed-to-write-to-both" 
class="org.apache.archiva.redback.components.registry.commons.CommonsConfigurationRegistry">
@@ -292,9 +292,9 @@
       <value>
         <![CDATA[
       <configuration>
-          <xml 
fileName="${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml" 
config-optional="true"
+          <xml 
fileName="/../../..//*intentionally:invalid*/.m2/archiva-user.xml" 
config-optional="true"
                config-name="org.apache.archiva.user" 
config-at="org.apache.archiva"/>
-          <xml 
fileName="${basedir}/target/*intentionally:invalid*/conf/archiva.xml" 
config-optional="true"
+          <xml fileName="/../../..//*intentionally:invalid*/conf/archiva.xml" 
config-optional="true"
                config-name="org.apache.archiva.user" 
config-at="org.apache.archiva"/>
       </configuration>
         ]]>
diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/RepositoryProviderMock.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/RepositoryProviderMock.java
index ea7b0f6..7f72c42 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/RepositoryProviderMock.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/RepositoryProviderMock.java
@@ -246,6 +246,11 @@ public class RepositoryProviderMock implements 
RepositoryProvider
     public RepositoryGroup createRepositoryGroup(RepositoryGroupConfiguration 
configuration) throws RepositoryException {
         return null;
     }
+    @Override
+    public EditableRepositoryGroup createRepositoryGroup(String id, String 
name) {
+        return null;
+    }
+
 
     @Override
     public void updateRepositoryGroupInstance(EditableRepositoryGroup 
repositoryGroup, RepositoryGroupConfiguration configuration) throws 
RepositoryException {
diff --git 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RepositoryGroup.java
 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RepositoryGroup.java
index 6c25e3a..74bafcd 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RepositoryGroup.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RepositoryGroup.java
@@ -23,6 +23,8 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+
 /**
  * @author Olivier Lamy
  * @since 1.4-M1
@@ -44,7 +46,7 @@ public class RepositoryGroup
     /**
      * The path of the merged index.
      */
-    private String mergedIndexPath = ".indexer";
+    private String mergedIndexPath = DEFAULT_INDEX_PATH;
 
     /**
      * The TTL (time to live) of the repo group's merged index.
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
index cbf2472..5eb5770 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
@@ -30,6 +30,9 @@ import java.util.List;
 
 public interface ArchivaIndexManager {
 
+    String DEFAULT_INDEX_PATH=".indexer";
+    String DEFAULT_PACKED_INDEX_PATH=".index";
+
     /**
      * Compresses the index to a more dense packed format.
      * @param context
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/IndexMergerRequest.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/IndexMergerRequest.java
index 0b3803f..787e02d 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/IndexMergerRequest.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/IndexMergerRequest.java
@@ -21,6 +21,8 @@ package org.apache.archiva.indexer.merger;
 import java.nio.file.Path;
 import java.util.Collection;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+
 /**
  * @author Olivier Lamy
  */
@@ -41,7 +43,7 @@ public class IndexMergerRequest
      */
     private String groupId;
 
-    private String mergedIndexPath = ".indexer";
+    private String mergedIndexPath = DEFAULT_INDEX_PATH;
 
     private int mergedIndexTtl;
 
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/StorageAsset.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/StorageAsset.java
index 008f096..16e7085 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/StorageAsset.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/StorageAsset.java
@@ -128,4 +128,16 @@ public interface StorageAsset
      * @throws UnsupportedOperationException
      */
     Path getFilePath() throws UnsupportedOperationException;
+
+    /**
+     * Returns true, if there is a parent to this asset.
+     * @return
+     */
+    boolean hasParent();
+
+    /**
+     * Returns the parent of this asset.
+     * @return The asset, or <code>null</code>, if it does not exist.
+     */
+    StorageAsset getParent();
 }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
index d22f1df..636e2cb 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/features/IndexCreationFeature.java
@@ -29,6 +29,9 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.file.Path;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_PACKED_INDEX_PATH;
+
 /**
  *
  * This feature provides some information about index creation.
@@ -36,8 +39,6 @@ import java.nio.file.Path;
  */
 public class IndexCreationFeature extends AbstractFeature implements 
RepositoryFeature<IndexCreationFeature>{
 
-    public static final String DEFAULT_INDEX_PATH = ".indexer";
-    public static final String DEFAULT_PACKED_INDEX_PATH = ".index";
 
     private boolean skipPackedIndexCreation = false;
 
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepository.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepository.java
index 5272708..1627ddf 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepository.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepository.java
@@ -261,8 +261,11 @@ public abstract class AbstractRepository implements 
EditableRepository, Reposito
 
     @Override
     public void setSchedulingDefinition(String cronExpression) {
-        CronParser parser = new CronParser(CRON_DEFINITION);
-        parser.parse(cronExpression).validate();
+        if (StringUtils.isNotEmpty( cronExpression ))
+        {
+            CronParser parser = new CronParser( CRON_DEFINITION );
+            parser.parse( cronExpression ).validate( );
+        }
         this.schedulingDefinition = cronExpression;
     }
 
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepositoryGroup.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepositoryGroup.java
index 1fb61f5..48d2d2b 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepositoryGroup.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepositoryGroup.java
@@ -83,7 +83,8 @@ public class AbstractRepositoryGroup extends 
AbstractRepository implements Edita
         try {
             repositories.clear();
             for(ManagedRepository repo : newRepositories) {
-                repositories.put(repo.getId(), repo);
+                if (repo!=null)
+                    repositories.put(repo.getId(), repo);
             }
         } finally {
             rwl.writeLock().unlock();
@@ -94,7 +95,8 @@ public class AbstractRepositoryGroup extends 
AbstractRepository implements Edita
     public void addRepository(ManagedRepository repository) {
         rwl.writeLock().lock();
         try {
-            repositories.put(repository.getId(), repository);
+            if (repository!=null)
+                repositories.put(repository.getId(), repository);
         } finally {
             rwl.writeLock().unlock();
         }
@@ -104,7 +106,8 @@ public class AbstractRepositoryGroup extends 
AbstractRepository implements Edita
     public void addRepository(int index, ManagedRepository repository) {
         rwl.writeLock().lock();
         try {
-            repositories.put(index, repository.getId(), repository);
+            if (repository!=null)
+                repositories.put(index, repository.getId(), repository);
         } finally {
             rwl.writeLock().unlock();
         }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
index 79c28bb..2b0ac68 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
@@ -42,13 +42,17 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+
 /**
  * Registry for repositories. This is the central entry point for 
repositories. It provides methods for
  * retrieving, adding and removing repositories.
@@ -177,6 +181,10 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
             Map<RepositoryType, RepositoryProvider> providerMap = 
createProviderMap( );
             for ( ManagedRepositoryConfiguration repoConfig : 
managedRepoConfigs )
             {
+                if (managedRepos.containsKey(repoConfig.getId())) {
+                    log.warn( "Duplicate repository definitions for {} in 
config found.", repoConfig.getId( ) );
+                    continue;
+                }
                 RepositoryType repositoryType = RepositoryType.valueOf( 
repoConfig.getType( ) );
                 if ( providerMap.containsKey( repositoryType ) )
                 {
@@ -817,7 +825,7 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
 
     private void setRepositoryGroupDefaults(RepositoryGroupConfiguration 
repositoryGroupConfiguration) {
         if 
(StringUtils.isEmpty(repositoryGroupConfiguration.getMergedIndexPath())) {
-            repositoryGroupConfiguration.setMergedIndexPath(".indexer");
+            
repositoryGroupConfiguration.setMergedIndexPath(DEFAULT_INDEX_PATH);
         }
         if (repositoryGroupConfiguration.getMergedIndexTtl()<=0) {
             repositoryGroupConfiguration.setMergedIndexTtl(300);
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemAsset.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemAsset.java
index 6baed78..41b45df 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemAsset.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemAsset.java
@@ -19,6 +19,7 @@ package org.apache.archiva.repository.content;
  * under the License.
  */
 
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,6 +49,7 @@ public class FilesystemAsset implements StorageAsset {
 
     private final static Logger log = 
LoggerFactory.getLogger(FilesystemAsset.class);
 
+    private final Path basePath;
     private final Path assetPath;
     private final String relativePath;
 
@@ -86,6 +88,15 @@ public class FilesystemAsset implements StorageAsset {
 
     boolean directoryHint = false;
 
+
+    FilesystemAsset(String path, Path assetPath, Path basePath) {
+        this.assetPath = assetPath;
+        this.relativePath = path;
+        this.setPermissionsForNew=false;
+        this.basePath = basePath;
+        init();
+    }
+
     /**
      * Creates an asset for the given path. The given paths are not checked.
      * The base path should be an absolute path.
@@ -97,6 +108,7 @@ public class FilesystemAsset implements StorageAsset {
         this.assetPath = assetPath;
         this.relativePath = path;
         this.setPermissionsForNew = false;
+        this.basePath = null;
         init();
     }
 
@@ -109,11 +121,12 @@ public class FilesystemAsset implements StorageAsset {
      * @param directory This is only relevant, if the represented file or 
directory does not exist yet and
      *                  is a hint.
      */
-    public FilesystemAsset(String path, Path assetPath, boolean directory) {
+    public FilesystemAsset(String path, Path assetPath, Path basePath, boolean 
directory) {
         this.assetPath = assetPath;
         this.relativePath = path;
         this.directoryHint = directory;
         this.setPermissionsForNew = false;
+        this.basePath = basePath;
         init();
     }
 
@@ -126,11 +139,12 @@ public class FilesystemAsset implements StorageAsset {
      * @param directory This is only relevant, if the represented file or 
directory does not exist yet and
      *                  is a hint.
      */
-    public FilesystemAsset(String path, Path assetPath, boolean directory, 
boolean setPermissionsForNew) {
+    public FilesystemAsset(String path, Path assetPath, Path basePath, boolean 
directory, boolean setPermissionsForNew) {
         this.assetPath = assetPath;
         this.relativePath = path;
         this.directoryHint = directory;
         this.setPermissionsForNew = setPermissionsForNew;
+        this.basePath = basePath;
         init();
     }
 
@@ -263,6 +277,9 @@ public class FilesystemAsset implements StorageAsset {
         } else {
             options = new OpenOption[]{StandardOpenOption.APPEND};
         }
+        if (!Files.exists( assetPath )) {
+            create();
+        }
         return Files.newOutputStream(assetPath, options);
     }
 
@@ -344,6 +361,33 @@ public class FilesystemAsset implements StorageAsset {
         return assetPath;
     }
 
+    @Override
+    public boolean hasParent( )
+    {
+        if (basePath!=null && assetPath.equals(basePath)) {
+                return false;
+        }
+        return assetPath.getParent()!=null;
+    }
+
+    @Override
+    public StorageAsset getParent( )
+    {
+        Path parentPath;
+        if (basePath!=null && assetPath.equals( basePath )) {
+            parentPath=null;
+        } else
+        {
+            parentPath = assetPath.getParent( );
+        }
+        String relativeParent = StringUtils.substringBeforeLast( 
relativePath,"/");
+        if (parentPath!=null) {
+            return new FilesystemAsset( relativeParent, parentPath, basePath, 
true, setPermissionsForNew );
+        } else {
+            return null;
+        }
+    }
+
 
     public void setDefaultFileAcls(List<AclEntry> acl) {
         defaultFileAcls = acl;
@@ -383,6 +427,9 @@ public class FilesystemAsset implements StorageAsset {
             if (directoryHint) {
                 Files.createDirectories(assetPath);
             } else {
+                if (!Files.exists( assetPath.getParent() )) {
+                    Files.createDirectories( assetPath.getParent( ) );
+                }
                 Files.createFile(assetPath);
             }
             if (setPermissionsForNew) {
@@ -393,8 +440,7 @@ public class FilesystemAsset implements StorageAsset {
 
     @Override
     public String toString() {
-        return relativePath;
+        return relativePath+":"+assetPath;
     }
 
-
 }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemStorage.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemStorage.java
index f24b311..25e0bc5 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemStorage.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/FilesystemStorage.java
@@ -142,7 +142,7 @@ public class FilesystemStorage implements RepositoryStorage 
{
     public StorageAsset addAsset( String path, boolean container )
     {
         try {
-            return new FilesystemAsset( path, getAssetPath(path), container);
+            return new FilesystemAsset( path, getAssetPath(path), basePath, 
container);
         } catch (IOException e) {
             throw new IllegalArgumentException("Path navigates outside of base 
directory "+path);
         }
@@ -158,7 +158,7 @@ public class FilesystemStorage implements RepositoryStorage 
{
     public StorageAsset moveAsset( StorageAsset origin, String destination ) 
throws IOException
     {
         boolean container = origin.isContainer();
-        FilesystemAsset newAsset = new FilesystemAsset( destination, 
getAssetPath(destination), container );
+        FilesystemAsset newAsset = new FilesystemAsset( destination, 
getAssetPath(destination), basePath, container );
         Files.move(origin.getFilePath(), newAsset.getFilePath());
         return newAsset;
     }
@@ -167,7 +167,7 @@ public class FilesystemStorage implements RepositoryStorage 
{
     public StorageAsset copyAsset( StorageAsset origin, String destination ) 
throws IOException
     {
         boolean container = origin.isContainer();
-        FilesystemAsset newAsset = new FilesystemAsset( destination, 
getAssetPath(destination), container );
+        FilesystemAsset newAsset = new FilesystemAsset( destination, 
getAssetPath(destination), basePath, container );
         if (Files.exists(newAsset.getFilePath())) {
             throw new IOException("Destination file exists already "+ 
newAsset.getFilePath());
         }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScanner.java
 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScanner.java
index 8c5cb89..bf85f53 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScanner.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScanner.java
@@ -26,6 +26,9 @@ import org.apache.archiva.repository.ManagedRepository;
 import java.util.List;
 import java.util.Set;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_PACKED_INDEX_PATH;
+
 /**
  * RepositoryScanner
  *
@@ -51,9 +54,9 @@ public interface RepositoryScanner
      * </p>
      */
     static final String[] IGNORABLE_CONTENT =
-        { "bin/**", "reports/**", ".index", ".reports/**", ".maven/**", 
"**/.svn/**", "**/*snapshot-version",
+        { "bin/**", "reports/**", DEFAULT_PACKED_INDEX_PATH, ".reports/**", 
".maven/**", "**/.svn/**", "**/*snapshot-version",
             "*/website/**", "*/licences/**", "**/.htaccess", "**/*.html", 
"**/*.txt", "**/README*", "**/CHANGELOG*",
-            "**/KEYS*", ".indexer" };
+            "**/KEYS*", DEFAULT_INDEX_PATH };
 
     /**
      * Scan the repository for content changes.
diff --git 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
index 302c623..425a4c5 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
@@ -223,7 +223,8 @@ public class RepositoryScannerInstance
 
     @Override
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
throws IOException {
-        if (excludeMatcher.stream().noneMatch(m -> m.matches(file)) && 
includeMatcher.stream().allMatch(m -> m.matches(file))) {
+        final Path relativeFile = basePath.relativize( file );
+        if (excludeMatcher.stream().noneMatch(m -> m.matches(relativeFile)) && 
includeMatcher.stream().allMatch(m -> m.matches(relativeFile))) {
             log.debug( "Walk Step: {}, {}", file );
 
             stats.increaseFileCount();
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
index 45ac55a..a69d2ba 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
@@ -142,9 +142,6 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     private ProxyRegistry proxyRegistry;
 
 
-    public static final String DEFAULT_INDEXER_DIR = ".indexer";
-    public static final String DEFAULT_PACKED_INDEX_DIR = ".index";
-
     private ConcurrentSkipListSet<Path> activeContexts = new 
ConcurrentSkipListSet<>( );
 
     private static final int WAIT_TIME = 100;
@@ -629,12 +626,12 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
 
     private StorageAsset getIndexPath( Repository repo) throws IOException {
         IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        return getIndexPath( icf.getIndexPath(), repo.getLocalPath(), 
DEFAULT_INDEXER_DIR );
+        return getIndexPath( icf.getIndexPath(), repo.getLocalPath(), 
DEFAULT_INDEX_PATH);
     }
 
     private StorageAsset getPackedIndexPath(Repository repo) throws 
IOException {
         IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        return getIndexPath(icf.getPackedIndexPath(), repo.getLocalPath(), 
DEFAULT_PACKED_INDEX_DIR);
+        return getIndexPath(icf.getPackedIndexPath(), repo.getLocalPath(), 
DEFAULT_PACKED_INDEX_PATH);
     }
 
     private IndexingContext createRemoteContext(RemoteRepository 
remoteRepository ) throws IOException
@@ -683,11 +680,17 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
 
     private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws 
IOException
     {
-        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
-            repository.getLocation( ) == null ? null : repository.getLocation( 
).toString( ),
-            indexUrl,
-            true, false,
-            indexCreators );
+        try
+        {
+            return indexer.createIndexingContext( contextKey, 
repository.getId( ), repoDir.toFile( ), indexDirectory.getFilePath( ).toFile( ),
+                repository.getLocation( ) == null ? null : 
repository.getLocation( ).toString( ),
+                indexUrl,
+                true, false,
+                indexCreators );
+        } catch (Exception e) {
+            log.error("Could not create index for asset {}", indexDirectory);
+            throw new IOException(e);
+        }
     }
 
     private IndexingContext createManagedContext( ManagedRepository repository 
) throws IOException
@@ -714,6 +717,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         if ( repository.supportsFeature( IndexCreationFeature.class ) )
         {
             indexDirectory = getIndexPath(repository);
+            log.debug( "Preparing index at {}", indexDirectory );
 
             String indexUrl = repositoryDirectory.toUri( ).toURL( 
).toExternalForm( );
             try
@@ -743,7 +747,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     {
         if ( rif.getIndexUri( ) == null )
         {
-            return baseUri.resolve( DEFAULT_INDEXER_DIR ).toString( );
+            return baseUri.resolve( DEFAULT_INDEX_PATH ).toString( );
         }
         else
         {
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/test/java/org/apache/archiva/indexer/maven/search/AbstractMavenRepositorySearch.java
 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/test/java/org/apache/archiva/indexer/maven/search/AbstractMavenRepositorySearch.java
index cbf5eee..98520ca 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/test/java/org/apache/archiva/indexer/maven/search/AbstractMavenRepositorySearch.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/test/java/org/apache/archiva/indexer/maven/search/AbstractMavenRepositorySearch.java
@@ -61,6 +61,8 @@ import java.nio.file.Paths;
 import java.util.List;
 import java.util.Locale;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+
 /**
  * @author Olivier Lamy
  */
@@ -192,7 +194,7 @@ public abstract class AbstractMavenRepositorySearch
         repositoryConfig.setScanned( true );
         repositoryConfig.setSnapshots( false );
         repositoryConfig.setReleases( true );
-        repositoryConfig.setIndexDir(".indexer");
+        repositoryConfig.setIndexDir(DEFAULT_INDEX_PATH);
 
         return repositoryConfig;
     }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
index 403bb9f..e76b92c 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/content/maven2/ManagedDefaultRepositoryContent.java
@@ -67,7 +67,7 @@ public class ManagedDefaultRepositoryContent
     implements ManagedRepositoryContent
 {
 
-    private final FilesystemStorage storage;
+    private FilesystemStorage storage;
 
     private FileTypes filetypes;
 
@@ -79,30 +79,22 @@ public class ManagedDefaultRepositoryContent
 
     private Path repoDir;
 
+    FileLockManager lockManager;
+
     public ManagedDefaultRepositoryContent(ManagedRepository repository, 
FileTypes fileTypes, FileLockManager lockManager) {
         super(Collections.singletonList( new DefaultArtifactMappingProvider() 
));
         setFileTypes( fileTypes );
+        this.lockManager = lockManager;
         setRepository( repository );
-        try {
-            storage = new FilesystemStorage(getRepoDir(), lockManager);
-        } catch (IOException e) {
-            log.error("Could not initialize the filesystem storage to 
repository: {}", getRepoDir());
-            throw new RuntimeException("Fatal error. Could not initialize the 
filesystem storage for "+getRepoDir());
-        }
     }
 
     public ManagedDefaultRepositoryContent( ManagedRepository repository, 
List<? extends ArtifactMappingProvider> artifactMappingProviders, FileTypes 
fileTypes, FileLockManager lockManager )
     {
         super(artifactMappingProviders==null ? Collections.singletonList( new 
DefaultArtifactMappingProvider() ) : artifactMappingProviders);
         setFileTypes( fileTypes );
+        this.lockManager = lockManager;
         setRepository( repository );
-        final Path repositoryDir = getRepoDir();
-        try {
-            storage = new FilesystemStorage(repositoryDir, lockManager);
-        } catch (IOException e) {
-            log.error("Could not initialize the filesystem storage to 
repository {}: {}", repositoryDir, e.getMessage(), e);
-            throw new RuntimeException("Fatal error. Could not initialize the 
filesystem storage for "+repositoryDir+": "+e.getMessage());
-        }
+
     }
 
     private Path getRepoDir() {
@@ -429,6 +421,13 @@ public class ManagedDefaultRepositoryContent
             if (repository instanceof EditableManagedRepository) {
                 ((EditableManagedRepository) repository).setContent(this);
             }
+            final Path repositoryDir = getRepoDir();
+            try {
+                storage = new FilesystemStorage(repositoryDir, 
this.lockManager);
+            } catch (IOException e) {
+                log.error("Could not initialize the filesystem storage to 
repository {}: {}", repositoryDir, e.getMessage(), e);
+                throw new RuntimeException("Fatal error. Could not initialize 
the filesystem storage for "+repositoryDir+": "+e.getMessage());
+            }
         }
 
     }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
index c5a66dd..211c2e7 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
@@ -46,6 +46,9 @@ import java.util.HashSet;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_INDEX_PATH;
+import static 
org.apache.archiva.indexer.ArchivaIndexManager.DEFAULT_PACKED_INDEX_PATH;
+
 /**
  * Provider for the maven2 repository implementations
  */
@@ -156,8 +159,10 @@ 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()));
+        String indexDir = StringUtils.isEmpty( cfg.getIndexDir() ) ? 
DEFAULT_INDEX_PATH : cfg.getIndexDir();
+        String packedIndexDir = StringUtils.isEmpty( cfg.getPackedIndexDir() ) 
? DEFAULT_PACKED_INDEX_PATH : cfg.getPackedIndexDir();
+        indexCreationFeature.setIndexPath(getURIFromString(indexDir));
+        
indexCreationFeature.setPackedIndexPath(getURIFromString(packedIndexDir));
 
         ArtifactCleanupFeature artifactCleanupFeature = 
repo.getFeature(ArtifactCleanupFeature.class).get();
 
@@ -408,19 +413,14 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
         }
         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("");
+            packedIndexDir = Paths.get(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());
             }
             // in case of absolute dir do not use the same
         }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
 
b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/ArchivaIndexManagerMock.java
similarity index 63%
copy from 
archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
copy to 
archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/ArchivaIndexManagerMock.java
index 45ac55a..8f1e3e1 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
+++ 
b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/ArchivaIndexManagerMock.java
@@ -1,4 +1,4 @@
-package org.apache.archiva.indexer.maven;
+package org.apache.archiva.mock;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -9,7 +9,7 @@ package org.apache.archiva.indexer.maven;
  * "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
+ *   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
@@ -19,7 +19,6 @@ package org.apache.archiva.indexer.maven;
  * under the License.
  */
 
-import org.apache.archiva.admin.model.RepositoryAdminException;
 import org.apache.archiva.common.utils.FileUtils;
 import org.apache.archiva.common.utils.PathUtil;
 import org.apache.archiva.configuration.ArchivaConfiguration;
@@ -28,8 +27,6 @@ import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.indexer.IndexCreationFailedException;
 import org.apache.archiva.indexer.IndexUpdateFailedException;
 import org.apache.archiva.indexer.UnsupportedBaseContextException;
-import org.apache.archiva.indexer.merger.IndexMergerException;
-import org.apache.archiva.indexer.merger.TemporaryGroupIndex;
 import org.apache.archiva.proxy.ProxyRegistry;
 import org.apache.archiva.proxy.maven.WagonFactory;
 import org.apache.archiva.proxy.maven.WagonFactoryException;
@@ -55,14 +52,11 @@ import org.apache.maven.index.IndexerEngine;
 import org.apache.maven.index.Scanner;
 import org.apache.maven.index.ScanningRequest;
 import org.apache.maven.index.ScanningResult;
-import org.apache.maven.index.context.ContextMemberProvider;
 import org.apache.maven.index.context.IndexCreator;
 import org.apache.maven.index.context.IndexingContext;
-import org.apache.maven.index.context.StaticContextMemberProvider;
 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.ConnectionException;
@@ -95,21 +89,13 @@ import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.stream.Collectors;
 
-/**
- * Maven implementation of index manager.
- * The index manager is a singleton, so we try to make sure, that index 
operations are not running
- * parallel by synchronizing on the index path.
- * A update operation waits for parallel running methods to finish before 
starting, but after a certain
- * time of retries a IndexUpdateFailedException is thrown.
- */
-@Service( "archivaIndexManager#maven" )
-public class MavenIndexManager implements ArchivaIndexManager {
+@Service("archivaIndexManager#maven")
+public class ArchivaIndexManagerMock implements ArchivaIndexManager {
 
-    private static final Logger log = LoggerFactory.getLogger( 
MavenIndexManager.class );
+    private static final Logger log = LoggerFactory.getLogger( 
ArchivaIndexManagerMock.class );
 
     @Inject
     private Indexer indexer;
@@ -132,26 +118,17 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     @Inject
     private WagonFactory wagonFactory;
 
-    @Inject
-    private IndexUpdater indexUpdater;
 
     @Inject
     private ArtifactContextProducer artifactContextProducer;
 
-    @Inject
-    private ProxyRegistry proxyRegistry;
-
-
-    public static final String DEFAULT_INDEXER_DIR = ".indexer";
-    public static final String DEFAULT_PACKED_INDEX_DIR = ".index";
-
     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
+    public static IndexingContext getMvnContext(ArchivaIndexingContext context 
) throws UnsupportedBaseContextException
     {
         if ( !context.supports( IndexingContext.class ) )
         {
@@ -224,20 +201,20 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     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 );
+                    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 );
+                    }
                 }
-            }
         );
 
     }
@@ -253,7 +230,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
             {
                 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 )
+                        s -> log.error( "Message: " + s )
                 );
             }
 
@@ -265,7 +242,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     {
         log.info( "start download remote index for remote repository {}", 
context.getRepository( ).getId( ) );
         URI remoteUpdateUri;
-        if ( !( context.getRepository( ) instanceof RemoteRepository ) || 
!(context.getRepository().supportsFeature(RemoteIndexFeature.class)) )
+        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 {
@@ -275,123 +252,113 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         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 ) )
+                indexingContext -> {
+                    try
                     {
-                        
org.apache.archiva.common.utils.FileUtils.deleteDirectory( tempIndexDirectory );
-                    }
-                    Files.createDirectories( tempIndexDirectory );
-                    tempIndexDirectory.toFile( ).deleteOnExit( );
-                    String baseIndexUrl = indexingContext.getIndexUpdateUrl( );
+                        // 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 ) )
+                        {
+                            FileUtils.deleteDirectory( tempIndexDirectory );
+                        }
+                        Files.createDirectories( tempIndexDirectory );
+                        tempIndexDirectory.toFile( ).deleteOnExit( );
+                        String baseIndexUrl = 
indexingContext.getIndexUpdateUrl( );
 
-                    String wagonProtocol = remoteUpdateUri.toURL( 
).getProtocol( );
+                        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( ) ) )
+                        NetworkProxy networkProxy = null;
+                        if ( remoteRepository.supportsFeature( 
RemoteIndexFeature.class ) )
                         {
-                            networkProxy = proxyRegistry.getNetworkProxy( 
rif.getProxyId( ) );
-                            if ( networkProxy == null )
+                            RemoteIndexFeature rif = 
remoteRepository.getFeature( RemoteIndexFeature.class ).get( );
+
+                            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)
                             {
-                                log.warn(
-                                    "your remote repository is configured to 
download remote index trought a proxy we cannot find id:{}",
-                                    rif.getProxyId( ) );
+                                HttpConfiguration httpConfiguration = new 
HttpConfiguration( );
+                                HttpMethodConfiguration 
httpMethodConfiguration = new HttpMethodConfiguration( );
+                                httpMethodConfiguration.setUsePreemptive( true 
);
+                                httpMethodConfiguration.setReadTimeout( 
readTimeout );
+                                httpConfiguration.setGet( 
httpMethodConfiguration );
+                                AbstractHttpClientWagon.class.cast( wagon 
).setHttpConfiguration( httpConfiguration );
                             }
-                        }
 
-                        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 );
 
-                        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 );
+                            }
 
-                        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( ) );
 
-                        ResourceFetcher resourceFetcher =
-                            new WagonResourceFetcher( log, tempIndexDirectory, 
wagon, remoteRepository );
-                        IndexUpdateRequest request = new IndexUpdateRequest( 
indexingContext, resourceFetcher );
-                        request.setForceFullUpdate( fullUpdate );
-                        request.setLocalIndexCacheDir( 
indexCacheDirectory.toFile( ) );
+                            // indexUpdater.fetchAndUpdateIndex( request );
 
-                        indexUpdater.fetchAndUpdateIndex( request );
+                            indexingContext.updateTimestamp( true );
+                        }
 
-                        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 );
-                }
-            } );
+                    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 );
+                    }
+                } );
 
     }
 
@@ -406,7 +373,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
             } 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() : ""));
+                        + (StringUtils.isNotEmpty(e.getMessage()) ? ": 
"+e.getMessage() : ""));
             }
         });
     }
@@ -458,9 +425,9 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         {
             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 );
+                    + ( StringUtils.isNotEmpty( e.getMessage( ) ) ? ": " + 
e.getMessage( ) : "" ), e );
         }
-        MavenIndexContext context = new MavenIndexContext( repository, mvnCtx 
);
+        MavenIndexContextMock context = new MavenIndexContextMock( repository, 
mvnCtx );
 
         return context;
     }
@@ -533,7 +500,6 @@ 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());
             }
@@ -541,63 +507,14 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     }
 
     @Override
-    public ArchivaIndexingContext mergeContexts(Repository destinationRepo, 
List<ArchivaIndexingContext> contexts,
-                                                boolean packIndex) throws 
UnsupportedOperationException,
-            IndexCreationFailedException, IllegalArgumentException {
-        if (!destinationRepo.supportsFeature(IndexCreationFeature.class)) {
-            throw new IllegalArgumentException("The given repository does not 
support the indexcreation feature");
-        }
-        Path mergedIndexDirectory = null;
-        try {
-            mergedIndexDirectory = 
Files.createTempDirectory("archivaMergedIndex");
-        } catch (IOException e) {
-            log.error("Could not create temporary directory for merged index: 
{}", e.getMessage(), e);
-            throw new IndexCreationFailedException("IO error while creating 
temporary directory for merged index: "+e.getMessage(), e);
-        }
-        IndexCreationFeature indexCreationFeature = 
destinationRepo.getFeature(IndexCreationFeature.class).get();
-        if (indexCreationFeature.getLocalIndexPath()== null) {
-            throw new IllegalArgumentException("The given repository does not 
have a local index path");
-        }
-        StorageAsset destinationPath = 
indexCreationFeature.getLocalIndexPath();
-
-        String tempRepoId = mergedIndexDirectory.getFileName().toString();
-
-        try
-        {
-            Path indexLocation = destinationPath.getFilePath();
-
-            List<IndexingContext> members = contexts.stream( ).filter(ctx -> 
ctx.supports(IndexingContext.class)).map( ctx ->
-            {
-                try {
-                    return ctx.getBaseContext(IndexingContext.class);
-                } catch (UnsupportedBaseContextException e) {
-                    // does not happen here
-                    return null;
-                }
-            }).filter( Objects::nonNull ).collect( Collectors.toList() );
-            ContextMemberProvider memberProvider = new 
StaticContextMemberProvider(members);
-            IndexingContext mergedCtx = indexer.createMergedIndexingContext( 
tempRepoId, tempRepoId, mergedIndexDirectory.toFile(),
-                    indexLocation.toFile(), true, memberProvider);
-            mergedCtx.optimize();
-
-            if ( packIndex )
-            {
-                IndexPackingRequest request = new IndexPackingRequest( 
mergedCtx, //
-                        mergedCtx.acquireIndexSearcher().getIndexReader(), //
-                        indexLocation.toFile() );
-                indexPacker.packIndex( request );
-            }
-
-            return new MavenIndexContext(destinationRepo, mergedCtx);
-        }
-        catch ( IOException e)
-        {
-            throw new IndexCreationFailedException( "IO Error during index 
merge: "+ e.getMessage(), e );
-        }
+    public ArchivaIndexingContext mergeContexts(Repository destinationRepo, 
List<ArchivaIndexingContext> contexts, boolean packIndex) throws 
UnsupportedOperationException, IndexCreationFailedException {
+        return null;
     }
 
-    private StorageAsset getIndexPath(URI indexDir, Path repoDir, String 
defaultDir) throws IOException
-    {
+    private StorageAsset getIndexPath( Repository repo) throws IOException {
+        IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
+        Path repoDir = repo.getLocalPath();
+        URI indexDir = icf.getIndexPath();
         String indexPath = indexDir.getPath();
         Path indexDirectory = null;
         if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
@@ -616,8 +533,8 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         }
         else
         {
-            indexDirectory = repoDir.resolve( defaultDir );
-            indexPath = defaultDir;
+            indexDirectory = repoDir.resolve( ".index" );
+            indexPath = ".index";
         }
 
         if ( !Files.exists( indexDirectory ) )
@@ -627,16 +544,6 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         return new FilesystemAsset( indexPath, indexDirectory);
     }
 
-    private StorageAsset getIndexPath( Repository repo) throws IOException {
-        IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        return getIndexPath( icf.getIndexPath(), repo.getLocalPath(), 
DEFAULT_INDEXER_DIR );
-    }
-
-    private StorageAsset getPackedIndexPath(Repository repo) throws 
IOException {
-        IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        return getIndexPath(icf.getPackedIndexPath(), repo.getLocalPath(), 
DEFAULT_PACKED_INDEX_DIR);
-    }
-
     private IndexingContext createRemoteContext(RemoteRepository 
remoteRepository ) throws IOException
     {
         Path appServerBase = archivaConfiguration.getAppServerBaseDir( );
@@ -669,8 +576,8 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
                 // 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.getFilePath() );
+                        remoteRepository.getId( ) );
+                FileUtils.deleteDirectory( indexDirectory.getFilePath() );
                 return getIndexingContext( remoteRepository, contextKey, 
repoDir, indexDirectory, remoteIndexUrl );
 
             }
@@ -684,10 +591,10 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws 
IOException
     {
         return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
-            repository.getLocation( ) == null ? null : repository.getLocation( 
).toString( ),
-            indexUrl,
-            true, false,
-            indexCreators );
+                repository.getLocation( ) == null ? null : 
repository.getLocation( ).toString( ),
+                indexUrl,
+                true, false,
+                indexCreators );
     }
 
     private IndexingContext createManagedContext( ManagedRepository repository 
) throws IOException
@@ -726,8 +633,8 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
                 // 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.getFilePath() );
+                        repository.getId( ) );
+                FileUtils.deleteDirectory( indexDirectory.getFilePath() );
                 context = getIndexingContext( repository, repository.getId( ), 
repositoryDirectory, indexDirectory, indexUrl );
                 context.setSearchable( repository.isScanned( ) );
             }
@@ -743,7 +650,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     {
         if ( rif.getIndexUri( ) == null )
         {
-            return baseUri.resolve( DEFAULT_INDEXER_DIR ).toString( );
+            return baseUri.resolve( ".index" ).toString( );
         }
         else
         {
@@ -752,7 +659,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     }
 
     private static final class DownloadListener
-        implements TransferListener
+            implements TransferListener
     {
         private Logger log = LoggerFactory.getLogger( getClass( ) );
 
@@ -791,14 +698,14 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
             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 );
+                    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( ) );
+                    transferEvent.getException( ).getMessage( ), 
transferEvent.getException( ) );
         }
 
         @Override
@@ -809,7 +716,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
     }
 
     private static class WagonResourceFetcher
-        implements ResourceFetcher
+            implements ResourceFetcher
     {
 
         Logger log;
@@ -831,21 +738,21 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
 
         @Override
         public void connect( String id, String url )
-            throws IOException
+                throws IOException
         {
             //no op
         }
 
         @Override
         public void disconnect( )
-            throws IOException
+                throws IOException
         {
             // no op
         }
 
         @Override
-        public InputStream retrieve( String name )
-            throws IOException, FileNotFoundException
+        public InputStream retrieve(String name )
+                throws IOException, FileNotFoundException
         {
             try
             {
diff --git 
a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MavenIndexContextMock.java
 
b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MavenIndexContextMock.java
new file mode 100644
index 0000000..b3ae99c
--- /dev/null
+++ 
b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/mock/MavenIndexContextMock.java
@@ -0,0 +1,137 @@
+package org.apache.archiva.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);
+    }
+
+    @SuppressWarnings( "unchecked" )
+    @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()));
+    }
+
+
+}
diff --git 
a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/archiva-test.xml
 
b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/archiva-test.xml
index 277e287..04a67f1 100644
--- 
a/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/archiva-test.xml
+++ 
b/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/resources/archiva-test.xml
@@ -88,6 +88,7 @@
           <pattern>**/*.sh</pattern>
           <pattern>**/.svn/**</pattern>
           <pattern>**/.DAV/**</pattern>
+          <pattern>.indexer/**</pattern>
         </patterns>
       </fileType>
     </fileTypes>
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
index da68c1c..eed07ea 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
@@ -21,10 +21,8 @@ package org.apache.archiva.webdav;
 
 import edu.emory.mathcs.backport.java.util.Collections;
 import org.apache.archiva.metadata.model.facets.AuditEvent;
-import org.apache.archiva.redback.components.taskqueue.TaskQueueException;
 import org.apache.archiva.repository.LayoutException;
-import org.apache.archiva.repository.ManagedRepository;
-import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.content.RepositoryStorage;
 import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.archiva.repository.events.AuditListener;
 import org.apache.archiva.scheduler.ArchivaTaskScheduler;
@@ -32,7 +30,6 @@ import 
org.apache.archiva.scheduler.repository.model.RepositoryArchivaTaskSchedu
 import org.apache.archiva.scheduler.repository.model.RepositoryTask;
 import org.apache.archiva.webdav.util.IndexWriter;
 import org.apache.archiva.webdav.util.MimeTypes;
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.webdav.DavException;
@@ -57,7 +54,6 @@ import 
org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
 import org.apache.jackrabbit.webdav.property.DavPropertySet;
 import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
 import org.apache.jackrabbit.webdav.property.ResourceType;
-import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -69,11 +65,9 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  */
@@ -98,7 +92,7 @@ public class ArchivaDavResource
 
     private String remoteAddr;
 
-    private final ManagedRepository repository;
+    private final RepositoryStorage repositoryStorage;
 
     private final MimeTypes mimeTypes;
 
@@ -114,7 +108,7 @@ public class ArchivaDavResource
 
     private StorageAsset asset;
 
-    public ArchivaDavResource( StorageAsset localResource, String 
logicalResource, ManagedRepository repository,
+    public ArchivaDavResource( StorageAsset localResource, String 
logicalResource, RepositoryStorage repositoryStorage,
                                DavSession session, ArchivaDavResourceLocator 
locator, DavResourceFactory factory,
                                MimeTypes mimeTypes, List<AuditListener> 
auditListeners,
                                RepositoryArchivaTaskScheduler scheduler) 
throws LayoutException
@@ -127,7 +121,7 @@ public class ArchivaDavResource
         this.session = session;
 
         // TODO: push into locator as well as moving any references out of the 
resource factory
-        this.repository = repository;
+        this.repositoryStorage = repositoryStorage;
 
         // TODO: these should be pushed into the repository layer, along with 
the physical file operations in this class
         this.mimeTypes = mimeTypes;
@@ -136,21 +130,18 @@ public class ArchivaDavResource
 
     }
 
-    public ArchivaDavResource( StorageAsset localResource, String 
logicalResource, ManagedRepository repository,
+    public ArchivaDavResource( StorageAsset localResource, String 
logicalResource, RepositoryStorage repositoryStorage,
                                String remoteAddr, String principal, DavSession 
session,
                                ArchivaDavResourceLocator locator, 
DavResourceFactory factory, MimeTypes mimeTypes,
                                List<AuditListener> auditListeners, 
RepositoryArchivaTaskScheduler scheduler) throws LayoutException
     {
-        this( localResource, logicalResource, repository, session, locator, 
factory, mimeTypes, auditListeners,
+        this( localResource, logicalResource, repositoryStorage, session, 
locator, factory, mimeTypes, auditListeners,
               scheduler );
 
         this.remoteAddr = remoteAddr;
         this.principal = principal;
     }
 
-    private ManagedRepositoryContent getContent() {
-        return repository.getContent();
-    }
 
     @Override
     public String getComplianceClass()
@@ -219,7 +210,7 @@ public class ArchivaDavResource
 
         if ( !isCollection() && outputContext.hasStream() )
         {
-            getContent().consumeData( asset, is -> {copyStream(is, 
outputContext.getOutputStream());}, true );
+            repositoryStorage.consumeData( asset, is -> {copyStream(is, 
outputContext.getOutputStream());}, true );
         }
         else if ( outputContext.hasStream() )
         {
@@ -343,7 +334,7 @@ public class ArchivaDavResource
                     log.debug( "Upload failed: {}", msg );
                     throw new DavException( 
HttpServletResponse.SC_BAD_REQUEST, msg );
                 }
-                StorageAsset member = getContent( ).addAsset( newPath, false );
+                StorageAsset member = repositoryStorage.addAsset( newPath, 
false );
                 member.create();
                 member.storeDataFile( tempFile );
             }
@@ -375,7 +366,7 @@ public class ArchivaDavResource
         {
             try
             {
-                StorageAsset member = getContent( ).addAsset( newPath, true );
+                StorageAsset member = repositoryStorage.addAsset( newPath, 
true );
                 member.create();
             }
             catch ( IOException e )
@@ -439,12 +430,12 @@ public class ArchivaDavResource
             {
                 if ( resource.isContainer() )
                 {
-                    getContent().removeAsset( resource );
+                    repositoryStorage.removeAsset( resource );
                     triggerAuditEvent( member, AuditEvent.REMOVE_DIR );
                 }
                 else
                 {
-                    getContent().removeAsset( resource );
+                    repositoryStorage.removeAsset( resource );
                     triggerAuditEvent( member, AuditEvent.REMOVE_FILE );
                 }
 
@@ -492,12 +483,12 @@ public class ArchivaDavResource
             ArchivaDavResource resource = 
checkDavResourceIsArchivaDavResource( destination );
             if ( isCollection() )
             {
-                this.asset = getContent().moveAsset( asset, 
destination.getResourcePath() );
+                this.asset = repositoryStorage.moveAsset( asset, 
destination.getResourcePath() );
                 triggerAuditEvent( remoteAddr, locator.getRepositoryId(), 
logicalResource, AuditEvent.MOVE_DIRECTORY );
             }
             else
             {
-                this.asset = getContent().moveAsset( asset, 
destination.getResourcePath() );
+                this.asset = repositoryStorage.moveAsset( asset, 
destination.getResourcePath() );
                 triggerAuditEvent( remoteAddr, locator.getRepositoryId(), 
logicalResource, AuditEvent.MOVE_FILE );
             }
 
@@ -530,13 +521,13 @@ public class ArchivaDavResource
             ArchivaDavResource resource = 
checkDavResourceIsArchivaDavResource( destination );
             if ( isCollection() )
             {
-                getContent().copyAsset( asset, destination.getResourcePath() );
+                repositoryStorage.copyAsset( asset, 
destination.getResourcePath() );
 
                 triggerAuditEvent( remoteAddr, locator.getRepositoryId(), 
logicalResource, AuditEvent.COPY_DIRECTORY );
             }
             else
             {
-                getContent().copyAsset( asset, destination.getResourcePath() );
+                repositoryStorage.copyAsset( asset, 
destination.getResourcePath() );
 
                 triggerAuditEvent( remoteAddr, locator.getRepositoryId(), 
logicalResource, AuditEvent.COPY_FILE );
             }
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
index e4f96c7..5102db7 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
@@ -68,6 +68,7 @@ import org.apache.archiva.repository.RepositoryGroup;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.RepositoryRequestInfo;
 import org.apache.archiva.repository.content.FilesystemAsset;
+import org.apache.archiva.repository.content.FilesystemStorage;
 import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.archiva.repository.events.AuditListener;
 import org.apache.archiva.repository.features.IndexCreationFeature;
@@ -186,6 +187,7 @@ public class ArchivaDavResourceFactory
 
     private ApplicationContext applicationContext;
 
+
     @Inject
     public ArchivaDavResourceFactory( ApplicationContext applicationContext, 
ArchivaConfiguration archivaConfiguration )
         throws PlexusSisuBridgeException
@@ -196,11 +198,12 @@ public class ArchivaDavResourceFactory
     }
 
     @PostConstruct
-    public void initialize()
+    public void initialize() throws IOException
     {
-        // no op
+
     }
 
+
     @Override
     public DavResource createResource( final DavResourceLocator locator, final 
DavServletRequest request,
                                        final DavServletResponse response )
@@ -299,7 +302,13 @@ public class ArchivaDavResourceFactory
             {
 
                 ArchivaDavResource res = (ArchivaDavResource) resource;
-                String newPath = res.getAsset().getPath()+"/maven-metadata-" + 
sRepoId + ".xml";
+                String newPath;
+                if (res.getAsset().hasParent())
+                {
+                    newPath = res.getAsset( ).getParent( ).getPath( ) + 
"/maven-metadata-" + sRepoId + ".xml";
+                } else {
+                    newPath = StringUtils.substringBeforeLast( 
res.getAsset().getPath(), "/" ) + "/maven-metadata-" + sRepoId + ".xml";;
+                }
                 // for MRM-872 handle checksums of the merged metadata files
                 if ( repositoryRequestInfo.isSupportFile( requestedResource ) )
                 {
@@ -313,7 +322,7 @@ public class ArchivaDavResourceFactory
                         try
                         {
                             resource =
-                                new ArchivaDavResource( metadataChecksum, 
logicalResource.getPath(), null,
+                                new ArchivaDavResource( metadataChecksum, 
logicalResource.getPath(), repoGroup,
                                                         
request.getRemoteAddr(), activePrincipal, request.getDavSession(),
                                                         archivaLocator, this, 
mimeTypes, auditListeners, scheduler);
                         }
@@ -358,7 +367,7 @@ public class ArchivaDavResourceFactory
                                 new LogicalResource( getLogicalResource( 
archivaLocator, null, false ) );
 
                             resource =
-                                new ArchivaDavResource( resourceFile, 
logicalResource.getPath(), null,
+                                new ArchivaDavResource( resourceFile, 
logicalResource.getPath(), repoGroup,
                                                         
request.getRemoteAddr(), activePrincipal,
                                                         
request.getDavSession(), archivaLocator, this, mimeTypes,
                                                         auditListeners, 
scheduler);
@@ -570,7 +579,7 @@ public class ArchivaDavResourceFactory
             try
             {
                 resource =
-                    new ArchivaDavResource( repoAsset, path, 
managedRepositoryContent.getRepository(),
+                    new ArchivaDavResource( repoAsset, path, 
managedRepositoryContent,
                                             request.getRemoteAddr(), 
activePrincipal, request.getDavSession(),
                                             archivaLocator, this, mimeTypes, 
auditListeners, scheduler );
             }
@@ -606,14 +615,14 @@ public class ArchivaDavResourceFactory
                             resourceAsset = managedRepositoryContent.getAsset( 
localResourcePath );
                             resource =
                                 new ArchivaDavResource( resourceAsset, 
logicalResource.getPath(),
-                                                        
managedRepositoryContent.getRepository(),
+                                                        
managedRepositoryContent,
                                                         
request.getRemoteAddr(), activePrincipal,
                                                         
request.getDavSession(), archivaLocator, this, mimeTypes,
                                                         auditListeners, 
scheduler );
                         }
                         catch ( LayoutException e )
                         {
-                            if ( resourceAsset!=null && 
!resourceAsset.exists() )
+                            if ( resourceAsset==null || 
!resourceAsset.exists() )
                             {
                                 throw new DavException( 
HttpServletResponse.SC_NOT_FOUND, e );
                             }
@@ -735,7 +744,7 @@ public class ArchivaDavResourceFactory
         try
         {
             resource = new ArchivaDavResource( resourceAsset, logicalResource,
-                                               repo, davSession, 
archivaLocator,
+                                               repo.getContent(), davSession, 
archivaLocator,
                                                this, mimeTypes, 
auditListeners, scheduler);
         }
         catch ( LayoutException e )
@@ -1100,7 +1109,7 @@ public class ArchivaDavResourceFactory
                     }
                     // Path resourceFile = Paths.get( 
managedRepository.getRepoRoot(), logicalResource.getPath() );
                     StorageAsset resourceFile = 
managedRepository.getAsset(logicalResource.getPath());
-                    if ( resourceFile.exists() )
+                    if ( resourceFile.exists() && 
managedRepository.getRepository().supportsFeature( IndexCreationFeature.class ))
                     {
                         // in case of group displaying index directory doesn't 
have sense !!
                         IndexCreationFeature idf = 
managedRepository.getRepository().getFeature(IndexCreationFeature.class).get();
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
index a55d891..dfcab22 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
@@ -27,7 +27,9 @@ import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.Configuration;
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
 import org.apache.archiva.webdav.httpunit.MkColMethodWebRequest;
 import org.apache.commons.io.FileUtils;
@@ -175,14 +177,21 @@ public abstract class AbstractRepositoryServletTestCase
 
         config.addManagedRepository(
             createManagedRepository( REPOID_INTERNAL, "Internal Test Repo", 
repoRootInternal, true ) );
-        repositoryRegistry.reload();
-
         config.getProxyConnectors().clear();
 
         config.getRemoteRepositories().clear();
 
         saveConfiguration( archivaConfiguration );
 
+        ArchivaIndexingContext ctx = repositoryRegistry.getManagedRepository( 
REPOID_INTERNAL ).getIndexingContext( );
+        try
+        {
+            repositoryRegistry.getIndexManager( RepositoryType.MAVEN ).pack( 
ctx );
+        } finally
+        {
+            ctx.close(  );
+        }
+
         CacheManager.getInstance().clearAll();
 
 
@@ -795,6 +804,7 @@ public abstract class AbstractRepositoryServletTestCase
         repo.setName( name );
         repo.setLocation( location.toAbsolutePath().toString() );
         repo.setBlockRedeployments( blockRedeployments );
+        repo.setType( "MAVEN" );
 
         return repo;
     }
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
index 8c7cf4a..0ce106f 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/ArchivaDavResourceFactoryTest.java
@@ -191,7 +191,7 @@ public class ArchivaDavResourceFactoryTest
         expectLastCall().times(0, 4);
         archivaConfiguration.save( config );
 
-        expectLastCall().times( 0, 4 );
+        expectLastCall().times( 0, 5 );
         archivaConfigurationControl.replay();
 
         defaultManagedRepositoryAdmin.setArchivaConfiguration( 
archivaConfiguration );
@@ -493,6 +493,8 @@ public class ArchivaDavResourceFactoryTest
         ManagedRepositoryContent internalRepo = 
createManagedRepositoryContent( INTERNAL_REPO );
         ManagedRepositoryContent localMirrorRepo = 
createManagedRepositoryContent( LOCAL_MIRROR_REPO );
 
+        repositoryRegistry.putRepositoryGroup( repoGroup );
+
         try
         {
             archivaConfigurationControl.reset();
@@ -572,8 +574,6 @@ public class ArchivaDavResourceFactoryTest
         {
             archivaConfigurationControl.reset();
 
-            expect( archivaConfiguration.getConfiguration() ).andReturn( 
config ).times( 1 );
-
             expect( request.getMethod() ).andReturn( "GET" ).times( 4 );
 
             expect( request.getRemoteAddr() ).andReturn( 
"http://localhost:8080"; ).times( 3 );
@@ -670,7 +670,8 @@ public class ArchivaDavResourceFactoryTest
         repoContentFactory.getRepositoryContentProviders().add(provider);
         defaultManagedRepositoryAdmin.addManagedRepository(
             createManagedRepository( LEGACY_REPO, getProjectBase().resolve( 
"target/test-classes/" + LEGACY_REPO ).toString(),
-                                     "legacy" ), false, null );
+                "legacy" ), false, null );
+
         DavResourceLocator locator =
             new ArchivaDavResourceLocator( "", "/repository/" + LEGACY_REPO + 
"/eclipse/maven-metadata.xml",
                                            LEGACY_REPO, new 
ArchivaDavLocatorFactory() );
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/DavResourceTest.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/DavResourceTest.java
index 72b016f..97fb811 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/DavResourceTest.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/DavResourceTest.java
@@ -23,6 +23,7 @@ import junit.framework.TestCase;
 import org.apache.archiva.common.filelock.FileLockManager;
 import org.apache.archiva.common.utils.FileUtils;
 import org.apache.archiva.repository.LayoutException;
+import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.content.FilesystemAsset;
 import org.apache.archiva.repository.events.AuditListener;
 import org.apache.archiva.repository.maven2.MavenManagedRepository;
@@ -68,6 +69,9 @@ public class DavResourceTest
     @Inject
     private FileLockManager fileLockManager;
 
+    @Inject
+    private RepositoryRegistry repositoryRegistry;
+
     private ArchivaDavResourceLocator resourceLocator;
 
     private DavResourceFactory resourceFactory;
@@ -92,7 +96,9 @@ public class DavResourceTest
         session = new ArchivaDavSession();
         baseDir = Paths.get( "target/DavResourceTest" );
         Files.createDirectories( baseDir );
+        Files.createDirectories( baseDir.resolve( "conf" ) );
         repository = new MavenManagedRepository( "repo001", "repo001", 
baseDir);
+        repositoryRegistry.putRepository( repository );
 
         myResource = baseDir.resolve( "myresource.jar" );
         Files.createFile(myResource);
@@ -121,7 +127,7 @@ public class DavResourceTest
 
     private DavResource getDavResource( String logicalPath, Path file ) throws 
LayoutException
     {
-        return new ArchivaDavResource( new FilesystemAsset( logicalPath, 
file.toAbsolutePath()) , logicalPath, repository, session, resourceLocator,
+        return new ArchivaDavResource( new FilesystemAsset( logicalPath, 
file.toAbsolutePath()) , logicalPath, repository.getContent(), session, 
resourceLocator,
                                        resourceFactory, mimeTypes, 
Collections.<AuditListener> emptyList(), null);
     }
 
@@ -343,7 +349,7 @@ public class DavResourceTest
         {
             try
             {
-                return new ArchivaDavResource( new FilesystemAsset( "/" , 
baseDir.toAbsolutePath()), "/", repository, session, resourceLocator,
+                return new ArchivaDavResource( new FilesystemAsset( "/" , 
baseDir.toAbsolutePath()), "/", repository.getContent(), session, 
resourceLocator,
                                                resourceFactory, mimeTypes, 
Collections.<AuditListener> emptyList(),
                                                null );
             }
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
index 90e13c4..29e51f8 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletBrowseTest.java
@@ -67,7 +67,7 @@ public class RepositoryServletBrowseTest
 
         // dumpResponse( response );
 
-        List<String> expectedLinks = Arrays.asList( "commons-lang/", "net/", 
"org/" );
+        List<String> expectedLinks = Arrays.asList( ".index/", ".indexer/", 
"commons-lang/", "net/", "org/" );
 
         Document document = Jsoup.parse( response.getContentAsString() );
         Elements elements = document.getElementsByTag( "a" );
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletRepositoryGroupTest.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletRepositoryGroupTest.java
index 6daee28..de17173 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletRepositoryGroupTest.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletRepositoryGroupTest.java
@@ -87,7 +87,8 @@ public class RepositoryServletRepositoryGroupTest
     {
         super.setUp();
 
-        String appserverBase = System.getProperty( "appserver.base" );
+        String appserverBase = getAppserverBase().toAbsolutePath().toString();
+        log.debug( "Appserver Base {}", appserverBase );
 
         Configuration configuration = archivaConfiguration.getConfiguration();
 
@@ -110,11 +111,7 @@ public class RepositoryServletRepositoryGroupTest
         ManagedRepositoryConfiguration managedRepositoryConfiguration =
             createManagedRepository( MANAGED_REPO_INVALID, "Invalid Test 
Repo", repoRootInvalid, true );
 
-        configuration.addManagedRepository(
-            createManagedRepository( MANAGED_REPO_FIRST, "First Test Repo", 
repoRootFirst, true ) );
         configuration.addManagedRepository( managedRepositoryConfiguration );
-        configuration.addManagedRepository(
-            createManagedRepository( MANAGED_REPO_LAST, "Last Test Repo", 
repoRootLast, true ) );
 
         List<String> invalidManagedRepoIds = new ArrayList<>();
         invalidManagedRepoIds.add( MANAGED_REPO_FIRST );
@@ -133,6 +130,7 @@ public class RepositoryServletRepositoryGroupTest
         startRepository();
     }
 
+
     @Override
     @After
     public void tearDown()
@@ -141,6 +139,8 @@ public class RepositoryServletRepositoryGroupTest
         setupCleanRepo( repoRootFirst );
         setupCleanRepo( repoRootLast );
 
+        repositoryRegistry.destroy();
+
         super.tearDown();
 
         String appserverBase = System.getProperty( "appserver.base" );
@@ -210,22 +210,6 @@ public class RepositoryServletRepositoryGroupTest
     }
 
     /*
-    * Test Case 3.a
-    */
-    @Test
-    public void testGetInvalidManagedRepositoryInGroupReturnNotFound()
-        throws Exception
-    {
-        String resourceName = 
"dummy/dummy-no-resource/1.0/dummy-no-resource-1.0.txt";
-
-        WebRequest request = new GetMethodWebRequest(
-            "http://machine.com/repository/"; + REPO_GROUP_WITH_INVALID_REPOS + 
"/" + resourceName );
-        WebResponse response = getServletUnitClient().getResponse( request );
-
-        assertResponseInternalServerError( response );
-    }
-
-    /*
     * Test Case 4
     */
     @Test
@@ -274,6 +258,7 @@ public class RepositoryServletRepositoryGroupTest
         WebResponse response = getServletUnitClient().getResource( request );
 
         Path returnedMetadata = getProjectBase().resolve( 
"target/test-classes/retrievedMetadataFile.xml" );
+        System.out.println( response.getContentAsString() );
         org.apache.archiva.common.utils.FileUtils.writeStringToFile( 
returnedMetadata, Charset.defaultCharset(), response.getContentAsString() );
         ArchivaRepositoryMetadata metadata = MavenMetadataReader.read( 
returnedMetadata );
 
@@ -300,7 +285,7 @@ public class RepositoryServletRepositoryGroupTest
         assertResponseOK( response );
 
         assertThat( response.getContentAsString() )
-            .isEqualTo( "add113b0d7f8c6adb92a5015a7a3701081edf998  
maven-metadata-group-with-valid-repos.xml" );
+            .startsWith( "add113b0d7f8c6adb92a5015a7a3701081edf998" );
 
         // request the md5 checksum of the metadata
         request = new GetMethodWebRequest( "http://machine.com/repository/"; + 
REPO_GROUP_WITH_VALID_REPOS + "/dummy/"
@@ -310,7 +295,7 @@ public class RepositoryServletRepositoryGroupTest
         assertResponseOK( response );
 
         assertThat( response.getContentAsString() )
-            .isEqualTo( "5b85ea4aa5f52bb76760041a52f98de8  
maven-metadata-group-with-valid-repos.xml" );
+            .startsWith( "5b85ea4aa5f52bb76760041a52f98de8" );
     }
 
     // MRM-901
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/resources/log4j2-test.xml 
b/archiva-modules/archiva-web/archiva-webdav/src/test/resources/log4j2-test.xml
index 0da8a7f..0d5a52a 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/resources/log4j2-test.xml
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/resources/log4j2-test.xml
@@ -43,6 +43,7 @@
     <logger name="org.apache.archiva.rest.services" level="info"/>
     <logger name="org.springframework" level="info"/>
     <logger name="org.apache.commons.configuration" level="info"/>
+    <logger name="org.apache.archiva.indexer.maven" level="debug" />
 
     <root level="info">
       <appender-ref ref="console"/>

Reply via email to