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 380c152  Using storageAsset for Index API
380c152 is described below

commit 380c152114e6e8648558bb9f24ac529dc2d7d811
Author: Martin Stockhammer <[email protected]>
AuthorDate: Sat Jun 22 19:31:49 2019 +0200

    Using storageAsset for Index API
---
 .../repository/mock/RepositoryProviderMock.java    |  28 +++++
 .../group/DefaultRepositoryGroupAdmin.java         |   7 +-
 .../admin/mock/ArchivaIndexManagerMock.java        |  30 +++--
 .../mock/MockMergedRemoteIndexesScheduler.java     |   2 +-
 .../archiva/indexer/GenericIndexManager.java       | 128 ---------------------
 .../repository/EditableRepositoryGroup.java        |   2 -
 .../apache/archiva/repository/RelocatablePath.java |  18 +++
 .../apache/archiva/repository/RepositoryGroup.java |   6 -
 .../archiva/repository/RequestPathMapper.java      |  18 +++
 .../repository/features/IndexCreationFeature.java  |  13 ++-
 .../archiva/indexer/merger/BasicIndexMerger.java}  |  75 +++---------
 .../DefaultMergedRemoteIndexesScheduler.java       |  36 ++++--
 .../repository/AbstractRepositoryGroup.java        |  12 --
 .../src/test/resources/spring-context.xml          |   7 ++
 .../archiva/indexer/maven/DefaultIndexMerger.java  |   1 -
 .../archiva/indexer/maven/MavenIndexManager.java   |  65 +++++------
 .../repository/maven2/MavenRepositoryGroup.java    |   7 +-
 .../repository/maven2/MavenRepositoryProvider.java |  27 ++++-
 .../index/mock/ArchivaIndexManagerMock.java        |  30 +++--
 .../maven2/MavenRepositoryProviderTest.java        |  10 +-
 .../maven/ArchivaIndexingTaskExecutor.java         |   4 +-
 .../maven/ArchivaIndexingTaskExecutorTest.java     |  44 ++++---
 .../apache/archiva/webdav/ArchivaDavResource.java  |   2 +-
 .../archiva/webdav/ArchivaDavResourceFactory.java  | 106 ++++++++---------
 .../webdav/ArchivaDavResourceFactoryTest.java      |   2 +-
 .../org/apache/archiva/webdav/DavResourceTest.java |  22 +++-
 .../webdav/UnauthenticatedDavResourceFactory.java  |   2 +-
 .../archiva/configuration/StubConfiguration.java   |   6 +
 28 files changed, 333 insertions(+), 377 deletions(-)

diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
index 303fd76..b4df20d 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
@@ -21,10 +21,12 @@ package org.apache.archiva.repository.mock;
 
 import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
+import org.apache.archiva.configuration.RepositoryGroupConfiguration;
 import org.apache.archiva.repository.BasicManagedRepository;
 import org.apache.archiva.repository.BasicRemoteRepository;
 import org.apache.archiva.repository.EditableManagedRepository;
 import org.apache.archiva.repository.EditableRemoteRepository;
+import org.apache.archiva.repository.EditableRepositoryGroup;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.PasswordCredentials;
 import org.apache.archiva.repository.ReleaseScheme;
@@ -32,6 +34,7 @@ import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.RepositoryCredentials;
 import org.apache.archiva.repository.RepositoryEvent;
 import org.apache.archiva.repository.RepositoryException;
+import org.apache.archiva.repository.RepositoryGroup;
 import org.apache.archiva.repository.RepositoryProvider;
 import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
@@ -81,6 +84,13 @@ public class RepositoryProviderMock implements 
RepositoryProvider
     }
 
     @Override
+    public EditableRepositoryGroup createRepositoryGroup( String id, String 
name )
+    {
+
+        return null;
+    }
+
+    @Override
     public ManagedRepository createManagedInstance( 
ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
         BasicManagedRepository managedRepository = new BasicManagedRepository( 
configuration.getId( ), configuration.getName( ), 
Paths.get("target/repositories") );
@@ -176,6 +186,18 @@ public class RepositoryProviderMock implements 
RepositoryProvider
     }
 
     @Override
+    public RepositoryGroup createRepositoryGroup( RepositoryGroupConfiguration 
configuration ) throws RepositoryException
+    {
+        return null;
+    }
+
+    @Override
+    public void updateRepositoryGroupInstance( EditableRepositoryGroup 
repositoryGroup, RepositoryGroupConfiguration configuration ) throws 
RepositoryException
+    {
+
+    }
+
+    @Override
     public ManagedRepositoryConfiguration getManagedConfiguration( 
ManagedRepository managedRepository )
     {
         ManagedRepositoryConfiguration configuration = new 
ManagedRepositoryConfiguration( );
@@ -201,6 +223,12 @@ public class RepositoryProviderMock implements 
RepositoryProvider
         return configuration;
     }
 
+    @Override
+    public RepositoryGroupConfiguration getRepositoryGroupConfiguration( 
RepositoryGroup repositoryGroup ) throws RepositoryException
+    {
+        return null;
+    }
+
 
     @Override
     public RemoteRepositoryConfiguration getRemoteConfiguration( 
RemoteRepository remoteRepository )
diff --git 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
index 41ab30c..a4b766a 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
@@ -30,6 +30,7 @@ import 
org.apache.archiva.configuration.RepositoryGroupConfiguration;
 import org.apache.archiva.metadata.model.facets.AuditEvent;
 import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
 import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -394,7 +395,11 @@ public class DefaultRepositoryGroupAdmin
 
     private RepositoryGroup convertRepositoryGroupObject( 
org.apache.archiva.repository.RepositoryGroup group ) {
         RepositoryGroup rg = new RepositoryGroup( group.getId( ), 
group.getRepositories().stream().map(r -> r.getId()).collect( 
Collectors.toList()) );
-        rg.setMergedIndexPath( group.getMergedIndexPath().getPath() );
+        if (group.supportsFeature( IndexCreationFeature.class ))
+        {
+            IndexCreationFeature indexCreationFeature = group.getFeature( 
IndexCreationFeature.class ).get();
+            rg.setMergedIndexPath( 
indexCreationFeature.getIndexPath().getPath() );
+        }
         rg.setCronExpression( group.getSchedulingDefinition() );
         rg.setMergedIndexTtl( group.getMergedIndexTTL() );
         return rg;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/ArchivaIndexManagerMock.java
 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/ArchivaIndexManagerMock.java
index 126f421..7a78789 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/ArchivaIndexManagerMock.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/ArchivaIndexManagerMock.java
@@ -40,6 +40,8 @@ import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.Repository;
 import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
+import org.apache.archiva.repository.content.FilesystemAsset;
+import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.commons.lang.StringUtils;
@@ -477,7 +479,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         }
         if (context.supports(IndexingContext.class)) {
             try {
-                Path newPath = getIndexPath(repo);
+                StorageAsset newPath = getIndexPath(repo);
                 IndexingContext ctx = 
context.getBaseContext(IndexingContext.class);
                 Path oldPath = ctx.getIndexDirectoryFile().toPath();
                 if (oldPath.equals(newPath)) {
@@ -491,7 +493,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
                     return createContext(repo);
                 } else {
                     context.close(false);
-                    Files.move(oldPath, newPath);
+                    Files.move(oldPath, newPath.getFilePath());
                     return createContext(repo);
                 }
             } catch (IOException e) {
@@ -517,17 +519,22 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         }
     }
 
-    private Path getIndexPath(Repository repo) 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( ) ) )
         {
 
             indexDirectory = PathUtil.getPathFromUri( indexDir );
             // not absolute so create it in repository directory
-            if ( !indexDirectory.isAbsolute( ) )
+            if ( indexDirectory.isAbsolute( ) )
+            {
+                indexPath = indexDirectory.getFileName().toString();
+            }
+            else
             {
                 indexDirectory = repoDir.resolve( indexDirectory );
             }
@@ -535,13 +542,14 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         else
         {
             indexDirectory = repoDir.resolve( ".index" );
+            indexPath = ".index";
         }
 
         if ( !Files.exists( indexDirectory ) )
         {
             Files.createDirectories( indexDirectory );
         }
-        return indexDirectory;
+        return new FilesystemAsset( indexPath, indexDirectory);
     }
 
     private IndexingContext createRemoteContext(RemoteRepository 
remoteRepository ) throws IOException
@@ -558,7 +566,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
             Files.createDirectories( repoDir );
         }
 
-        Path indexDirectory = null;
+        StorageAsset indexDirectory = null;
 
         // is there configured indexDirectory ?
         if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
@@ -577,7 +585,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
                 // 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 );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory.getFilePath() );
                 return getIndexingContext( remoteRepository, contextKey, 
repoDir, indexDirectory, remoteIndexUrl );
 
             }
@@ -588,9 +596,9 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         }
     }
 
-    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws 
IOException
+    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws 
IOException
     {
-        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.toFile( ),
+        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
                 repository.getLocation( ) == null ? null : 
repository.getLocation( ).toString( ),
                 indexUrl,
                 true, false,
@@ -616,7 +624,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
             }
         }
 
-        Path indexDirectory = null;
+        StorageAsset indexDirectory = null;
 
         if ( repository.supportsFeature( IndexCreationFeature.class ) )
         {
@@ -634,7 +642,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
                 // 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 );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory.getFilePath() );
                 context = getIndexingContext( repository, repository.getId( ), 
repositoryDirectory, indexDirectory, indexUrl );
                 context.setSearchable( repository.isScanned( ) );
             }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
index 6cd910c..4cb8ca7 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
@@ -19,8 +19,8 @@ package org.apache.archiva.admin.mock;
  * under the License.
  */
 
-import org.apache.archiva.admin.model.beans.RepositoryGroup;
 import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
+import org.apache.archiva.repository.RepositoryGroup;
 import org.springframework.stereotype.Service;
 
 import java.nio.file.Path;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/GenericIndexManager.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/GenericIndexManager.java
deleted file mode 100644
index 9ec3f90..0000000
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/GenericIndexManager.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package org.apache.archiva.indexer;
-
-/*
- * 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.common.utils.PathUtil;
-import org.apache.archiva.repository.Repository;
-import org.apache.archiva.repository.RepositoryType;
-import org.apache.archiva.repository.features.IndexCreationFeature;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.net.URI;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Collection;
-
-@Service("indexManager#none")
-public class GenericIndexManager implements ArchivaIndexManager {
-
-    private final Logger log = 
LoggerFactory.getLogger(GenericIndexManager.class);
-
-    public static final String DEFAULT_INDEXER_DIR = ".indexer";
-
-    @Override
-    public void pack(ArchivaIndexingContext context) {
-
-    }
-
-    @Override
-    public void scan(ArchivaIndexingContext context) {
-
-    }
-
-    @Override
-    public void update(ArchivaIndexingContext context, boolean fullUpdate) {
-
-    }
-
-    @Override
-    public void addArtifactsToIndex(ArchivaIndexingContext context, 
Collection<URI> artifactReference) {
-
-    }
-
-    @Override
-    public void removeArtifactsFromIndex(ArchivaIndexingContext context, 
Collection<URI> artifactReference) {
-
-    }
-
-    @Override
-    public boolean supportsRepository(RepositoryType type) {
-        return false;
-    }
-
-    @Override
-    public ArchivaIndexingContext createContext(Repository repository) {
-        return null;
-    }
-
-    @Override
-    public ArchivaIndexingContext reset(ArchivaIndexingContext context) throws 
IndexUpdateFailedException {
-        return null;
-    }
-
-    @Override
-    public ArchivaIndexingContext move(ArchivaIndexingContext context, 
Repository repo) throws IndexCreationFailedException {
-        return null;
-    }
-
-    @Override
-    public void updateLocalIndexPath(Repository repo) {
-        if (repo.supportsFeature(IndexCreationFeature.class)) {
-            IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-            try {
-                icf.setLocalIndexPath(getIndexPath(repo));
-            } catch (IOException e) {
-                log.error("Could not set local index path for {}. New URI: 
{}", repo.getId(), icf.getIndexPath());
-            }
-        }
-    }
-
-    private Path getIndexPath(Repository repo) throws IOException {
-        IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        Path repoDir = repo.getLocalPath();
-        URI indexDir = icf.getIndexPath();
-        Path indexDirectory = null;
-        if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
-        {
-
-            indexDirectory = PathUtil.getPathFromUri( indexDir );
-            // not absolute so create it in repository directory
-            if ( !indexDirectory.isAbsolute( ) )
-            {
-                indexDirectory = repoDir.resolve( indexDirectory );
-            }
-        }
-        else
-        {
-            indexDirectory = repoDir.resolve( DEFAULT_INDEXER_DIR);
-        }
-
-        if ( !Files.exists( indexDirectory ) )
-        {
-            Files.createDirectories( indexDirectory );
-        }
-        return indexDirectory;
-    }
-
-}
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/EditableRepositoryGroup.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/EditableRepositoryGroup.java
index dff3dc8..60e955b 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/EditableRepositoryGroup.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/EditableRepositoryGroup.java
@@ -35,7 +35,5 @@ public interface EditableRepositoryGroup extends 
EditableRepository,RepositoryGr
 
     ManagedRepository removeRepository(String repoId);
 
-    void setMergedIndexPath(String path);
-
     void setMergedIndexTTL(int timeInSeconds);
 }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RelocatablePath.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RelocatablePath.java
index 055abe4..aa200c4 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RelocatablePath.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RelocatablePath.java
@@ -1,4 +1,22 @@
 package org.apache.archiva.repository;
+/*
+ * 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.
+ */
 
 /**
  * @author Martin Stockhammer <[email protected]>
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryGroup.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryGroup.java
index 93b368c..8386c58 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryGroup.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryGroup.java
@@ -64,12 +64,6 @@ public interface RepositoryGroup extends Repository, 
RepositoryStorage {
     boolean contains(String id);
 
     /**
-     * Returns the path to the merged index
-     * @return
-     */
-    StorageAsset getMergedIndexPath();
-
-    /**
      * Returns the time to live in seconds for the merged index.
      *
      * @return
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RequestPathMapper.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RequestPathMapper.java
index d06615f..e438b44 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RequestPathMapper.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RequestPathMapper.java
@@ -1,4 +1,22 @@
 package org.apache.archiva.repository;
+/*
+ * 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.
+ */
 
 /**
  *
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 5e68fdd..d22f1df 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
@@ -22,6 +22,7 @@ package org.apache.archiva.repository.features;
 
 import org.apache.archiva.repository.Repository;
 import org.apache.archiva.repository.RepositoryEventListener;
+import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.commons.lang.StringUtils;
 
 import java.net.URI;
@@ -44,9 +45,9 @@ public class IndexCreationFeature extends AbstractFeature 
implements RepositoryF
 
     private URI packedIndexPath;
 
-    private Path localIndexPath;
+    private StorageAsset localIndexPath;
 
-    private Path localPackedIndexPath;
+    private StorageAsset localPackedIndexPath;
 
     private Repository repo;
 
@@ -126,7 +127,7 @@ public class IndexCreationFeature extends AbstractFeature 
implements RepositoryF
      *
      * @return
      */
-    public Path getLocalIndexPath() {
+    public StorageAsset getLocalIndexPath() {
         return localIndexPath;
     }
 
@@ -136,7 +137,7 @@ public class IndexCreationFeature extends AbstractFeature 
implements RepositoryF
      *
      * @param localIndexPath
      */
-    public void setLocalIndexPath(Path localIndexPath) {
+    public void setLocalIndexPath(StorageAsset localIndexPath) {
         this.localIndexPath = localIndexPath;
     }
 
@@ -163,7 +164,7 @@ public class IndexCreationFeature extends AbstractFeature 
implements RepositoryF
      * Returns the directory where the packed index is stored.
      * @return
      */
-    public Path getLocalPackedIndexPath() {
+    public StorageAsset getLocalPackedIndexPath() {
         return localPackedIndexPath;
     }
 
@@ -173,7 +174,7 @@ public class IndexCreationFeature extends AbstractFeature 
implements RepositoryF
      *
      * @param localPackedIndexPath
      */
-    public void setLocalPackedIndexPath(Path localPackedIndexPath) {
+    public void setLocalPackedIndexPath(StorageAsset localPackedIndexPath) {
         this.localPackedIndexPath = localPackedIndexPath;
     }
 
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/BasicIndexMerger.java
similarity index 59%
copy from 
archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
copy to 
archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/BasicIndexMerger.java
index e418341..8df80d7 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/BasicIndexMerger.java
@@ -1,4 +1,5 @@
-package org.apache.archiva.indexer.maven;
+package org.apache.archiva.indexer.merger;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,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
@@ -20,26 +21,11 @@ package org.apache.archiva.indexer.maven;
 
 import org.apache.archiva.common.utils.FileUtils;
 import org.apache.archiva.indexer.ArchivaIndexingContext;
-import org.apache.archiva.indexer.UnsupportedBaseContextException;
-import org.apache.archiva.indexer.maven.MavenIndexContext;
-import org.apache.archiva.indexer.merger.IndexMerger;
-import org.apache.archiva.indexer.merger.IndexMergerException;
-import org.apache.archiva.indexer.merger.IndexMergerRequest;
-import org.apache.archiva.indexer.merger.TemporaryGroupIndex;
 import org.apache.archiva.repository.RepositoryRegistry;
-import org.apache.archiva.repository.RepositoryType;
 import org.apache.commons.lang.time.StopWatch;
-import org.apache.maven.index.Indexer;
-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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
 
 import javax.inject.Inject;
 import java.io.IOException;
@@ -48,47 +34,31 @@ import java.nio.file.Path;
 import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 
 /**
- * @author Olivier Lamy
- * @since 1.4-M2
+ * @author Martin Stockhammer <[email protected]>
  */
-@Service("indexMerger#default")
-public class DefaultIndexMerger
-    implements IndexMerger
+public class BasicIndexMerger implements IndexMerger
 {
-
     @Inject
     RepositoryRegistry repositoryRegistry;
 
     private Logger log = LoggerFactory.getLogger( getClass() );
 
 
-    private final IndexPacker indexPacker;
-
-    private Indexer indexer;
-
-    private final List<IndexCreator> indexCreators;
-
     private List<TemporaryGroupIndex> temporaryGroupIndexes = new 
CopyOnWriteArrayList<>();
 
-    private List<IndexingContext>  temporaryContextes = new 
CopyOnWriteArrayList<>(  );
-
     private List<String> runningGroups = new CopyOnWriteArrayList<>();
 
     @Inject
-    public DefaultIndexMerger( Indexer indexer, IndexPacker indexPacker, 
List<IndexCreator> indexCreators )
+    public BasicIndexMerger( )
     {
-        this.indexer = indexer;
-        this.indexPacker = indexPacker;
-        this.indexCreators = indexCreators;
     }
 
     @Override
-    public ArchivaIndexingContext buildMergedIndex(IndexMergerRequest 
indexMergerRequest )
+    public ArchivaIndexingContext buildMergedIndex( IndexMergerRequest 
indexMergerRequest )
         throws IndexMergerException
     {
         String groupId = indexMergerRequest.getGroupId();
@@ -113,41 +83,27 @@ public class DefaultIndexMerger
         {
             Path indexLocation = mergedIndexDirectory.resolve( 
indexMergerRequest.getMergedIndexPath() );
 
-            List<IndexingContext> members = 
indexMergerRequest.getRepositoriesIds( ).stream( ).map( id ->
-                repositoryRegistry.getRepository( id ) ).filter( repo -> 
repo.getType().equals( RepositoryType.MAVEN ) )
-                .map( repo -> {
-                    try
-                    {
-                        return repo.getIndexingContext().getBaseContext( 
IndexingContext.class );
-                    }
-                    catch ( UnsupportedBaseContextException e )
-                    {
-                        return null;
-                        // Ignore
-                    }
-                } ).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();
+            List<ArchivaIndexingContext> members = 
indexMergerRequest.getRepositoriesIds( ).stream( ).map( id ->
+                repositoryRegistry.getRepository( id ) )
+                .map( repo -> repo.getIndexingContext() ).filter( 
Objects::nonNull ).collect( Collectors.toList() );
 
+            members.get( 0 ).
             if ( indexMergerRequest.isPackIndex() )
             {
                 IndexPackingRequest request = new IndexPackingRequest( 
mergedCtx, //
-                                                                       
mergedCtx.acquireIndexSearcher().getIndexReader(), //
-                                                                       
indexLocation.toFile() );
+                    mergedCtx.acquireIndexSearcher().getIndexReader(), //
+                    indexLocation.toFile() );
                 indexPacker.packIndex( request );
             }
 
             if ( indexMergerRequest.isTemporary() )
             {
                 temporaryGroupIndexes.add( new TemporaryGroupIndex( 
mergedIndexDirectory, tempRepoId, groupId,
-                                                                    
indexMergerRequest.getMergedIndexTtl() ) );
-                temporaryContextes.add(mergedCtx);
+                    indexMergerRequest.getMergedIndexTtl() ) );
             }
             stopWatch.stop();
             log.info( "merged index for repos {} in {} s", 
indexMergerRequest.getRepositoriesIds(),
-                      stopWatch.getTime() );
+                stopWatch.getTime() );
             return new 
MavenIndexContext(repositoryRegistry.getRepositoryGroup(groupId), mergedCtx);
         }
         catch ( IOException e)
@@ -196,4 +152,5 @@ public class DefaultIndexMerger
     {
         return this.temporaryGroupIndexes;
     }
+
 }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
index fb762b6..b2be611 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
@@ -21,6 +21,7 @@ package org.apache.archiva.indexer.merger;
 
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.RepositoryGroup;
+import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,20 +69,33 @@ public class DefaultMergedRemoteIndexesScheduler
 
         List<ManagedRepository> repositories = 
repositoryGroup.getRepositories();
 
-        IndexMergerRequest indexMergerRequest =
-            new IndexMergerRequest( repositories.stream().map(r -> 
r.getId()).collect(Collectors.toList()), true, repositoryGroup.getId(),
-                    
repositoryGroup.getMergedIndexPath().getFilePath().toString(),
-                                    repositoryGroup.getMergedIndexTTL() 
).mergedIndexDirectory( directory );
+        if (repositoryGroup.supportsFeature( IndexCreationFeature.class ))
+        {
+
+            IndexCreationFeature indexCreationFeature = 
repositoryGroup.getFeature( IndexCreationFeature.class ).get();
+            Path indexPath = 
indexCreationFeature.getLocalIndexPath().getFilePath();
+            if (indexPath!=null)
+            {
+                IndexMergerRequest indexMergerRequest =
+                    new IndexMergerRequest( repositories.stream( ).map( r -> 
r.getId( ) ).collect( Collectors.toList( ) ), true, repositoryGroup.getId( ),
+                        indexPath.toString( ),
+                        repositoryGroup.getMergedIndexTTL( ) 
).mergedIndexDirectory( directory );
 
-        MergedRemoteIndexesTaskRequest taskRequest =
-            new MergedRemoteIndexesTaskRequest( indexMergerRequest, 
indexMerger );
+                MergedRemoteIndexesTaskRequest taskRequest =
+                    new MergedRemoteIndexesTaskRequest( indexMergerRequest, 
indexMerger );
 
-        logger.info( "schedule merge remote index for group {} with cron {}", 
repositoryGroup.getId(),
-                     repositoryGroup.getSchedulingDefinition() );
+                logger.info( "schedule merge remote index for group {} with 
cron {}", repositoryGroup.getId( ),
+                    repositoryGroup.getSchedulingDefinition( ) );
 
-        ScheduledFuture scheduledFuture =
-            taskScheduler.schedule( new MergedRemoteIndexesTask( taskRequest 
), cronTrigger );
-        scheduledFutureMap.put( repositoryGroup.getId(), scheduledFuture );
+                ScheduledFuture scheduledFuture =
+                    taskScheduler.schedule( new MergedRemoteIndexesTask( 
taskRequest ), cronTrigger );
+                scheduledFutureMap.put( repositoryGroup.getId( ), 
scheduledFuture );
+            } else {
+                logger.error("Requested index merger for repository group {} 
with non local index path {}", repositoryGroup.getId(), 
indexCreationFeature.getLocalIndexPath());
+            }
+        } else {
+            logger.error("Scheduling merged index for repository group {}, but 
it does not support IndexCreationFeature.", repositoryGroup.getId());
+        }
     }
 
     @Override
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 11be643..1fb61f5 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
@@ -40,8 +40,6 @@ public class AbstractRepositoryGroup extends 
AbstractRepository implements Edita
 
     private ListOrderedMap<String, ManagedRepository> repositories = new 
ListOrderedMap<>();
 
-    private String mergedIndexPath;
-
     private int mergedIndexTTL;
 
     private final ReadWriteLock rwl = new ReentrantReadWriteLock();
@@ -133,11 +131,6 @@ public class AbstractRepositoryGroup extends 
AbstractRepository implements Edita
     }
 
     @Override
-    public void setMergedIndexPath(String path) {
-        this.mergedIndexPath = path;
-    }
-
-    @Override
     public void setMergedIndexTTL(int timeInSeconds) {
         this.mergedIndexTTL = timeInSeconds;
     }
@@ -173,11 +166,6 @@ public class AbstractRepositoryGroup extends 
AbstractRepository implements Edita
     }
 
     @Override
-    public StorageAsset getMergedIndexPath() {
-        return storage.getAsset(mergedIndexPath);
-    }
-
-    @Override
     public int getMergedIndexTTL() {
         return mergedIndexTTL;
     }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context.xml
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context.xml
index 4c58e4d..1d41a6e 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context.xml
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/resources/spring-context.xml
@@ -47,4 +47,11 @@
   </bean>
 
 
+  <bean name="taskScheduler#mergeRemoteIndexes"
+        
class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
+    <property name="poolSize" value="4"/>
+    <property name="threadGroupName" value="mergeRemoteIndexes"/>
+  </bean>
+
+
 </beans>
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
index e418341..12607ce 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
@@ -21,7 +21,6 @@ package org.apache.archiva.indexer.maven;
 import org.apache.archiva.common.utils.FileUtils;
 import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.indexer.UnsupportedBaseContextException;
-import org.apache.archiva.indexer.maven.MavenIndexContext;
 import org.apache.archiva.indexer.merger.IndexMerger;
 import org.apache.archiva.indexer.merger.IndexMergerException;
 import org.apache.archiva.indexer.merger.IndexMergerRequest;
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 375f726..f75ebcf 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
@@ -40,6 +40,8 @@ import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.Repository;
 import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
+import org.apache.archiva.repository.content.FilesystemAsset;
+import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.commons.lang.StringUtils;
@@ -492,7 +494,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         }
         if (context.supports(IndexingContext.class)) {
             try {
-                Path newPath = getIndexPath(repo);
+                StorageAsset newPath = getIndexPath(repo);
                 IndexingContext ctx = 
context.getBaseContext(IndexingContext.class);
                 Path oldPath = ctx.getIndexDirectoryFile().toPath();
                 if (oldPath.equals(newPath)) {
@@ -506,7 +508,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
                     return createContext(repo);
                 } else {
                     context.close(false);
-                    Files.move(oldPath, newPath);
+                    Files.move(oldPath, newPath.getFilePath());
                     return createContext(repo);
                 }
             } catch (IOException e) {
@@ -533,58 +535,45 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         }
     }
 
-    private Path getIndexPath(Repository repo) throws IOException {
-        IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        Path repoDir = repo.getLocalPath();
-        URI indexDir = icf.getIndexPath();
+    private StorageAsset getIndexPath(URI indexDir, Path repoDir, String 
defaultDir) throws IOException
+    {
+        String indexPath = indexDir.getPath();
         Path indexDirectory = null;
         if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
         {
 
             indexDirectory = PathUtil.getPathFromUri( indexDir );
             // not absolute so create it in repository directory
-            if ( !indexDirectory.isAbsolute( ) )
+            if ( indexDirectory.isAbsolute( ) )
+            {
+                indexPath = indexDirectory.getFileName().toString();
+            }
+            else
             {
                 indexDirectory = repoDir.resolve( indexDirectory );
             }
         }
         else
         {
-            indexDirectory = repoDir.resolve( DEFAULT_INDEXER_DIR );
+            indexDirectory = repoDir.resolve( defaultDir );
+            indexPath = defaultDir;
         }
 
         if ( !Files.exists( indexDirectory ) )
         {
             Files.createDirectories( indexDirectory );
         }
-        return indexDirectory;
+        return new FilesystemAsset( indexPath, indexDirectory);
     }
 
-    private Path getPackedIndexPath(Repository repo) throws IOException {
+    private StorageAsset getIndexPath( Repository repo) throws IOException {
         IndexCreationFeature icf = 
repo.getFeature(IndexCreationFeature.class).get();
-        Path repoDir = repo.getLocalPath();
-        URI indexDir = icf.getPackedIndexPath();
-        Path indexDirectory = null;
-        if ( ! StringUtils.isEmpty(indexDir.toString( ) ) )
-        {
-
-            indexDirectory = PathUtil.getPathFromUri( indexDir );
-            // not absolute so create it in repository directory
-            if ( !indexDirectory.isAbsolute( ) )
-            {
-                indexDirectory = repoDir.resolve( indexDirectory );
-            }
-        }
-        else
-        {
-            indexDirectory = repoDir.resolve( DEFAULT_PACKED_INDEX_DIR );
-        }
+        return getIndexPath( icf.getIndexPath(), repo.getLocalPath(), 
DEFAULT_INDEXER_DIR );
+    }
 
-        if ( !Files.exists( indexDirectory ) )
-        {
-            Files.createDirectories( indexDirectory );
-        }
-        return indexDirectory;
+    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
@@ -601,7 +590,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
             Files.createDirectories( repoDir );
         }
 
-        Path indexDirectory = null;
+        StorageAsset indexDirectory = null;
 
         // is there configured indexDirectory ?
         if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
@@ -620,7 +609,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
                 // 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 );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory.getFilePath() );
                 return getIndexingContext( remoteRepository, contextKey, 
repoDir, indexDirectory, remoteIndexUrl );
 
             }
@@ -631,9 +620,9 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
         }
     }
 
-    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws 
IOException
+    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws 
IOException
     {
-        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.toFile( ),
+        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
             repository.getLocation( ) == null ? null : repository.getLocation( 
).toString( ),
             indexUrl,
             true, false,
@@ -659,7 +648,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
             }
         }
 
-        Path indexDirectory = null;
+        StorageAsset indexDirectory = null;
 
         if ( repository.supportsFeature( IndexCreationFeature.class ) )
         {
@@ -677,7 +666,7 @@ public class MavenIndexManager implements 
ArchivaIndexManager {
                 // 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 );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory.getFilePath() );
                 context = getIndexingContext( repository, repository.getId( ), 
repositoryDirectory, indexDirectory, indexUrl );
                 context.setSearchable( repository.isScanned( ) );
             }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryGroup.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryGroup.java
index 24c0b95..094d182 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryGroup.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryGroup.java
@@ -22,6 +22,7 @@ package org.apache.archiva.repository.maven2;
 import org.apache.archiva.common.filelock.FileLockManager;
 import org.apache.archiva.repository.*;
 import org.apache.archiva.repository.content.FilesystemStorage;
+import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,7 +37,7 @@ public class MavenRepositoryGroup extends 
AbstractRepositoryGroup implements Edi
             new ReleaseScheme[] { ReleaseScheme.RELEASE, 
ReleaseScheme.SNAPSHOT },
             new String[] { MavenManagedRepository.DEFAULT_LAYOUT, 
MavenManagedRepository.LEGACY_LAYOUT},
             new String[] {},
-            new String[] {},
+            new String[] {IndexCreationFeature.class.getName()},
             false,
             false,
             false,
@@ -48,6 +49,8 @@ public class MavenRepositoryGroup extends 
AbstractRepositoryGroup implements Edi
 
     private FileLockManager lockManager;
     private FilesystemStorage fsStorage;
+    private IndexCreationFeature indexCreationFeature;
+
 
     public MavenRepositoryGroup(String id, String name, Path repositoryBase, 
FileLockManager lockManager) {
         super(RepositoryType.MAVEN, id, name, repositoryBase);
@@ -78,5 +81,7 @@ public class MavenRepositoryGroup extends 
AbstractRepositoryGroup implements Edi
             throw new RuntimeException("Fatal error while accessing repository 
path "+ getRepositoryBase(), e);
         }
         setStorage(fsStorage);
+        this.indexCreationFeature = new IndexCreationFeature(this, this);
+        addFeature( this.indexCreationFeature );
     }
 }
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 f046026..0584dee 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
@@ -22,6 +22,7 @@ package org.apache.archiva.repository.maven2;
 import org.apache.archiva.common.filelock.FileLockManager;
 import org.apache.archiva.configuration.*;
 import org.apache.archiva.repository.*;
+import org.apache.archiva.repository.content.FilesystemAsset;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
@@ -252,9 +253,26 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
     @Override
     public void updateRepositoryGroupInstance(EditableRepositoryGroup 
repositoryGroup, RepositoryGroupConfiguration configuration) throws 
RepositoryException {
         repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), 
configuration.getName());
-        repositoryGroup.setMergedIndexPath(configuration.getMergedIndexPath());
         repositoryGroup.setMergedIndexTTL(configuration.getMergedIndexTtl());
         
repositoryGroup.setSchedulingDefinition(configuration.getCronExpression());
+        if (repositoryGroup.supportsFeature( IndexCreationFeature.class )) {
+            IndexCreationFeature indexCreationFeature = 
repositoryGroup.getFeature( IndexCreationFeature.class ).get();
+            try
+            {
+                indexCreationFeature.setIndexPath( new 
URI(configuration.getMergedIndexPath()) );
+                Path localPath = 
Paths.get(indexCreationFeature.getIndexPath());
+                if (localPath.isAbsolute()) {
+                    indexCreationFeature.setLocalIndexPath( new 
FilesystemAsset(localPath.getFileName().toString(), localPath) );
+                } else
+                {
+                    indexCreationFeature.setLocalIndexPath( new 
FilesystemAsset(localPath.toString(), 
archivaConfiguration.getRepositoryGroupBaseDir( ).resolve( localPath )));
+                }
+            }
+            catch ( URISyntaxException e )
+            {
+                log.error("Could not set the index path for repository group 
{}", repositoryGroup.getId());
+            }
+        }
         // References to other repositories are set filled by the registry
     }
 
@@ -351,7 +369,12 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
         RepositoryGroupConfiguration cfg = new RepositoryGroupConfiguration();
         cfg.setId(repositoryGroup.getId());
         cfg.setName(repositoryGroup.getName());
-        cfg.setMergedIndexPath(repositoryGroup.getMergedIndexPath().getPath());
+        if (repositoryGroup.supportsFeature( IndexCreationFeature.class ))
+        {
+            IndexCreationFeature indexCreationFeature = 
repositoryGroup.getFeature( IndexCreationFeature.class ).get();
+
+            cfg.setMergedIndexPath( 
indexCreationFeature.getIndexPath().toString() );
+        }
         cfg.setMergedIndexTtl(repositoryGroup.getMergedIndexTTL());
         cfg.setRepositories(repositoryGroup.getRepositories().stream().map(r 
-> r.getId()).collect(Collectors.toList()));
         cfg.setCronExpression(repositoryGroup.getSchedulingDefinition());
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
index de3ea76..902199d 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/index/mock/ArchivaIndexManagerMock.java
@@ -40,6 +40,8 @@ import org.apache.archiva.repository.RemoteRepository;
 import org.apache.archiva.repository.Repository;
 import org.apache.archiva.repository.RepositoryType;
 import org.apache.archiva.repository.UnsupportedRepositoryTypeException;
+import org.apache.archiva.repository.content.FilesystemAsset;
+import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.commons.lang.StringUtils;
@@ -479,7 +481,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         }
         if (context.supports(IndexingContext.class)) {
             try {
-                Path newPath = getIndexPath(repo);
+                StorageAsset newPath = getIndexPath(repo);
                 IndexingContext ctx = 
context.getBaseContext(IndexingContext.class);
                 Path oldPath = ctx.getIndexDirectoryFile().toPath();
                 if (oldPath.equals(newPath)) {
@@ -493,7 +495,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
                     return createContext(repo);
                 } else {
                     context.close(false);
-                    Files.move(oldPath, newPath);
+                    Files.move(oldPath, newPath.getFilePath());
                     return createContext(repo);
                 }
             } catch (IOException e) {
@@ -520,17 +522,22 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
     }
 
 
-    private Path getIndexPath(Repository repo) 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( ) ) )
         {
 
             indexDirectory = PathUtil.getPathFromUri( indexDir );
             // not absolute so create it in repository directory
-            if ( !indexDirectory.isAbsolute( ) )
+            if ( indexDirectory.isAbsolute( ) )
+            {
+                indexPath = indexDirectory.getFileName().toString();
+            }
+            else
             {
                 indexDirectory = repoDir.resolve( indexDirectory );
             }
@@ -538,13 +545,14 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         else
         {
             indexDirectory = repoDir.resolve( ".index" );
+            indexPath = ".index";
         }
 
         if ( !Files.exists( indexDirectory ) )
         {
             Files.createDirectories( indexDirectory );
         }
-        return indexDirectory;
+        return new FilesystemAsset( indexPath, indexDirectory );
     }
 
     private IndexingContext createRemoteContext(RemoteRepository 
remoteRepository ) throws IOException
@@ -561,7 +569,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
             Files.createDirectories( repoDir );
         }
 
-        Path indexDirectory = null;
+        StorageAsset indexDirectory = null;
 
         // is there configured indexDirectory ?
         if ( remoteRepository.supportsFeature( RemoteIndexFeature.class ) )
@@ -580,7 +588,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
                 // 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 );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory.getFilePath() );
                 return getIndexingContext( remoteRepository, contextKey, 
repoDir, indexDirectory, remoteIndexUrl );
 
             }
@@ -591,9 +599,9 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
         }
     }
 
-    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, Path indexDirectory, String indexUrl ) throws 
IOException
+    private IndexingContext getIndexingContext( Repository repository, String 
contextKey, Path repoDir, StorageAsset indexDirectory, String indexUrl ) throws 
IOException
     {
-        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.toFile( ),
+        return indexer.createIndexingContext( contextKey, repository.getId( ), 
repoDir.toFile( ), indexDirectory.getFilePath().toFile( ),
                 repository.getLocation( ) == null ? null : 
repository.getLocation( ).toString( ),
                 indexUrl,
                 true, false,
@@ -619,7 +627,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
             }
         }
 
-        Path indexDirectory = null;
+        StorageAsset indexDirectory = null;
 
         if ( repository.supportsFeature( IndexCreationFeature.class ) )
         {
@@ -637,7 +645,7 @@ public class ArchivaIndexManagerMock implements 
ArchivaIndexManager {
                 // 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 );
+                org.apache.archiva.common.utils.FileUtils.deleteDirectory( 
indexDirectory.getFilePath() );
                 context = getIndexingContext( repository, repository.getId( ), 
repositoryDirectory, indexDirectory, indexUrl );
                 context.setSearchable( repository.isScanned( ) );
             }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
index 8511b99..4280100 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
@@ -37,6 +37,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -295,7 +296,8 @@ public class MavenRepositoryProviderTest
     }
 
     @Test
-    public void getRepositoryGroupConfiguration() throws RepositoryException {
+    public void getRepositoryGroupConfiguration() throws RepositoryException, 
URISyntaxException
+    {
         MavenRepositoryGroup repositoryGroup = new 
MavenRepositoryGroup("group1","group1",Paths.get("target/groups"),
                 new DefaultFileLockManager());
         MavenManagedRepository repo1 = new MavenManagedRepository( "test01", 
"My Test repo", Paths.get("target/repositories") );
@@ -304,7 +306,8 @@ public class MavenRepositoryProviderTest
 
         repositoryGroup.setDescription(repositoryGroup.getPrimaryLocale(), 
"Repository group");
         repositoryGroup.setLayout("non-default");
-        repositoryGroup.setMergedIndexPath(".index2");
+        IndexCreationFeature indexCreationFeature = 
repositoryGroup.getFeature( IndexCreationFeature.class ).get();
+        indexCreationFeature.setIndexPath( new URI(".index2") );
         repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), "Repo 
Group 1");
         repositoryGroup.setMergedIndexTTL(1005);
         repositoryGroup.setSchedulingDefinition("0 0 04 ? * THU");
@@ -351,7 +354,8 @@ public class MavenRepositoryProviderTest
         assertEquals("group2", grp.getId());
         assertEquals("Group 2", grp.getName());
         assertEquals("0 0 03 ? * MON", grp.getSchedulingDefinition());
-        assertEquals(".index-abc", grp.getMergedIndexPath().getName());
+        IndexCreationFeature indexCreationFeature = grp.getFeature( 
IndexCreationFeature.class ).get();
+        assertEquals(".index-abc", indexCreationFeature.getIndexPath());
         assertEquals(504, grp.getMergedIndexTTL());
         assertEquals(0, grp.getRepositories().size());
         // assertTrue(grp.getRepositories().stream().anyMatch(r -> 
"test01".equals(r.getId())));
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-scheduler/src/main/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutor.java
 
b/archiva-modules/archiva-maven/archiva-maven-scheduler/src/main/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutor.java
index 8192cce..ea88d8f 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-scheduler/src/main/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutor.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-scheduler/src/main/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutor.java
@@ -262,14 +262,14 @@ public class ArchivaIndexingTaskExecutor
             if ( repository.supportsFeature( IndexCreationFeature.class ) )
             {
                 IndexCreationFeature icf = repository.getFeature( 
IndexCreationFeature.class ).get( );
-                if ( !icf.isSkipPackedIndexCreation( ) && 
icf.getLocalPackedIndexPath( ) != null )
+                if ( !icf.isSkipPackedIndexCreation( ) && 
icf.getLocalPackedIndexPath( ) != null && 
icf.getLocalIndexPath().getFilePath()!=null )
                 {
 
                     log.debug( "Creating packed index from {} on {}", 
context.getIndexDirectoryFile( ), icf.getLocalPackedIndexPath( ) );
                     IndexPackingRequest request = new IndexPackingRequest( 
context, //
                         context.acquireIndexSearcher( ).getIndexReader( ),
                         //
-                        icf.getLocalPackedIndexPath( ).toFile( ) );
+                        icf.getLocalPackedIndexPath( ).getFilePath().toFile( ) 
);
 
                     indexPacker.packIndex( request );
                     context.updateTimestamp( true );
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-scheduler/src/test/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutorTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-scheduler/src/test/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutorTest.java
index 758568b..a8ace80 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-scheduler/src/test/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutorTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-scheduler/src/test/java/org/apache/archiva/scheduler/indexing/maven/ArchivaIndexingTaskExecutorTest.java
@@ -26,6 +26,7 @@ import org.apache.archiva.repository.BasicManagedRepository;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ReleaseScheme;
 import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.content.StorageAsset;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.scheduler.indexing.ArtifactIndexingTask;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
@@ -275,20 +276,27 @@ public class ArchivaIndexingTaskExecutorTest
 
         Path basePath = repo.getLocalPath();
         IndexCreationFeature icf = repo.getFeature( IndexCreationFeature.class 
).get();
-        Path packedIndexDirectory = icf.getLocalPackedIndexPath();
-        Path indexerDirectory = icf.getLocalIndexPath();
-
-        for (Path dir : new Path[] { packedIndexDirectory, indexerDirectory }) 
{
-            Files.list(dir).filter(path -> 
path.getFileName().toString().startsWith("nexus-maven-repository-index"))
-                    .forEach(path ->
+        StorageAsset packedIndexDirectory = icf.getLocalPackedIndexPath();
+        StorageAsset indexerDirectory = icf.getLocalIndexPath();
+
+        for (StorageAsset dir : new StorageAsset[] { packedIndexDirectory, 
indexerDirectory }) {
+            if (dir.getFilePath()!=null)
+            {
+                Path localDirPath = dir.getFilePath();
+                Files.list( localDirPath ).filter( path -> path.getFileName( 
).toString( ).startsWith( "nexus-maven-repository-index" ) )
+                    .forEach( path ->
                     {
-                        try {
-                            System.err.println("Deleting " + path);
-                            Files.delete(path);
-                        } catch (IOException e) {
-                            e.printStackTrace();
+                        try
+                        {
+                            System.err.println( "Deleting " + path );
+                            Files.delete( path );
+                        }
+                        catch ( IOException e )
+                        {
+                            e.printStackTrace( );
                         }
-                    });
+                    } );
+            }
         }
 
 
@@ -310,20 +318,20 @@ public class ArchivaIndexingTaskExecutorTest
 
         indexingExecutor.executeTask( task );
 
-        assertTrue( Files.exists(packedIndexDirectory) );
-        assertTrue( Files.exists(indexerDirectory) );
+        assertTrue( Files.exists(packedIndexDirectory.getFilePath()) );
+        assertTrue( Files.exists(indexerDirectory.getFilePath()) );
 
         // test packed index file creation
         //no more zip
         //Assertions.assertThat(new File( indexerDirectory, 
"nexus-maven-repository-index.zip" )).exists();
-        Assertions.assertThat( 
Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.properties"
 ) ));
-        Assertions.assertThat( 
Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.gz" ) 
));
-        assertFalse( 
Files.exists(packedIndexDirectory.resolve("nexus-maven-repository-index.1.gz" ) 
 ));
+        Assertions.assertThat( 
Files.exists(packedIndexDirectory.getFilePath().resolve("nexus-maven-repository-index.properties"
 ) ));
+        Assertions.assertThat( 
Files.exists(packedIndexDirectory.getFilePath().resolve("nexus-maven-repository-index.gz"
 ) ));
+        assertFalse( 
Files.exists(packedIndexDirectory.getFilePath().resolve("nexus-maven-repository-index.1.gz"
 )  ));
 
         // unpack .zip index
         //unzipIndex( indexerDirectory.getPath(), destDir.getPath() );
 
-        DefaultIndexUpdater.FileFetcher fetcher = new 
DefaultIndexUpdater.FileFetcher( packedIndexDirectory.toFile() );
+        DefaultIndexUpdater.FileFetcher fetcher = new 
DefaultIndexUpdater.FileFetcher( packedIndexDirectory.getFilePath().toFile() );
         IndexUpdateRequest updateRequest = new IndexUpdateRequest( 
getIndexingContext(), fetcher );
         //updateRequest.setLocalIndexCacheDir( indexerDirectory );
         indexUpdater.fetchAndUpdateIndex( updateRequest );
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 8269748..da68c1c 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
@@ -223,7 +223,7 @@ public class ArchivaDavResource
         }
         else if ( outputContext.hasStream() )
         {
-            IndexWriter writer = new IndexWriter( getContent(), asset, 
logicalResource );
+            IndexWriter writer = new IndexWriter( asset, logicalResource );
             writer.write( outputContext );
         }
     }
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 238cedb..e4f96c7 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
@@ -176,12 +176,6 @@ public class ArchivaDavResourceFactory
      */
     private final LockManager lockManager = new SimpleLockManager();
 
-    private ChecksummedFile checksum;
-
-    private Digester digestSha1;
-
-    private Digester digestMd5;
-
     @Inject
     @Named( value = "archivaTaskScheduler#repository" )
     private RepositoryArchivaTaskScheduler scheduler;
@@ -193,8 +187,7 @@ public class ArchivaDavResourceFactory
     private ApplicationContext applicationContext;
 
     @Inject
-    public ArchivaDavResourceFactory( ApplicationContext applicationContext, 
PlexusSisuBridge plexusSisuBridge,
-                                      ArchivaConfiguration 
archivaConfiguration )
+    public ArchivaDavResourceFactory( ApplicationContext applicationContext, 
ArchivaConfiguration archivaConfiguration )
         throws PlexusSisuBridgeException
     {
         this.archivaConfiguration = archivaConfiguration;
@@ -420,7 +413,12 @@ public class ArchivaDavResourceFactory
 
         String rootPath = StringUtils.substringBeforeLast( pathInfo, "/" );
 
-        if ( StringUtils.endsWith( rootPath, 
repoGroup.getMergedIndexPath().getPath() ) )
+        String mergedIndexPath = "/";
+        if (repoGroup.supportsFeature( IndexCreationFeature.class )) {
+            mergedIndexPath = repoGroup.getFeature( IndexCreationFeature.class 
).get().getIndexPath().getPath();
+        }
+
+        if ( StringUtils.endsWith( rootPath, mergedIndexPath ) )
         {
             // we are in the case of index file request
             String requestedFileName = StringUtils.substringAfterLast( 
pathInfo, "/" );
@@ -1044,11 +1042,16 @@ public class ArchivaDavResourceFactory
 
         // remove last /
         String pathInfo = StringUtils.removeEnd( request.getPathInfo(), "/" );
+        String mergedIndexPath = "/";
+        if (repositoryGroup.supportsFeature( IndexCreationFeature.class )) {
+            IndexCreationFeature indexCreationFeature = 
repositoryGroup.getFeature( IndexCreationFeature.class ).get();
+            mergedIndexPath = indexCreationFeature.getIndexPath().getPath();
+        }
 
         if ( allow )
         {
 
-            if ( StringUtils.endsWith( pathInfo, 
repositoryGroup.getMergedIndexPath().getPath() ) )
+            if ( StringUtils.endsWith( pathInfo, mergedIndexPath ) )
             {
                 Path mergedRepoDirPath =
                     buildMergedIndexDirectory( activePrincipal, request, 
repositoryGroup );
@@ -1061,7 +1064,7 @@ public class ArchivaDavResourceFactory
                 {
                     Path tmpDirectory = Paths.get( 
SystemUtils.getJavaIoTmpDir().toString(),
                                                   id,
-                                                      
repositoryGroup.getMergedIndexPath().getFilePath().toString() );
+                                                      mergedIndexPath );
                     if ( !Files.exists(tmpDirectory) )
                     {
                         synchronized ( 
tmpDirectory.toAbsolutePath().toString() )
@@ -1101,25 +1104,9 @@ public class ArchivaDavResourceFactory
                     {
                         // in case of group displaying index directory doesn't 
have sense !!
                         IndexCreationFeature idf = 
managedRepository.getRepository().getFeature(IndexCreationFeature.class).get();
-                        String repoIndexDirectory = 
idf.getIndexPath().toString();
-                        if ( StringUtils.isNotEmpty( repoIndexDirectory ) )
-                        {
-                            if ( !Paths.get( repoIndexDirectory ).isAbsolute() 
)
-                            {
-                                repoIndexDirectory = Paths.get( 
managedRepository.getRepository().getLocation() ).resolve(
-                                                               
StringUtils.isEmpty( repoIndexDirectory )
-                                                                   ? ".indexer"
-                                                                   : 
repoIndexDirectory ).toAbsolutePath().toString();
-                            }
-                        }
-                        if ( StringUtils.isEmpty( repoIndexDirectory ) )
-                        {
-                            repoIndexDirectory = Paths.get( 
managedRepository.getRepository().getLocation() ).resolve(
-                                                           ".indexer" 
).toAbsolutePath().toString();
-                        }
-
-                        if ( !StringUtils.equals( FilenameUtils.normalize( 
repoIndexDirectory ),
-                                                  FilenameUtils.normalize( 
resourceFile.toAbsolutePath().toString() ) ) )
+                        StorageAsset repoIndexDirectory = 
idf.getLocalIndexPath();
+                        if ( !StringUtils.equals( FilenameUtils.normalize( 
repoIndexDirectory.getPath() ),
+                                                  FilenameUtils.normalize( 
logicalResource.getPath() ) ) )
                         {
                             // for prompted authentication
                             if ( httpAuth.getSecuritySession( 
request.getSession( true ) ) != null )
@@ -1368,34 +1355,43 @@ public class ArchivaDavResourceFactory
                 }
 
             }
+
             log.info( "generate temporary merged index for repository group 
'{}' for repositories '{}'",
                     id, authzRepos );
 
-            Path tempRepoFile = Files.createTempDirectory( "temp" );
-            tempRepoFile.toFile().deleteOnExit();
-
-            IndexMergerRequest indexMergerRequest =
-                new IndexMergerRequest( authzRepos, true, id,
-                                        
repositoryGroup.getMergedIndexPath().getFilePath().toString(),
-                                        repositoryGroup.getMergedIndexTTL() 
).mergedIndexDirectory(
-                    tempRepoFile ).temporary( true );
-
-            MergedRemoteIndexesTaskRequest taskRequest =
-                new MergedRemoteIndexesTaskRequest( indexMergerRequest, 
indexMerger );
-
-            MergedRemoteIndexesTask job = new MergedRemoteIndexesTask( 
taskRequest );
-
-            ArchivaIndexingContext indexingContext = 
job.execute().getIndexingContext();
-
-            Path mergedRepoDir = Paths.get(indexingContext.getPath());
-            TemporaryGroupIndex temporaryGroupIndex =
-                new TemporaryGroupIndex( mergedRepoDir, 
indexingContext.getId(), id,
-                                         repositoryGroup.getMergedIndexTTL() ) 
//
-                    .setCreationTime( new Date().getTime() );
-            temporaryGroupIndexMap.put( id, temporaryGroupIndex );
-            session.setAttribute( 
TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY,
-                                  temporaryGroupIndexMap );
-            return mergedRepoDir;
+            IndexCreationFeature indexCreationFeature = 
repositoryGroup.getFeature( IndexCreationFeature.class ).get();
+            Path indexPath = 
indexCreationFeature.getLocalIndexPath().getFilePath();
+            if (indexPath!=null)
+            {
+                Path tempRepoFile = Files.createTempDirectory( "temp" );
+                tempRepoFile.toFile( ).deleteOnExit( );
+
+                IndexMergerRequest indexMergerRequest =
+                    new IndexMergerRequest( authzRepos, true, id,
+                        indexPath.toString( ),
+                        repositoryGroup.getMergedIndexTTL( ) 
).mergedIndexDirectory(
+                        tempRepoFile ).temporary( true );
+
+                MergedRemoteIndexesTaskRequest taskRequest =
+                    new MergedRemoteIndexesTaskRequest( indexMergerRequest, 
indexMerger );
+
+                MergedRemoteIndexesTask job = new MergedRemoteIndexesTask( 
taskRequest );
+
+                ArchivaIndexingContext indexingContext = job.execute( 
).getIndexingContext( );
+
+                Path mergedRepoDir = Paths.get( indexingContext.getPath( ) );
+                TemporaryGroupIndex temporaryGroupIndex =
+                    new TemporaryGroupIndex( mergedRepoDir, 
indexingContext.getId( ), id,
+                        repositoryGroup.getMergedIndexTTL( ) ) //
+                        .setCreationTime( new Date( ).getTime( ) );
+                temporaryGroupIndexMap.put( id, temporaryGroupIndex );
+                session.setAttribute( 
TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY,
+                    temporaryGroupIndexMap );
+                return mergedRepoDir;
+            } else {
+                log.error("Local index path for repository group {} does not 
exist.", repositoryGroup.getId());
+                throw new DavException( 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+            }
         }
         catch ( RepositorySearchException e )
         {
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 e153a54..8c7cf4a 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
@@ -718,7 +718,7 @@ public class ArchivaDavResourceFactoryTest
                                              ArchivaConfiguration 
archivaConfiguration )
             throws PlexusSisuBridgeException
         {
-            super( applicationContext, plexusSisuBridge, archivaConfiguration 
);
+            super( applicationContext, archivaConfiguration );
         }
 
         @Override
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 a9bef04..72b016f 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
@@ -22,6 +22,8 @@ package org.apache.archiva.webdav;
 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.content.FilesystemAsset;
 import org.apache.archiva.repository.events.AuditListener;
 import org.apache.archiva.repository.maven2.MavenManagedRepository;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
@@ -47,6 +49,7 @@ import org.junit.runner.RunWith;
 import org.springframework.test.context.ContextConfiguration;
 
 import javax.inject.Inject;
+import javax.servlet.http.HttpServletResponse;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -116,10 +119,10 @@ public class DavResourceTest
         }
     }
 
-    private DavResource getDavResource( String logicalPath, Path file )
+    private DavResource getDavResource( String logicalPath, Path file ) throws 
LayoutException
     {
-        return new ArchivaDavResource( file.toAbsolutePath().toString(), 
logicalPath, repository, session, resourceLocator,
-                                       resourceFactory, mimeTypes, 
Collections.<AuditListener> emptyList(), null, fileLockManager );
+        return new ArchivaDavResource( new FilesystemAsset( logicalPath, 
file.toAbsolutePath()) , logicalPath, repository, session, resourceLocator,
+                                       resourceFactory, mimeTypes, 
Collections.<AuditListener> emptyList(), null);
     }
 
     @Test
@@ -338,9 +341,16 @@ public class DavResourceTest
         public DavResource createResource( DavResourceLocator locator, 
DavSession session )
             throws DavException
         {
-            return new ArchivaDavResource( 
baseDir.toAbsolutePath().toString(), "/", repository, session, resourceLocator,
-                                           resourceFactory, mimeTypes, 
Collections.<AuditListener> emptyList(),
-                                           null, fileLockManager );
+            try
+            {
+                return new ArchivaDavResource( new FilesystemAsset( "/" , 
baseDir.toAbsolutePath()), "/", repository, session, resourceLocator,
+                                               resourceFactory, mimeTypes, 
Collections.<AuditListener> emptyList(),
+                                               null );
+            }
+            catch ( LayoutException e )
+            {
+                throw new DavException( 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e );
+            }
         }
     }
 }
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/UnauthenticatedDavResourceFactory.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/UnauthenticatedDavResourceFactory.java
index 081f1c9..0390913 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/UnauthenticatedDavResourceFactory.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/UnauthenticatedDavResourceFactory.java
@@ -43,7 +43,7 @@ public class UnauthenticatedDavResourceFactory
                                               ArchivaConfiguration 
archivaConfiguration )
         throws PlexusSisuBridgeException
     {
-        super( applicationContext, plexusSisuBridge, archivaConfiguration );
+        super( applicationContext, archivaConfiguration );
     }
 
     @Override
diff --git 
a/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/configuration/StubConfiguration.java
 
b/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/configuration/StubConfiguration.java
index 077edb9..50bf745 100644
--- 
a/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/configuration/StubConfiguration.java
+++ 
b/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/configuration/StubConfiguration.java
@@ -116,6 +116,12 @@ public class StubConfiguration
     }
 
     @Override
+    public Path getRepositoryGroupBaseDir( )
+    {
+        return getDataDirectory().resolve("group");
+    }
+
+    @Override
     public Path getDataDirectory() {
         if (configuration!=null && 
StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory()))
 {
             Path dataDir = 
Paths.get(configuration.getArchivaRuntimeConfiguration().getDataDirectory());

Reply via email to