You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2017/11/20 07:22:56 UTC

[1/3] archiva git commit: Resolving base paths in archiva configuration

Repository: archiva
Updated Branches:
  refs/heads/master 7236f4d8a -> 754b2d594


Resolving base paths in archiva configuration

Adding methods for retrieving base path information to ArchivaConfiguration
resolving paths according to the configuration entries.


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/2fe82276
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/2fe82276
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/2fe82276

Branch: refs/heads/master
Commit: 2fe8227634acfeaf7837e953e0f8fd2a44dae3a5
Parents: 7236f4d
Author: Martin Stockhammer <ma...@ars.de>
Authored: Thu Nov 16 19:54:13 2017 +0100
Committer: Martin Stockhammer <ma...@ars.de>
Committed: Thu Nov 16 20:01:32 2017 +0100

----------------------------------------------------------------------
 .../configuration/ArchivaConfiguration.java     | 12 ++++
 .../DefaultArchivaConfiguration.java            | 62 ++++++++++++++++++--
 2 files changed, 68 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/2fe82276/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
index acda2b7..e656b7e 100644
--- a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
+++ b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
@@ -95,5 +95,17 @@ public interface ArchivaConfiguration
     public List<Locale.LanguageRange> getLanguagePriorities();
 
     public Path getAppServerBaseDir();
+
+    /**
+     * Returns the base directory for repositories that have a relative location path set.
+     * @return
+     */
+    public Path getRepositoryBaseDir();
+
+    /**
+     * Returns the data directory where repositories and metadata reside
+     * @return
+     */
+    public Path getDataDirectory();
 }
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/2fe82276/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
----------------------------------------------------------------------
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 0222a42..b28bed2 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
@@ -174,11 +174,16 @@ public class DefaultArchivaConfiguration
 
     private List<Locale.LanguageRange> languagePriorities = new ArrayList<>(  );
 
+    private volatile Path dataDirectory;
+    private volatile Path repositoryBaseDirectory;
+
     @PostConstruct
     private void init() {
         languagePriorities = Locale.LanguageRange.parse( "en,fr,de" );
     }
 
+
+
     @Override
     public Configuration getConfiguration()
     {
@@ -223,15 +228,41 @@ public class DefaultArchivaConfiguration
         }
 
         Configuration config = new ConfigurationRegistryReader().read( subset );
-        if (StringUtils.isEmpty( config.getArchivaRuntimeConfiguration().getDataDirectory() )) {
-            Path appserverBaseDir = Paths.get(registry.getString("appserver.base", ""));
-            config.getArchivaRuntimeConfiguration().setDataDirectory( appserverBaseDir.normalize().toString() );
+
+        // Resolving data and repositories directories
+        // If the config entries are absolute, the path is used as it is
+        // if the config entries are empty, they are resolved:
+        //   dataDirectory = ${appserver.base}/data
+        //   repositoryDirectory = ${dataDirectory}/repositories
+        // If the entries are relative they are resolved
+        //   relative to the appserver.base, for dataDirectory
+        //   relative to dataDirectory for repositoryBase
+        String dataDir = config.getArchivaRuntimeConfiguration().getDataDirectory();
+        if (StringUtils.isEmpty( dataDir )) {
+            dataDirectory = getAppServerBaseDir().resolve( "data");
+        } else {
+            Path tmpDataDir = Paths.get(dataDir);
+            if (tmpDataDir.isAbsolute()) {
+                dataDirectory = tmpDataDir;
+            } else {
+                dataDirectory = getAppServerBaseDir().resolve(tmpDataDir);
+            }
         }
-        if (StringUtils.isEmpty( config.getArchivaRuntimeConfiguration().getRepositoryBaseDirectory())) {
-            Path baseDir = Paths.get(config.getArchivaRuntimeConfiguration().getDataDirectory());
-            config.getArchivaRuntimeConfiguration().setRepositoryBaseDirectory( baseDir.resolve("repositories").toString() );
+        config.getArchivaRuntimeConfiguration().setDataDirectory( dataDirectory.normalize().toString() );
+        String repoBaseDir = config.getArchivaRuntimeConfiguration().getRepositoryBaseDirectory();
+        if (StringUtils.isEmpty( repoBaseDir )) {
+            repositoryBaseDirectory = dataDirectory.resolve("repositories");
+
+        } else {
+            Path tmpRepoBaseDir = Paths.get(repoBaseDir);
+            if (tmpRepoBaseDir.isAbsolute()) {
+                repositoryBaseDirectory = tmpRepoBaseDir;
+            } else {
+                dataDirectory.resolve(tmpRepoBaseDir);
+            }
         }
 
+
         config.getRepositoryGroups();
         config.getRepositoryGroupsAsMap();
         if ( !CollectionUtils.isEmpty( config.getRemoteRepositories() ) )
@@ -902,6 +933,23 @@ public class DefaultArchivaConfiguration
     }
 
     @Override
+    public Path getRepositoryBaseDir() {
+        if (repositoryBaseDirectory==null) {
+            getConfiguration();
+        }
+        return repositoryBaseDirectory;
+
+    }
+
+    @Override
+    public Path getDataDirectory() {
+        if (dataDirectory==null) {
+            getConfiguration();
+        }
+        return dataDirectory;
+    }
+
+    @Override
     public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue )
     {
         // nothing to do here
@@ -911,6 +959,8 @@ public class DefaultArchivaConfiguration
     public synchronized void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue )
     {
         configuration = null;
+        this.dataDirectory=null;
+        this.repositoryBaseDirectory=null;
     }
 
     private String removeExpressions( String directory )


[3/3] archiva git commit: Adding local path to repository API

Posted by ma...@apache.org.
Adding local path to repository API


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/754b2d59
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/754b2d59
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/754b2d59

Branch: refs/heads/master
Commit: 754b2d594076355d6e9d0b7698d309c87a0d672b
Parents: 2fe8227
Author: Martin Stockhammer <ma...@ars.de>
Authored: Mon Nov 20 08:20:42 2017 +0100
Committer: Martin Stockhammer <ma...@ars.de>
Committed: Mon Nov 20 08:20:42 2017 +0100

----------------------------------------------------------------------
 .../java/org/apache/archiva/cli/ArchivaCli.java |   2 +-
 .../configuration/ArchivaConfiguration.java     |   6 +
 .../DefaultArchivaConfiguration.java            |  22 +
 .../src/main/mdo/configuration.mdo              |   7 +
 .../src/test/java/RepositoryProviderMock.java   |  12 +-
 .../test/java/SimpleArtifactConsumerTest.java   |   2 +-
 .../ArtifactMissingChecksumsConsumerTest.java   |   5 +-
 .../repository/AbstractRepositoryPurgeTest.java |   5 +-
 .../repository/mock/RepositoryProviderMock.java |  11 +-
 .../lucene/NexusIndexerConsumerTest.java        |   2 +-
 .../DefaultLegacyRepositoryConverter.java       |   2 +-
 .../indexer/maven/MavenIndexManager.java        |   8 +-
 .../indexer/maven/MavenIndexManagerTest.java    |  89 ++++
 .../archiva/proxy/AbstractProxyTestCase.java    |   2 +-
 .../archiva/proxy/HttpProxyTransferTest.java    |   2 +-
 .../apache/archiva/proxy/MockConfiguration.java |  21 +
 .../repository/mock/RepositoryProviderMock.java |  11 +-
 .../apache/archiva/repository/Repository.java   |  19 +-
 .../repository/AbstractManagedRepository.java   |   9 +-
 .../repository/AbstractRemoteRepository.java    |  21 +-
 .../archiva/repository/AbstractRepository.java  |  27 +-
 .../repository/BasicManagedRepository.java      |   9 +-
 .../repository/BasicRemoteRepository.java       |   9 +-
 .../repository/RepositoryRegistryTest.java      |  12 +-
 .../repository/mock/RepositoryProviderMock.java |  11 +-
 .../scanner/RepositoryContentConsumersTest.java |   4 +-
 .../scanner/RepositoryScannerTest.java          |   4 +-
 .../ArchivaIndexingTaskExecutorTest.java        |   5 +-
 .../apache/archiva/webdav/DavResourceTest.java  |   5 +-
 .../maven2/MavenManagedRepository.java          |   8 +-
 .../maven2/MavenRemoteRepository.java           |   9 +-
 .../maven2/MavenRepositoryProvider.java         | 402 ++++++++-----------
 .../configuration/TestConfiguration.java        |  20 +
 .../storage/maven2/conf/MockConfiguration.java  |  21 +
 .../AbstractRepositoryLayerTestCase.java        |   9 +-
 .../content/maven2/RepositoryRequestTest.java   |   2 +-
 .../maven2/MavenRepositoryProviderTest.java     |   5 +-
 .../metadata/Maven2RepositoryStorageTest.java   |   9 +-
 .../DuplicateArtifactsConsumerTest.java         |   2 +-
 .../configuration/StubConfiguration.java        |  26 ++
 40 files changed, 534 insertions(+), 323 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-cli/src/main/java/org/apache/archiva/cli/ArchivaCli.java
----------------------------------------------------------------------
diff --git a/archiva-cli/src/main/java/org/apache/archiva/cli/ArchivaCli.java b/archiva-cli/src/main/java/org/apache/archiva/cli/ArchivaCli.java
index d274c3d..b2ca378 100644
--- a/archiva-cli/src/main/java/org/apache/archiva/cli/ArchivaCli.java
+++ b/archiva-cli/src/main/java/org/apache/archiva/cli/ArchivaCli.java
@@ -168,7 +168,7 @@ public class ArchivaCli
     private void doScan( String path, String[] consumers )
         throws ConsumerException, MalformedURLException
     {
-        BasicManagedRepository repo = new BasicManagedRepository( Paths.get(path).getFileName().toString(), "Archiva CLI Provided Repo" );
+        BasicManagedRepository repo = new BasicManagedRepository( Paths.get(path).getFileName().toString(), "Archiva CLI Provided Repo", Paths.get(path).getParent());
         repo.setLocation( Paths.get(path).toUri() );
 
         List<KnownRepositoryContentConsumer> knownConsumerList = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
index e656b7e..80959dc 100644
--- a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
+++ b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/ArchivaConfiguration.java
@@ -103,6 +103,12 @@ public interface ArchivaConfiguration
     public Path getRepositoryBaseDir();
 
     /**
+     * Returns the base directory for remote repositories
+     * @return
+     */
+    public Path getRemoteRepositoryBaseDir();
+
+    /**
      * Returns the data directory where repositories and metadata reside
      * @return
      */

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
----------------------------------------------------------------------
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 b28bed2..71b4c31 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
@@ -90,6 +90,8 @@ import java.util.Set;
  * <p>
  * If the configuration is outdated, it will be upgraded when it is loaded. This is done by checking the version flag
  * before reading it from the registry.
+ *
+ * FIXME: The synchronization must be improved, the current impl may lead to inconsistent data or multiple getConfiguration() calls (martin_s@apache.org)
  * </p>
  */
 @Service("archivaConfiguration#default")
@@ -176,6 +178,7 @@ public class DefaultArchivaConfiguration
 
     private volatile Path dataDirectory;
     private volatile Path repositoryBaseDirectory;
+    private volatile Path remoteRepositoryBaseDirectory;
 
     @PostConstruct
     private void init() {
@@ -261,6 +264,17 @@ public class DefaultArchivaConfiguration
                 dataDirectory.resolve(tmpRepoBaseDir);
             }
         }
+        String remoteRepoBaseDir = config.getArchivaRuntimeConfiguration().getRemoteRepositoryBaseDirectory();
+        if (StringUtils.isEmpty(remoteRepoBaseDir)) {
+            remoteRepositoryBaseDirectory = dataDirectory.resolve("remotes");
+        } else {
+            Path tmpRemoteRepoDir = Paths.get(remoteRepoBaseDir);
+            if (tmpRemoteRepoDir.isAbsolute()) {
+                remoteRepositoryBaseDirectory = tmpRemoteRepoDir;
+            } else {
+                dataDirectory.resolve(tmpRemoteRepoDir);
+            }
+        }
 
 
         config.getRepositoryGroups();
@@ -942,6 +956,14 @@ public class DefaultArchivaConfiguration
     }
 
     @Override
+    public Path getRemoteRepositoryBaseDir() {
+        if (remoteRepositoryBaseDirectory==null) {
+            getConfiguration();
+        }
+        return remoteRepositoryBaseDirectory;
+    }
+
+    @Override
     public Path getDataDirectory() {
         if (dataDirectory==null) {
             getConfiguration();

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo b/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
index 91dbb65..d687ba6 100644
--- a/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
+++ b/archiva-modules/archiva-base/archiva-configuration/src/main/mdo/configuration.mdo
@@ -1547,6 +1547,13 @@
           <required>false</required>
         </field>
         <field>
+          <name>remoteRepositoryBaseDirectory</name>
+          <version>3.0.0+</version>
+          <description>The base directory for local storage of remote repository data. If not set, it's ${dataDirectory}/remotes.</description>
+          <type>String</type>
+          <required>false</required>
+        </field>
+        <field>
           <name>defaultLanguage</name>
           <type>String</type>
           <version>3.0.0+</version>

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/RepositoryProviderMock.java
----------------------------------------------------------------------
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 55151f3..a140842 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
@@ -39,7 +39,9 @@ import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.archiva.repository.features.StagingRepositoryFeature;
 import org.springframework.stereotype.Service;
 
+
 import java.net.URI;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.time.Period;
 import java.util.HashSet;
@@ -69,19 +71,19 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public EditableManagedRepository createManagedInstance( String id, String name )
     {
-        return new BasicManagedRepository( id, name );
+        return new BasicManagedRepository( id, name, Paths.get("target/repositories") );
     }
 
     @Override
     public EditableRemoteRepository createRemoteInstance( String id, String name )
     {
-        return new BasicRemoteRepository( id, name );
+        return new BasicRemoteRepository( id, name , Paths.get("target/remotes"));
     }
 
     @Override
     public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/repositories") );
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -128,7 +130,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     public ManagedRepository createStagingInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
         String id = configuration.getId( ) + StagingRepositoryFeature.STAGING_REPO_POSTFIX;
-        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ), Paths.get("target/repositories") );
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -136,7 +138,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public RemoteRepository createRemoteInstance( RemoteRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ) );
+        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/remotes") );
         updateRemoteInstance( remoteRepository, configuration );
         return remoteRepository;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/SimpleArtifactConsumerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/SimpleArtifactConsumerTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/SimpleArtifactConsumerTest.java
index 68d03a8..0b134ba 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/SimpleArtifactConsumerTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/test/java/SimpleArtifactConsumerTest.java
@@ -84,7 +84,7 @@ public class SimpleArtifactConsumerTest
         Files.createDirectories( repoDir );
         repoDir.toFile().deleteOnExit();
 
-        testRepository = new BasicManagedRepository("test-consumer-repository","Test-Consumer-Repository" );
+        testRepository = new BasicManagedRepository("test-consumer-repository","Test-Consumer-Repository", Paths.get("target/repositories") );
         testRepository.setLocation( repoDir.toAbsolutePath().toUri() );
 
         repositoryRegistry.putRepository(testRepository);

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumerTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumerTest.java
index 1ad70c3..5851e67 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumerTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumerTest.java
@@ -47,9 +47,10 @@ public class ArtifactMissingChecksumsConsumerTest
     {
         super.setUp();
 
-        repoConfig = new BasicManagedRepository( "test-repo", "Test Repository");
+        Path basePath = Paths.get("target/test-classes");
+        repoConfig = new BasicManagedRepository( "test-repo", "Test Repository", basePath);
         repoConfig.setLayout( "default" );
-        repoConfig.setLocation( Paths.get( "target/test-classes/test-repo/" ).toUri() );
+        repoConfig.setLocation(basePath.resolve("test-repo/" ).toUri() );
 
         consumer = applicationContext.getBean( "knownRepositoryContentConsumer#create-missing-checksums",
                                                KnownRepositoryContentConsumer.class );

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java
index d65d1a4..e9e7353 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurgeTest.java
@@ -166,13 +166,14 @@ public abstract class AbstractRepositoryPurgeTest
 
     public org.apache.archiva.repository.ManagedRepository getRepoConfiguration( String repoId, String repoName ) throws URISyntaxException
     {
-        config = new BasicManagedRepository( repoId, repoName);
+        Path basePath = Paths.get("target/test-" + getName()).toAbsolutePath();
+        config = new BasicManagedRepository( repoId, repoName, basePath);
         config.addActiveReleaseScheme( ReleaseScheme.RELEASE );
         config.addActiveReleaseScheme( ReleaseScheme.SNAPSHOT );
         ArtifactCleanupFeature atf = config.getFeature( ArtifactCleanupFeature.class ).get();
         atf.setRetentionPeriod( Period.ofDays( TEST_DAYS_OLDER) );
         String path = AbstractRepositoryPurgeTest.fixPath(
-            Paths.get( "target/test-" + getName() + "/" + repoId ).toAbsolutePath().toString() );
+            basePath.resolve( repoId ).toAbsolutePath().toString() );
         config.setLocation( new URI( path ) );
         atf.setDeleteReleasedSnapshots( true );
         atf.setRetentionCount( TEST_RETENTION_COUNT );

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
----------------------------------------------------------------------
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 ad98c99..286dd38 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
@@ -40,6 +40,7 @@ import org.apache.archiva.repository.features.StagingRepositoryFeature;
 import org.springframework.stereotype.Service;
 
 import java.net.URI;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.time.Period;
 import java.util.HashSet;
@@ -69,19 +70,19 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public EditableManagedRepository createManagedInstance( String id, String name )
     {
-        return new BasicManagedRepository( id, name );
+        return new BasicManagedRepository( id, name, Paths.get("target/repositories") );
     }
 
     @Override
     public EditableRemoteRepository createRemoteInstance( String id, String name )
     {
-        return new BasicRemoteRepository( id, name );
+        return new BasicRemoteRepository( id, name, Paths.get("target/remotes") );
     }
 
     @Override
     public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/repositories") );
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -128,7 +129,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     public ManagedRepository createStagingInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
         String id = configuration.getId( ) + StagingRepositoryFeature.STAGING_REPO_POSTFIX;
-        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ), Paths.get("target/repositories") );
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -136,7 +137,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public RemoteRepository createRemoteInstance( RemoteRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ) );
+        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/remotes") );
         updateRemoteInstance( remoteRepository, configuration );
         return remoteRepository;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/test/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/test/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumerTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/test/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumerTest.java
index 2a8546a..e34dc7e 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/test/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumerTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-lucene-consumers/src/test/java/org/apache/archiva/consumers/lucene/NexusIndexerConsumerTest.java
@@ -132,7 +132,7 @@ public class NexusIndexerConsumerTest
         // initialize to set the file types to be processed
         nexusIndexerConsumer.initialize();
 
-        repositoryConfig = new BasicManagedRepository( "test-repo", "Test Repository"  );
+        repositoryConfig = new BasicManagedRepository( "test-repo", "Test Repository", Paths.get("target/test-classes")  );
         repositoryConfig.setLocation( new URI("target/test-classes/test-repo") );
         repositoryConfig.setLayout( "default" );
         repositoryConfig.setScanned( true );

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-converter/src/main/java/org/apache/archiva/converter/legacy/DefaultLegacyRepositoryConverter.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-converter/src/main/java/org/apache/archiva/converter/legacy/DefaultLegacyRepositoryConverter.java b/archiva-modules/archiva-base/archiva-converter/src/main/java/org/apache/archiva/converter/legacy/DefaultLegacyRepositoryConverter.java
index 3e8e168..cc1af39 100644
--- a/archiva-modules/archiva-base/archiva-converter/src/main/java/org/apache/archiva/converter/legacy/DefaultLegacyRepositoryConverter.java
+++ b/archiva-modules/archiva-base/archiva-converter/src/main/java/org/apache/archiva/converter/legacy/DefaultLegacyRepositoryConverter.java
@@ -92,7 +92,7 @@ public class DefaultLegacyRepositoryConverter
         {
             String defaultRepositoryUrl = PathUtil.toUrl( repositoryDirectory );
 
-            BasicManagedRepository legacyRepository = new BasicManagedRepository( "legacy", "Legacy Repository");
+            BasicManagedRepository legacyRepository = new BasicManagedRepository( "legacy", "Legacy Repository", repositoryDirectory.getParent());
             legacyRepository.setLocation( legacyRepositoryDirectory.toAbsolutePath().toUri() );
             legacyRepository.setLayout( "legacy" );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-maven2-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-maven2-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java b/archiva-modules/archiva-base/archiva-maven2-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
index 7e6d3c5..60c2fdd 100644
--- a/archiva-modules/archiva-base/archiva-maven2-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
+++ b/archiva-modules/archiva-base/archiva-maven2-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexManager.java
@@ -521,13 +521,7 @@ public class MavenIndexManager implements ArchivaIndexManager
 
         IndexingContext context;
         // take care first about repository location as can be relative
-        Path repositoryDirectory = PathUtil.getPathFromUri( repository.getLocation( ) );
-
-        if ( !repositoryDirectory.isAbsolute( ) )
-        {
-            repositoryDirectory =
-                repositoryDirectory.resolve( "repositories" ).resolve( repositoryDirectory );
-        }
+        Path repositoryDirectory = repository.getLocalPath();
 
         if ( !Files.exists( repositoryDirectory ) )
         {

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-maven2-indexer/src/test/java/org/apache/archiva/indexer/maven/MavenIndexManagerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-maven2-indexer/src/test/java/org/apache/archiva/indexer/maven/MavenIndexManagerTest.java b/archiva-modules/archiva-base/archiva-maven2-indexer/src/test/java/org/apache/archiva/indexer/maven/MavenIndexManagerTest.java
new file mode 100644
index 0000000..a70c584
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-maven2-indexer/src/test/java/org/apache/archiva/indexer/maven/MavenIndexManagerTest.java
@@ -0,0 +1,89 @@
+package org.apache.archiva.indexer.maven;
+
+/*
+* 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.ManagedRepository;
+import org.apache.archiva.repository.features.IndexCreationFeature;
+import org.apache.archiva.repository.maven2.MavenManagedRepository;
+import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.context.ContextConfiguration;
+
+import javax.inject.Inject;
+
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.*;
+
+@RunWith( ArchivaSpringJUnit4ClassRunner.class )
+@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
+public class MavenIndexManagerTest {
+
+    @Inject
+    MavenIndexManager mavenIndexManager;
+
+
+
+    @Test
+    public void pack() throws Exception {
+    }
+
+    @Test
+    public void scan() throws Exception {
+    }
+
+    @Test
+    public void update() throws Exception {
+    }
+
+    @Test
+    public void addArtifactsToIndex() throws Exception {
+    }
+
+    @Test
+    public void removeArtifactsFromIndex() throws Exception {
+    }
+
+    @Test
+    public void supportsRepository() throws Exception {
+    }
+
+    @Test
+    public void createContext() throws Exception {
+        MavenManagedRepository repository = new MavenManagedRepository("test-repo", "Test Repo", Paths.get("target/repositories"));
+        repository.setLocation(new URI("test-repo"));
+        IndexCreationFeature icf = repository.getFeature(IndexCreationFeature.class).get();
+        icf.setIndexPath(new URI(".index-test"));
+        ArchivaIndexingContext ctx = mavenIndexManager.createContext(repository);
+        assertNotNull(ctx);
+        assertEquals(repository, ctx.getRepository());
+        assertEquals("test-repo", ctx.getId());
+        Path indexPath = Paths.get("target/repositories/test-repo/.index-test");
+        assertEquals(indexPath.toAbsolutePath(), Paths.get(ctx.getPath()).toAbsolutePath());
+        assertTrue(Files.exists(indexPath));
+
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
index c4bfff3..4dcf747 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/AbstractProxyTestCase.java
@@ -354,7 +354,7 @@ public abstract class AbstractProxyTestCase
     protected ManagedRepositoryContent createRepository( String id, String name, String path, String layout )
         throws Exception
     {
-        MavenManagedRepository repo = new MavenManagedRepository(id, name);
+        MavenManagedRepository repo = new MavenManagedRepository(id, name, Paths.get(path).getParent());
         repo.setLocation( new URI(path) );
         repo.setLayout( layout );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
index 3980d87..40fa894 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/HttpProxyTransferTest.java
@@ -123,7 +123,7 @@ public class HttpProxyTransferTest
         // Make the destination dir.
         Files.createDirectories(destRepoDir);
 
-        MavenManagedRepository repo = new MavenManagedRepository( MANAGED_ID, "Default Managed Repository" );
+        MavenManagedRepository repo = new MavenManagedRepository( MANAGED_ID, "Default Managed Repository", Paths.get(repoPath).getParent() );
         repo.setLocation( new URI(repoPath) );
         repo.setLayout( "default" );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/MockConfiguration.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/MockConfiguration.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/MockConfiguration.java
index 54a0b94..30de663 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/MockConfiguration.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/proxy/MockConfiguration.java
@@ -23,6 +23,7 @@ import org.apache.archiva.configuration.*;
 import org.apache.archiva.redback.components.registry.Registry;
 import org.apache.archiva.redback.components.registry.RegistryException;
 import org.apache.archiva.redback.components.registry.RegistryListener;
+import org.apache.commons.lang.StringUtils;
 import org.easymock.EasyMock;
 import org.easymock.IMocksControl;
 import org.springframework.stereotype.Service;
@@ -160,4 +161,24 @@ public class MockConfiguration
             return Paths.get("");
         }
     }
+
+
+    @Override
+    public Path getRepositoryBaseDir() {
+        return getDataDirectory().resolve("repositories");
+    }
+
+    @Override
+    public Path getRemoteRepositoryBaseDir() {
+        return getDataDirectory().resolve("remotes");
+    }
+
+    @Override
+    public Path getDataDirectory() {
+        if (configuration!=null && StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory())) {
+            return Paths.get(configuration.getArchivaRuntimeConfiguration().getDataDirectory());
+        } else {
+            return getAppServerBaseDir().resolve("data");
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
index 834ce5b..c923ba9 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
@@ -40,6 +40,7 @@ import org.apache.archiva.repository.features.StagingRepositoryFeature;
 import org.springframework.stereotype.Service;
 
 import java.net.URI;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.time.Period;
 import java.util.HashSet;
@@ -69,19 +70,19 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public EditableManagedRepository createManagedInstance( String id, String name )
     {
-        return new BasicManagedRepository( id, name );
+        return new BasicManagedRepository( id, name , Paths.get("target/repositories"));
     }
 
     @Override
     public EditableRemoteRepository createRemoteInstance( String id, String name )
     {
-        return new BasicRemoteRepository( id, name );
+        return new BasicRemoteRepository( id, name, Paths.get("target/remotes") );
     }
 
     @Override
     public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ) , Paths.get("target/repositories"));
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -128,7 +129,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     public ManagedRepository createStagingInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
         String id = configuration.getId( ) + StagingRepositoryFeature.STAGING_REPO_POSTFIX;
-        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ), Paths.get("target/repositories") );
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -136,7 +137,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public RemoteRepository createRemoteInstance( RemoteRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ) );
+        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/remotes") );
         updateRemoteInstance( remoteRepository, configuration );
         return remoteRepository;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/Repository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/Repository.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/Repository.java
index 1c101ee..fae5745 100644
--- a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/Repository.java
+++ b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/Repository.java
@@ -23,6 +23,7 @@ import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.repository.features.RepositoryFeature;
 
 import java.net.URI;
+import java.nio.file.Path;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -86,14 +87,22 @@ public interface Repository {
      */
     URI getLocation();
 
+
     /**
-     * This returns the absolute location uri of this repository. Some repository locations may be relative to
-     * the base repository directory or uri. This returns the absolute path of the repository.
-     * If the location is absolute already this method returns the same URI as getLocation().
+     * Returns the local path that this repository uses, if it stores data locally. You should keep in
+     * mind, that repository implementations may not store any data in this directory. E.g. if the
+     * repository data is handled by a database. So the content of this directory is very implementation
+     * specific. Users of this directory must know about the repository file layout if they use this
+     * path.
+     *
+     * Repository implementations should always return a valid path, even if there is no locally stored data.
      *
-     * @return the absolute uri of the location.
+     * Some extensions may use the path to store their own repository specific data, e.g. statistics, metadata,...
+     *
+     * @return the filesystem path to the repository.
      */
-    URI getAbsoluteLocation();
+    Path getLocalPath();
+
 
     /**
      * A repository may allow additional locations that can be used, if the primary location is not available.

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractManagedRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractManagedRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractManagedRepository.java
index 3f482ca..06cab6b 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractManagedRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractManagedRepository.java
@@ -20,6 +20,7 @@ package org.apache.archiva.repository;
  */
 
 
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Locale;
@@ -35,14 +36,14 @@ public abstract class AbstractManagedRepository extends AbstractRepository imple
     private Set<ReleaseScheme> activeReleaseSchemes = new HashSet<>(  );
     private Set<ReleaseScheme> uActiveReleaseSchemes = Collections.unmodifiableSet( activeReleaseSchemes );
 
-    public AbstractManagedRepository( RepositoryType type, String id, String name )
+    public AbstractManagedRepository( RepositoryType type, String id, String name, Path basePath )
     {
-        super( type, id, name );
+        super( type, id, name, basePath );
     }
 
-    public AbstractManagedRepository( Locale primaryLocale, RepositoryType type, String id, String name )
+    public AbstractManagedRepository( Locale primaryLocale, RepositoryType type, String id, String name, Path basePath )
     {
-        super( primaryLocale, type, id, name );
+        super( primaryLocale, type, id, name, basePath );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRemoteRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRemoteRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRemoteRepository.java
index e1e570a..131aad6 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRemoteRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRemoteRepository.java
@@ -20,6 +20,10 @@ package org.apache.archiva.repository;
  */
 
 
+import org.apache.commons.lang.StringUtils;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.util.Collections;
 import java.util.HashMap;
@@ -43,14 +47,14 @@ public abstract class AbstractRemoteRepository extends AbstractRepository implem
     private String proxyId;
     private RemoteRepositoryContent content;
 
-    public AbstractRemoteRepository( RepositoryType type, String id, String name )
+    public AbstractRemoteRepository( RepositoryType type, String id, String name , Path repositoryBase)
     {
-        super( type, id, name );
+        super( type, id, name, repositoryBase );
     }
 
-    public AbstractRemoteRepository( Locale primaryLocale, RepositoryType type, String id, String name )
+    public AbstractRemoteRepository( Locale primaryLocale, RepositoryType type, String id, String name, Path repositoryBase )
     {
-        super( primaryLocale, type, id, name );
+        super( primaryLocale, type, id, name, repositoryBase );
     }
 
     @Override
@@ -138,4 +142,13 @@ public abstract class AbstractRemoteRepository extends AbstractRepository implem
         return timeout;
     }
 
+    /**
+     * Remote repositories resolve always relative to the base directory.
+     * @return
+     */
+    @Override
+    public Path getLocalPath() {
+        return repositoryBase.resolve(getId());
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/AbstractRepository.java
----------------------------------------------------------------------
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 ab1c3fa..c90c5bf 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
@@ -23,10 +23,14 @@ import com.cronutils.model.CronType;
 import com.cronutils.model.definition.CronDefinition;
 import com.cronutils.model.definition.CronDefinitionBuilder;
 import com.cronutils.parser.CronParser;
+import org.apache.archiva.common.utils.PathUtil;
 import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.repository.features.RepositoryFeature;
+import org.apache.commons.lang.StringUtils;
 
 import java.net.URI;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -59,17 +63,21 @@ public abstract class AbstractRepository implements EditableRepository
 
     Map<Class<? extends RepositoryFeature<?>>, RepositoryFeature<?>> featureMap = new HashMap<>(  );
 
-    public AbstractRepository(RepositoryType type, String id, String name) {
+    protected Path repositoryBase;
+
+    public AbstractRepository(RepositoryType type, String id, String name, Path repositoryBase) {
         this.id = id;
         this.names.put( primaryLocale, name);
         this.type = type;
+        this.repositoryBase=repositoryBase;
     }
 
-    public AbstractRepository(Locale primaryLocale, RepositoryType type, String id, String name) {
+    public AbstractRepository(Locale primaryLocale, RepositoryType type, String id, String name, Path repositoryBase) {
         setPrimaryLocale( primaryLocale );
         this.id = id;
         this.names.put( primaryLocale, name);
         this.type = type;
+        this.repositoryBase=repositoryBase;
     }
 
     protected void setPrimaryLocale(Locale locale) {
@@ -118,8 +126,19 @@ public abstract class AbstractRepository implements EditableRepository
         return location;
     }
 
-    public URI getAbsoluteLocation() {
-        return baseUri.resolve( location );
+    @Override
+    public Path getLocalPath() {
+        Path localPath;
+        if (getLocation().getScheme()=="file" || StringUtils.isEmpty(getLocation().getScheme())) {
+            localPath = PathUtil.getPathFromUri(getLocation());
+            if (localPath.isAbsolute()) {
+                return localPath;
+            } else {
+                return repositoryBase.resolve(localPath);
+            }
+        } else {
+            return repositoryBase.resolve(getId());
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
index 0ab88f3..6c1a285 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicManagedRepository.java
@@ -23,6 +23,7 @@ import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.StagingRepositoryFeature;
 
+import java.nio.file.Path;
 import java.util.Locale;
 
 /**
@@ -46,15 +47,15 @@ public class BasicManagedRepository extends AbstractManagedRepository
         StagingRepositoryFeature.class.toString()
     }, true, true, true, true, true  );
 
-    public BasicManagedRepository( String id, String name )
+    public BasicManagedRepository( String id, String name, Path basePath )
     {
-        super( RepositoryType.MAVEN, id, name );
+        super( RepositoryType.MAVEN, id, name, basePath );
         initFeatures();
     }
 
-    public BasicManagedRepository( Locale primaryLocale, RepositoryType type, String id, String name )
+    public BasicManagedRepository( Locale primaryLocale, RepositoryType type, String id, String name, Path basePath )
     {
-        super( primaryLocale, type, id, name );
+        super( primaryLocale, type, id, name, basePath );
         initFeatures();
     }
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
index d241854..64b705c 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/BasicRemoteRepository.java
@@ -21,6 +21,7 @@ package org.apache.archiva.repository;
 
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 
+import java.nio.file.Path;
 import java.util.Locale;
 
 /**
@@ -41,15 +42,15 @@ public class BasicRemoteRepository extends AbstractRemoteRepository
         RemoteIndexFeature.class.toString()
     }, true, true, true, true, true  );
 
-    public BasicRemoteRepository( String id, String name )
+    public BasicRemoteRepository( String id, String name, Path basePath )
     {
-        super( RepositoryType.MAVEN, id, name );
+        super( RepositoryType.MAVEN, id, name, basePath);
         initFeatures();
     }
 
-    public BasicRemoteRepository( Locale primaryLocale, RepositoryType type, String id, String name )
+    public BasicRemoteRepository( Locale primaryLocale, RepositoryType type, String id, String name, Path basePath )
     {
-        super( primaryLocale, type, id, name );
+        super( primaryLocale, type, id, name, basePath );
         initFeatures();
     }
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/RepositoryRegistryTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/RepositoryRegistryTest.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/RepositoryRegistryTest.java
index 01dcbd2..b125f81 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/RepositoryRegistryTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/RepositoryRegistryTest.java
@@ -192,14 +192,14 @@ public class RepositoryRegistryTest
     @Test
     public void putManagedRepository( ) throws Exception
     {
-        BasicManagedRepository managedRepository = new BasicManagedRepository( "test001", "Test repo" );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( "test001", "Test repo", archivaConfiguration.getRepositoryBaseDir() );
         managedRepository.setDescription( managedRepository.getPrimaryLocale(), "This is just a test" );
         repositoryRegistry.putRepository(managedRepository);
 
         assertNotNull(managedRepository.getContent());
         assertEquals(6, repositoryRegistry.getRepositories().size());
 
-        managedRepository = new BasicManagedRepository( "central", "Test repo" );
+        managedRepository = new BasicManagedRepository( "central", "Test repo", archivaConfiguration.getRepositoryBaseDir() );
         managedRepository.setDescription( managedRepository.getPrimaryLocale(), "This is just a test" );
         ManagedRepository updatedRepo = null;
         try {
@@ -208,7 +208,7 @@ public class RepositoryRegistryTest
         } catch (RepositoryException e) {
             // OK
         }
-        managedRepository = new BasicManagedRepository( "internal", "Test repo" );
+        managedRepository = new BasicManagedRepository( "internal", "Test repo", archivaConfiguration.getRepositoryBaseDir() );
         managedRepository.setDescription( managedRepository.getPrimaryLocale(), "This is just a test" );
         updatedRepo = repositoryRegistry.putRepository( managedRepository );
 
@@ -283,7 +283,7 @@ public class RepositoryRegistryTest
     @Test
     public void putRemoteRepository( ) throws Exception
     {
-        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( "test001", "Test repo" );
+        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( "test001", "Test repo", archivaConfiguration.getRemoteRepositoryBaseDir() );
         remoteRepository.setDescription( remoteRepository.getPrimaryLocale(), "This is just a test" );
         RemoteRepository newRepo = repositoryRegistry.putRepository(remoteRepository);
 
@@ -291,7 +291,7 @@ public class RepositoryRegistryTest
         assertNotNull(remoteRepository.getContent());
         assertEquals(6, repositoryRegistry.getRepositories().size());
 
-        remoteRepository = new BasicRemoteRepository( "internal", "Test repo" );
+        remoteRepository = new BasicRemoteRepository( "internal", "Test repo", archivaConfiguration.getRemoteRepositoryBaseDir() );
         remoteRepository.setDescription( remoteRepository.getPrimaryLocale(), "This is just a test" );
         RemoteRepository updatedRepo = null;
         try
@@ -302,7 +302,7 @@ public class RepositoryRegistryTest
             // OK
         }
 
-        remoteRepository = new BasicRemoteRepository( "central", "Test repo" );
+        remoteRepository = new BasicRemoteRepository( "central", "Test repo", archivaConfiguration.getRemoteRepositoryBaseDir() );
         remoteRepository.setDescription( remoteRepository.getPrimaryLocale(), "This is just a test" );
         updatedRepo = repositoryRegistry.putRepository( remoteRepository );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
index 95485cc..d4a78a6 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/RepositoryProviderMock.java
@@ -40,6 +40,7 @@ import org.apache.archiva.repository.features.StagingRepositoryFeature;
 import org.springframework.stereotype.Service;
 
 import java.net.URI;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.time.Period;
 import java.util.HashSet;
@@ -69,19 +70,19 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public EditableManagedRepository createManagedInstance( String id, String name )
     {
-        return new BasicManagedRepository( id, name );
+        return new BasicManagedRepository( id, name, Paths.get("target/repositories") );
     }
 
     @Override
     public EditableRemoteRepository createRemoteInstance( String id, String name )
     {
-        return new BasicRemoteRepository( id, name );
+        return new BasicRemoteRepository( id, name , Paths.get("target/remotes"));
     }
 
     @Override
     public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/repositories") );
         updateManagedInstance( managedRepository, configuration );
         return managedRepository;
     }
@@ -128,7 +129,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     public ManagedRepository createStagingInstance( ManagedRepositoryConfiguration configuration ) throws RepositoryException
     {
         String id = configuration.getId( ) + StagingRepositoryFeature.STAGING_REPO_POSTFIX;
-        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ) );
+        BasicManagedRepository managedRepository = new BasicManagedRepository( id, configuration.getName( ) , Paths.get("target/repositories"));
         updateManagedInstance( managedRepository, configuration );
         managedRepository.getFeature(StagingRepositoryFeature.class).get().setStageRepoNeeded(false);
         return managedRepository;
@@ -137,7 +138,7 @@ public class RepositoryProviderMock implements RepositoryProvider
     @Override
     public RemoteRepository createRemoteInstance( RemoteRepositoryConfiguration configuration ) throws RepositoryException
     {
-        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ) );
+        BasicRemoteRepository remoteRepository = new BasicRemoteRepository( configuration.getId( ), configuration.getName( ), Paths.get("target/remotes") );
         updateRemoteInstance( remoteRepository, configuration );
         return remoteRepository;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
index c24c0c2..6148fe5 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
@@ -76,14 +76,14 @@ public class RepositoryContentConsumersTest
 
     protected ManagedRepository createRepository( String id, String name, Path location )
     {
-        BasicManagedRepository repo = new BasicManagedRepository( id, name  );
+        BasicManagedRepository repo = new BasicManagedRepository( id, name , location.getParent() );
         repo.setLocation( location.toAbsolutePath().toUri() );
         return repo;
     }
 
     protected RemoteRepository createRemoteRepository( String id, String name, String url ) throws URISyntaxException
     {
-        BasicRemoteRepository repo = new BasicRemoteRepository(id, name);
+        BasicRemoteRepository repo = new BasicRemoteRepository(id, name, Paths.get("remotes"));
         repo.setLocation( new URI( url ) );
         return repo;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryScannerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryScannerTest.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryScannerTest.java
index e9a462b..ac86708 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryScannerTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryScannerTest.java
@@ -64,14 +64,14 @@ public class RepositoryScannerTest
 
     protected EditableManagedRepository createRepository( String id, String name, Path location )
     {
-        BasicManagedRepository repo = new BasicManagedRepository(id, name);
+        BasicManagedRepository repo = new BasicManagedRepository(id, name, location.getParent());
         repo.setLocation( location.toAbsolutePath().toUri());
         return repo;
     }
 
     protected EditableRemoteRepository createRemoteRepository( String id, String name, String url ) throws URISyntaxException
     {
-        BasicRemoteRepository repo = new BasicRemoteRepository(id, name);
+        BasicRemoteRepository repo = new BasicRemoteRepository(id, name, Paths.get("remotes"));
         repo.setLocation( new URI( url ) );
         return repo;
     }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
index 02c0261..d0e6532 100644
--- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
+++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/test/java/org/apache/archiva/scheduler/indexing/ArchivaIndexingTaskExecutorTest.java
@@ -91,8 +91,9 @@ public class ArchivaIndexingTaskExecutorTest
     {
         super.setUp();
 
-        repositoryConfig = new BasicManagedRepository( "test-repo", "Test Repository");
-        Path repoLocation = Paths.get( System.getProperty( "basedir" ), "target/test-classes/test-repo" ).toAbsolutePath();
+        Path baseDir = Paths.get(System.getProperty("basedir"), "target/test-classes").toAbsolutePath();
+        repositoryConfig = new BasicManagedRepository( "test-repo", "Test Repository", baseDir);
+        Path repoLocation = baseDir.resolve("test-repo" );
         repositoryConfig.setLocation(repoLocation.toUri() );
         repositoryConfig.setLayout( "default" );
         repositoryConfig.setScanned( true );

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/DavResourceTest.java
----------------------------------------------------------------------
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 4802776..394e82a 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
@@ -77,8 +77,7 @@ public class DavResourceTest
 
     private LockManager lockManager;
 
-    private MavenManagedRepository repository = new MavenManagedRepository( "repo001", "repo001");
-    
+    private MavenManagedRepository repository;
     @Override
     @Before
     public void setUp()
@@ -88,6 +87,8 @@ public class DavResourceTest
         session = new ArchivaDavSession();
         baseDir = Paths.get( "target/DavResourceTest" );
         Files.createDirectories( baseDir );
+        repository = new MavenManagedRepository( "repo001", "repo001", baseDir);
+
         myResource = baseDir.resolve( "myresource.jar" );
         Files.createFile(myResource);
         resourceFactory = new RootContextDavResourceFactory();

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
index aaad382..0e5a37f 100644
--- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
+++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenManagedRepository.java
@@ -70,14 +70,14 @@ public class MavenManagedRepository extends AbstractManagedRepository
         false
     );
 
-    public MavenManagedRepository( String id, String name )
+    public MavenManagedRepository( String id, String name, Path basePath )
     {
-        super( RepositoryType.MAVEN, id, name );
+        super( RepositoryType.MAVEN, id, name, basePath);
     }
 
-    public MavenManagedRepository( Locale primaryLocale, String id, String name )
+    public MavenManagedRepository( Locale primaryLocale, String id, String name, Path basePath )
     {
-        super( primaryLocale, RepositoryType.MAVEN, id, name );
+        super( primaryLocale, RepositoryType.MAVEN, id, name, basePath );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
index 8c7a8cf..c857196 100644
--- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
+++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRemoteRepository.java
@@ -11,6 +11,7 @@ import org.apache.archiva.repository.features.IndexCreationFeature;
 import org.apache.archiva.repository.features.RemoteIndexFeature;
 import org.apache.archiva.repository.features.RepositoryFeature;
 
+import java.nio.file.Path;
 import java.util.Locale;
 
 /*
@@ -53,14 +54,14 @@ public class MavenRemoteRepository extends AbstractRemoteRepository
         false
     );
 
-    public MavenRemoteRepository( String id, String name )
+    public MavenRemoteRepository( String id, String name, Path basePath )
     {
-        super( RepositoryType.MAVEN, id, name );
+        super( RepositoryType.MAVEN, id, name, basePath );
     }
 
-    public MavenRemoteRepository( Locale primaryLocale, String id, String name )
+    public MavenRemoteRepository( Locale primaryLocale, String id, String name, Path basePath )
     {
-        super( primaryLocale, RepositoryType.MAVEN, id, name );
+        super( primaryLocale, RepositoryType.MAVEN, id, name, basePath );
     }
 
     @Override


[2/3] archiva git commit: Adding local path to repository API

Posted by ma...@apache.org.
http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
index 6bdd0b8..331f44b 100644
--- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
+++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
@@ -62,63 +62,58 @@ import java.util.Set;
  * Provider for the maven2 repository implementations
  */
 @Service("mavenRepositoryProvider")
-public class MavenRepositoryProvider implements RepositoryProvider
-{
+public class MavenRepositoryProvider implements RepositoryProvider {
 
 
     @Inject
     private ArchivaConfiguration archivaConfiguration;
 
-    private static final Logger log = LoggerFactory.getLogger( MavenRepositoryProvider.class );
+    private static final Logger log = LoggerFactory.getLogger(MavenRepositoryProvider.class);
+
+    static final Set<RepositoryType> TYPES = new HashSet<>();
 
-    static final Set<RepositoryType> TYPES = new HashSet<>(  );
     static {
-        TYPES.add( RepositoryType.MAVEN);
+        TYPES.add(RepositoryType.MAVEN);
     }
 
     @Override
-    public Set<RepositoryType> provides( )
-    {
+    public Set<RepositoryType> provides() {
         return TYPES;
     }
 
     @Override
     public EditableManagedRepository createManagedInstance(String id, String name) {
-        return new MavenManagedRepository(id, name);
+        return new MavenManagedRepository(id, name, archivaConfiguration.getRepositoryBaseDir());
     }
 
     @Override
     public EditableRemoteRepository createRemoteInstance(String id, String name) {
-        return new MavenRemoteRepository(id, name);
+        return new MavenRemoteRepository(id, name, archivaConfiguration.getRemoteRepositoryBaseDir());
     }
 
-    private URI getURIFromString( String uriStr) throws RepositoryException {
+    private URI getURIFromString(String uriStr) throws RepositoryException {
         URI uri;
         try {
-            if (StringUtils.isEmpty( uriStr )) {
+            if (StringUtils.isEmpty(uriStr)) {
                 return new URI("");
             }
             if (uriStr.startsWith("/")) {
                 // only absolute paths are prepended with file scheme
-                uri = new URI("file://"+uriStr);
-            } else
-            {
-                uri = new URI( uriStr );
+                uri = new URI("file://" + uriStr);
+            } else {
+                uri = new URI(uriStr);
             }
-            if (uri.getScheme()!=null && !"file".equals(uri.getScheme())) {
+            if (uri.getScheme() != null && !"file".equals(uri.getScheme())) {
                 log.error("Bad URI scheme found: {}, URI={}", uri.getScheme(), uri);
-                throw new RepositoryException("The uri "+uriStr+" is not valid. Only file:// URI is allowed for maven.");
+                throw new RepositoryException("The uri " + uriStr + " is not valid. Only file:// URI is allowed for maven.");
             }
         } catch (URISyntaxException e) {
-            String newCfg = "file://"+uriStr;
-            try
-            {
+            String newCfg = "file://" + uriStr;
+            try {
                 uri = new URI(newCfg);
-            }
-            catch ( URISyntaxException e1 )
-            {
+            } catch (URISyntaxException e1) {
                 log.error("Could not create URI from {} -> ", uriStr, newCfg);
-                throw new RepositoryException( "The config entry "+uriStr+" cannot be converted to URI." );
+                throw new RepositoryException("The config entry " + uriStr + " cannot be converted to URI.");
             }
         }
         log.debug("Setting location uri: {}", uri);
@@ -126,56 +121,48 @@ public class MavenRepositoryProvider implements RepositoryProvider
     }
 
     @Override
-    public ManagedRepository createManagedInstance( ManagedRepositoryConfiguration cfg ) throws RepositoryException
-    {
-        MavenManagedRepository repo = new MavenManagedRepository(cfg.getId() ,cfg.getName());
-        updateManagedInstance( repo, cfg );
+    public ManagedRepository createManagedInstance(ManagedRepositoryConfiguration cfg) throws RepositoryException {
+        MavenManagedRepository repo = new MavenManagedRepository(cfg.getId(), cfg.getName(), archivaConfiguration.getRepositoryBaseDir());
+        updateManagedInstance(repo, cfg);
         return repo;
     }
 
     @Override
-    public void updateManagedInstance( EditableManagedRepository repo , ManagedRepositoryConfiguration cfg ) throws RepositoryException
-    {
-        try
-        {
-            repo.setLocation( getURIFromString( cfg.getLocation() ) );
-        }
-        catch ( UnsupportedURIException e )
-        {
-            throw new RepositoryException( "The location entry is not a valid uri: "+cfg.getLocation() );
+    public void updateManagedInstance(EditableManagedRepository repo, ManagedRepositoryConfiguration cfg) throws RepositoryException {
+        try {
+            repo.setLocation(getURIFromString(cfg.getLocation()));
+        } catch (UnsupportedURIException e) {
+            throw new RepositoryException("The location entry is not a valid uri: " + cfg.getLocation());
         }
-        setBaseConfig( repo, cfg );
-        Path repoDir = PathUtil.getPathFromUri(repo.getAbsoluteLocation());
+        setBaseConfig(repo, cfg);
+        Path repoDir = repo.getLocalPath();
         if (!Files.exists(repoDir)) {
             log.debug("Creating repo directory {}", repoDir);
-            try
-            {
-                Files.createDirectories( repoDir );
-            }
-            catch ( IOException e )
-            {
-                log.error("Could not create directory {} for repository {}", repo.getAbsoluteLocation(), repo.getId(), e);
-                throw new RepositoryException( "Could not create directory for repository "+repo.getAbsoluteLocation() );
+            try {
+                Files.createDirectories(repoDir);
+            } catch (IOException e) {
+                log.error("Could not create directory {} for repository {}", repo.getLocalPath(), repo.getId(), e);
+                throw new RepositoryException("Could not create directory for repository " + repo.getLocalPath());
             }
         }
         repo.setSchedulingDefinition(cfg.getRefreshCronExpression());
-        repo.setBlocksRedeployment( cfg.isBlockRedeployments() );
-        repo.setScanned( cfg.isScanned() );
+        repo.setBlocksRedeployment(cfg.isBlockRedeployments());
+        repo.setScanned(cfg.isScanned());
         if (cfg.isReleases()) {
-            repo.addActiveReleaseScheme( ReleaseScheme.RELEASE);
+            repo.addActiveReleaseScheme(ReleaseScheme.RELEASE);
         }
         if (cfg.isSnapshots()) {
             repo.addActiveReleaseScheme(ReleaseScheme.SNAPSHOT);
         }
 
-        StagingRepositoryFeature stagingRepositoryFeature = repo.getFeature( StagingRepositoryFeature.class ).get();
-        stagingRepositoryFeature.setStageRepoNeeded( cfg.isStageRepoNeeded() );
+        StagingRepositoryFeature stagingRepositoryFeature = repo.getFeature(StagingRepositoryFeature.class).get();
+        stagingRepositoryFeature.setStageRepoNeeded(cfg.isStageRepoNeeded());
 
-        IndexCreationFeature indexCreationFeature = repo.getFeature( IndexCreationFeature.class ).get( );
-        indexCreationFeature.setSkipPackedIndexCreation( cfg.isSkipPackedIndexCreation() );
-        indexCreationFeature.setIndexPath( getURIFromString( cfg.getIndexDir() ) );
+        IndexCreationFeature indexCreationFeature = repo.getFeature(IndexCreationFeature.class).get();
+        indexCreationFeature.setSkipPackedIndexCreation(cfg.isSkipPackedIndexCreation());
+        indexCreationFeature.setIndexPath(getURIFromString(cfg.getIndexDir()));
         Path indexPath;
-        if (indexCreationFeature.getIndexPath().getScheme()==null) {
+        if (indexCreationFeature.getIndexPath().getScheme() == null) {
             indexPath = Paths.get(indexCreationFeature.getIndexPath().getPath());
         } else {
             indexPath = Paths.get(indexCreationFeature.getIndexPath());
@@ -184,44 +171,39 @@ public class MavenRepositoryProvider implements RepositoryProvider
         if (indexPath.isAbsolute()) {
             absoluteIndexPath = indexPath;
         } else {
-            absoluteIndexPath = PathUtil.getPathFromUri( repo.getLocation()).resolve(indexCreationFeature.getIndexPath().getPath());
+            absoluteIndexPath = PathUtil.getPathFromUri(repo.getLocation()).resolve(indexCreationFeature.getIndexPath().getPath());
         }
-        try
-        {
-            Files.createDirectories( absoluteIndexPath );
-        }
-        catch ( IOException e )
-        {
+        try {
+            Files.createDirectories(absoluteIndexPath);
+        } catch (IOException e) {
             log.error("Could not create index directory {}", absoluteIndexPath);
-            throw new RepositoryException( "Could not create index directory "+absoluteIndexPath );
+            throw new RepositoryException("Could not create index directory " + absoluteIndexPath);
         }
 
-        ArtifactCleanupFeature artifactCleanupFeature = repo.getFeature( ArtifactCleanupFeature.class ).get();
+        ArtifactCleanupFeature artifactCleanupFeature = repo.getFeature(ArtifactCleanupFeature.class).get();
 
-        artifactCleanupFeature.setDeleteReleasedSnapshots( cfg.isDeleteReleasedSnapshots() );
-        artifactCleanupFeature.setRetentionCount( cfg.getRetentionCount() );
-        artifactCleanupFeature.setRetentionPeriod( Period.ofDays( cfg.getRetentionPeriod() ) );
+        artifactCleanupFeature.setDeleteReleasedSnapshots(cfg.isDeleteReleasedSnapshots());
+        artifactCleanupFeature.setRetentionCount(cfg.getRetentionCount());
+        artifactCleanupFeature.setRetentionPeriod(Period.ofDays(cfg.getRetentionPeriod()));
     }
 
 
     @Override
-    public ManagedRepository createStagingInstance( ManagedRepositoryConfiguration baseConfiguration ) throws RepositoryException
-    {
+    public ManagedRepository createStagingInstance(ManagedRepositoryConfiguration baseConfiguration) throws RepositoryException {
         log.debug("Creating staging instance for {}", baseConfiguration.getId());
-        return createManagedInstance( getStageRepoConfig( baseConfiguration ) );
+        return createManagedInstance(getStageRepoConfig(baseConfiguration));
     }
 
 
     @Override
-    public RemoteRepository createRemoteInstance( RemoteRepositoryConfiguration cfg ) throws RepositoryException
-    {
-        MavenRemoteRepository repo = new MavenRemoteRepository( cfg.getId( ), cfg.getName( ) );
-        updateRemoteInstance( repo, cfg );
+    public RemoteRepository createRemoteInstance(RemoteRepositoryConfiguration cfg) throws RepositoryException {
+        MavenRemoteRepository repo = new MavenRemoteRepository(cfg.getId(), cfg.getName(), archivaConfiguration.getRemoteRepositoryBaseDir());
+        updateRemoteInstance(repo, cfg);
         return repo;
     }
 
     private String convertUriToPath(URI uri) {
-        if (uri.getScheme()==null) {
+        if (uri.getScheme() == null) {
             return uri.getPath();
         } else if ("file".equals(uri.getScheme())) {
             return Paths.get(uri).toString();
@@ -231,96 +213,83 @@ public class MavenRepositoryProvider implements RepositoryProvider
     }
 
     @Override
-    public void updateRemoteInstance( EditableRemoteRepository repo, RemoteRepositoryConfiguration cfg ) throws RepositoryException
-    {
-        setBaseConfig( repo, cfg );
-        repo.setCheckPath( cfg.getCheckPath() );
-        repo.setSchedulingDefinition( cfg.getRefreshCronExpression() );
-        try
-        {
+    public void updateRemoteInstance(EditableRemoteRepository repo, RemoteRepositoryConfiguration cfg) throws RepositoryException {
+        setBaseConfig(repo, cfg);
+        repo.setCheckPath(cfg.getCheckPath());
+        repo.setSchedulingDefinition(cfg.getRefreshCronExpression());
+        try {
             repo.setLocation(new URI(cfg.getUrl()));
+        } catch (UnsupportedURIException | URISyntaxException e) {
+            log.error("Could not set remote url " + cfg.getUrl());
+            throw new RepositoryException("The url config is not a valid uri: " + cfg.getUrl());
         }
-        catch ( UnsupportedURIException | URISyntaxException e )
-        {
-            log.error("Could not set remote url "+cfg.getUrl());
-            throw new RepositoryException( "The url config is not a valid uri: "+cfg.getUrl() );
-        }
-        repo.setTimeout( Duration.ofSeconds( cfg.getTimeout() ) );
-        RemoteIndexFeature remoteIndexFeature = repo.getFeature( RemoteIndexFeature.class ).get();
-        remoteIndexFeature.setDownloadRemoteIndex( cfg.isDownloadRemoteIndex() );
-        remoteIndexFeature.setDownloadRemoteIndexOnStartup( cfg.isDownloadRemoteIndexOnStartup() );
-        remoteIndexFeature.setDownloadTimeout( Duration.ofSeconds( cfg.getRemoteDownloadTimeout()) );
-        remoteIndexFeature.setProxyId( cfg.getRemoteDownloadNetworkProxyId() );
-        if (cfg.isDownloadRemoteIndex())
-        {
-            try
-            {
-                remoteIndexFeature.setIndexUri( new URI( cfg.getRemoteIndexUrl( ) ) );
-            }
-            catch ( URISyntaxException e )
-            {
-                log.error( "Could not set remote index url " + cfg.getRemoteIndexUrl( ) );
-                remoteIndexFeature.setDownloadRemoteIndex( false );
-                remoteIndexFeature.setDownloadRemoteIndexOnStartup( false );
+        repo.setTimeout(Duration.ofSeconds(cfg.getTimeout()));
+        RemoteIndexFeature remoteIndexFeature = repo.getFeature(RemoteIndexFeature.class).get();
+        remoteIndexFeature.setDownloadRemoteIndex(cfg.isDownloadRemoteIndex());
+        remoteIndexFeature.setDownloadRemoteIndexOnStartup(cfg.isDownloadRemoteIndexOnStartup());
+        remoteIndexFeature.setDownloadTimeout(Duration.ofSeconds(cfg.getRemoteDownloadTimeout()));
+        remoteIndexFeature.setProxyId(cfg.getRemoteDownloadNetworkProxyId());
+        if (cfg.isDownloadRemoteIndex()) {
+            try {
+                remoteIndexFeature.setIndexUri(new URI(cfg.getRemoteIndexUrl()));
+            } catch (URISyntaxException e) {
+                log.error("Could not set remote index url " + cfg.getRemoteIndexUrl());
+                remoteIndexFeature.setDownloadRemoteIndex(false);
+                remoteIndexFeature.setDownloadRemoteIndexOnStartup(false);
             }
         }
-        repo.setExtraHeaders( cfg.getExtraHeaders() );
-        repo.setExtraParameters( cfg.getExtraParameters() );
+        repo.setExtraHeaders(cfg.getExtraHeaders());
+        repo.setExtraParameters(cfg.getExtraParameters());
         PasswordCredentials credentials = new PasswordCredentials("", new char[0]);
-        if (cfg.getPassword()!=null && cfg.getUsername()!=null)
-        {
-            credentials.setPassword( cfg.getPassword( ).toCharArray( ) );
-            credentials.setUsername( cfg.getUsername() );
-            repo.setCredentials( credentials );
+        if (cfg.getPassword() != null && cfg.getUsername() != null) {
+            credentials.setPassword(cfg.getPassword().toCharArray());
+            credentials.setUsername(cfg.getUsername());
+            repo.setCredentials(credentials);
         } else {
-            credentials.setPassword( new char[0] );
+            credentials.setPassword(new char[0]);
         }
-        if (cfg.getIndexDir()!=null) {
-            IndexCreationFeature indexCreationFeature = repo.getFeature( IndexCreationFeature.class ).get();
-            indexCreationFeature.setIndexPath( getURIFromString( cfg.getIndexDir() ) );
+        if (cfg.getIndexDir() != null) {
+            IndexCreationFeature indexCreationFeature = repo.getFeature(IndexCreationFeature.class).get();
+            indexCreationFeature.setIndexPath(getURIFromString(cfg.getIndexDir()));
         }
     }
 
     @Override
-    public RemoteRepositoryConfiguration getRemoteConfiguration( RemoteRepository remoteRepository ) throws RepositoryException
-    {
+    public RemoteRepositoryConfiguration getRemoteConfiguration(RemoteRepository remoteRepository) throws RepositoryException {
         if (!(remoteRepository instanceof MavenRemoteRepository)) {
-            log.error("Wrong remote repository type "+remoteRepository.getClass().getName());
-            throw new RepositoryException( "The given repository type cannot be handled by the maven provider: "+remoteRepository.getClass().getName() );
+            log.error("Wrong remote repository type " + remoteRepository.getClass().getName());
+            throw new RepositoryException("The given repository type cannot be handled by the maven provider: " + remoteRepository.getClass().getName());
         }
         RemoteRepositoryConfiguration cfg = new RemoteRepositoryConfiguration();
-        cfg.setType( remoteRepository.getType().toString() );
-        cfg.setId( remoteRepository.getId() );
-        cfg.setName( remoteRepository.getName() );
-        cfg.setDescription( remoteRepository.getDescription() );
+        cfg.setType(remoteRepository.getType().toString());
+        cfg.setId(remoteRepository.getId());
+        cfg.setName(remoteRepository.getName());
+        cfg.setDescription(remoteRepository.getDescription());
         cfg.setUrl(remoteRepository.getLocation().toString());
-        cfg.setTimeout( (int)remoteRepository.getTimeout().toMillis()/1000 );
-        cfg.setCheckPath( remoteRepository.getCheckPath() );
-        RepositoryCredentials creds = remoteRepository.getLoginCredentials( );
-        if (creds!=null)
-        {
+        cfg.setTimeout((int) remoteRepository.getTimeout().toMillis() / 1000);
+        cfg.setCheckPath(remoteRepository.getCheckPath());
+        RepositoryCredentials creds = remoteRepository.getLoginCredentials();
+        if (creds != null) {
             if (creds instanceof PasswordCredentials) {
                 PasswordCredentials pCreds = (PasswordCredentials) creds;
-                cfg.setPassword( new String(pCreds.getPassword()) );
-                cfg.setUsername( pCreds.getUsername() );
+                cfg.setPassword(new String(pCreds.getPassword()));
+                cfg.setUsername(pCreds.getUsername());
             }
         }
-        cfg.setLayout( remoteRepository.getLayout() );
-        cfg.setExtraParameters( remoteRepository.getExtraParameters() );
-        cfg.setExtraHeaders( remoteRepository.getExtraHeaders() );
-        cfg.setRefreshCronExpression( remoteRepository.getSchedulingDefinition() );
-
-        IndexCreationFeature indexCreationFeature = remoteRepository.getFeature( IndexCreationFeature.class ).get();
-        cfg.setIndexDir( convertUriToPath( indexCreationFeature.getIndexPath()));
-
-        RemoteIndexFeature remoteIndexFeature = remoteRepository.getFeature( RemoteIndexFeature.class ).get();
-        cfg.setRemoteIndexUrl( remoteIndexFeature.getIndexUri().toString() );
-        cfg.setRemoteDownloadTimeout( (int)remoteIndexFeature.getDownloadTimeout().get( ChronoUnit.SECONDS ) );
-        cfg.setDownloadRemoteIndexOnStartup( remoteIndexFeature.isDownloadRemoteIndexOnStartup() );
-        cfg.setDownloadRemoteIndex( remoteIndexFeature.isDownloadRemoteIndex() );
-        cfg.setRemoteDownloadNetworkProxyId( remoteIndexFeature.getProxyId() );
+        cfg.setLayout(remoteRepository.getLayout());
+        cfg.setExtraParameters(remoteRepository.getExtraParameters());
+        cfg.setExtraHeaders(remoteRepository.getExtraHeaders());
+        cfg.setRefreshCronExpression(remoteRepository.getSchedulingDefinition());
 
+        IndexCreationFeature indexCreationFeature = remoteRepository.getFeature(IndexCreationFeature.class).get();
+        cfg.setIndexDir(convertUriToPath(indexCreationFeature.getIndexPath()));
 
+        RemoteIndexFeature remoteIndexFeature = remoteRepository.getFeature(RemoteIndexFeature.class).get();
+        cfg.setRemoteIndexUrl(remoteIndexFeature.getIndexUri().toString());
+        cfg.setRemoteDownloadTimeout((int) remoteIndexFeature.getDownloadTimeout().get(ChronoUnit.SECONDS));
+        cfg.setDownloadRemoteIndexOnStartup(remoteIndexFeature.isDownloadRemoteIndexOnStartup());
+        cfg.setDownloadRemoteIndex(remoteIndexFeature.isDownloadRemoteIndex());
+        cfg.setRemoteDownloadNetworkProxyId(remoteIndexFeature.getProxyId());
 
 
         return cfg;
@@ -328,125 +297,104 @@ public class MavenRepositoryProvider implements RepositoryProvider
     }
 
     @Override
-    public ManagedRepositoryConfiguration getManagedConfiguration( ManagedRepository managedRepository ) throws RepositoryException
-    {
+    public ManagedRepositoryConfiguration getManagedConfiguration(ManagedRepository managedRepository) throws RepositoryException {
         if (!(managedRepository instanceof MavenManagedRepository)) {
-            log.error("Wrong remote repository type "+managedRepository.getClass().getName());
-            throw new RepositoryException( "The given repository type cannot be handled by the maven provider: "+managedRepository.getClass().getName() );
+            log.error("Wrong remote repository type " + managedRepository.getClass().getName());
+            throw new RepositoryException("The given repository type cannot be handled by the maven provider: " + managedRepository.getClass().getName());
         }
         ManagedRepositoryConfiguration cfg = new ManagedRepositoryConfiguration();
-        cfg.setType( managedRepository.getType().toString() );
-        cfg.setId( managedRepository.getId() );
-        cfg.setName( managedRepository.getName() );
-        cfg.setDescription( managedRepository.getDescription() );
-        cfg.setLocation( convertUriToPath( managedRepository.getLocation() ) );
-        cfg.setLayout( managedRepository.getLayout() );
-        cfg.setRefreshCronExpression( managedRepository.getSchedulingDefinition() );
-        cfg.setScanned( managedRepository.isScanned() );
-        cfg.setBlockRedeployments( managedRepository.blocksRedeployments() );
-        StagingRepositoryFeature stagingRepositoryFeature = managedRepository.getFeature( StagingRepositoryFeature.class ).get();
+        cfg.setType(managedRepository.getType().toString());
+        cfg.setId(managedRepository.getId());
+        cfg.setName(managedRepository.getName());
+        cfg.setDescription(managedRepository.getDescription());
+        cfg.setLocation(convertUriToPath(managedRepository.getLocation()));
+        cfg.setLayout(managedRepository.getLayout());
+        cfg.setRefreshCronExpression(managedRepository.getSchedulingDefinition());
+        cfg.setScanned(managedRepository.isScanned());
+        cfg.setBlockRedeployments(managedRepository.blocksRedeployments());
+        StagingRepositoryFeature stagingRepositoryFeature = managedRepository.getFeature(StagingRepositoryFeature.class).get();
         cfg.setStageRepoNeeded(stagingRepositoryFeature.isStageRepoNeeded());
-        IndexCreationFeature indexCreationFeature = managedRepository.getFeature( IndexCreationFeature.class ).get();
-        cfg.setIndexDir(convertUriToPath( indexCreationFeature.getIndexPath() ));
-        cfg.setSkipPackedIndexCreation( indexCreationFeature.isSkipPackedIndexCreation() );
+        IndexCreationFeature indexCreationFeature = managedRepository.getFeature(IndexCreationFeature.class).get();
+        cfg.setIndexDir(convertUriToPath(indexCreationFeature.getIndexPath()));
+        cfg.setSkipPackedIndexCreation(indexCreationFeature.isSkipPackedIndexCreation());
 
-        ArtifactCleanupFeature artifactCleanupFeature = managedRepository.getFeature( ArtifactCleanupFeature.class ).get();
-        cfg.setRetentionCount( artifactCleanupFeature.getRetentionCount());
-        cfg.setRetentionPeriod( artifactCleanupFeature.getRetentionPeriod().getDays() );
+        ArtifactCleanupFeature artifactCleanupFeature = managedRepository.getFeature(ArtifactCleanupFeature.class).get();
+        cfg.setRetentionCount(artifactCleanupFeature.getRetentionCount());
+        cfg.setRetentionPeriod(artifactCleanupFeature.getRetentionPeriod().getDays());
         cfg.setDeleteReleasedSnapshots(artifactCleanupFeature.isDeleteReleasedSnapshots());
 
-        if (managedRepository.getActiveReleaseSchemes().contains( ReleaseScheme.RELEASE )) {
-            cfg.setReleases( true );
+        if (managedRepository.getActiveReleaseSchemes().contains(ReleaseScheme.RELEASE)) {
+            cfg.setReleases(true);
         } else {
-            cfg.setReleases( false );
+            cfg.setReleases(false);
         }
-        if (managedRepository.getActiveReleaseSchemes().contains( ReleaseScheme.SNAPSHOT )) {
-            cfg.setSnapshots( true );
+        if (managedRepository.getActiveReleaseSchemes().contains(ReleaseScheme.SNAPSHOT)) {
+            cfg.setSnapshots(true);
         } else {
-            cfg.setSnapshots( false );
+            cfg.setSnapshots(false);
         }
         return cfg;
 
     }
 
-    private ManagedRepositoryConfiguration getStageRepoConfig( ManagedRepositoryConfiguration repository )
-    {
+    private ManagedRepositoryConfiguration getStageRepoConfig(ManagedRepositoryConfiguration repository) {
         ManagedRepositoryConfiguration stagingRepository = new ManagedRepositoryConfiguration();
-        stagingRepository.setId( repository.getId() + StagingRepositoryFeature.STAGING_REPO_POSTFIX );
-        stagingRepository.setLayout( repository.getLayout() );
-        stagingRepository.setName( repository.getName() + StagingRepositoryFeature.STAGING_REPO_POSTFIX );
-        stagingRepository.setBlockRedeployments( repository.isBlockRedeployments() );
-        stagingRepository.setRetentionPeriod( repository.getRetentionPeriod() );
-        stagingRepository.setDeleteReleasedSnapshots( repository.isDeleteReleasedSnapshots() );
-        stagingRepository.setStageRepoNeeded( false );
+        stagingRepository.setId(repository.getId() + StagingRepositoryFeature.STAGING_REPO_POSTFIX);
+        stagingRepository.setLayout(repository.getLayout());
+        stagingRepository.setName(repository.getName() + StagingRepositoryFeature.STAGING_REPO_POSTFIX);
+        stagingRepository.setBlockRedeployments(repository.isBlockRedeployments());
+        stagingRepository.setRetentionPeriod(repository.getRetentionPeriod());
+        stagingRepository.setDeleteReleasedSnapshots(repository.isDeleteReleasedSnapshots());
+        stagingRepository.setStageRepoNeeded(false);
 
         String path = repository.getLocation();
-        int lastIndex = path.replace( '\\', '/' ).lastIndexOf( '/' );
-        stagingRepository.setLocation( path.substring( 0, lastIndex ) + "/" + stagingRepository.getId() );
+        int lastIndex = path.replace('\\', '/').lastIndexOf('/');
+        stagingRepository.setLocation(path.substring(0, lastIndex) + "/" + stagingRepository.getId());
 
-        if ( StringUtils.isNotBlank( repository.getIndexDir() ) )
-        {
+        if (StringUtils.isNotBlank(repository.getIndexDir())) {
             Path indexDir = null;
-            try
-            {
-                indexDir = Paths.get( new URI(repository.getIndexDir().startsWith( "file://" ) ? repository.getIndexDir() : "file://"+repository.getIndexDir()) );
-                if ( indexDir.isAbsolute() )
-                {
-                    Path newDir = Paths.get(new URI(stagingRepository.getLocation().startsWith( "file://" ) ? stagingRepository.getLocation() : "file://"+stagingRepository.getLocation())).resolve(".index");
+            try {
+                indexDir = Paths.get(new URI(repository.getIndexDir().startsWith("file://") ? repository.getIndexDir() : "file://" + repository.getIndexDir()));
+                if (indexDir.isAbsolute()) {
+                    Path newDir = Paths.get(new URI(stagingRepository.getLocation().startsWith("file://") ? stagingRepository.getLocation() : "file://" + stagingRepository.getLocation())).resolve(".index");
                     log.debug("Changing index directory {} -> {}", indexDir, newDir);
-                    stagingRepository.setIndexDir( newDir.toString() );
-                }
-                else
-                {
+                    stagingRepository.setIndexDir(newDir.toString());
+                } else {
                     log.debug("Keeping index directory {}", repository.getIndexDir());
-                    stagingRepository.setIndexDir( repository.getIndexDir() );
+                    stagingRepository.setIndexDir(repository.getIndexDir());
                 }
-            }
-            catch ( URISyntaxException e )
-            {
+            } catch (URISyntaxException e) {
                 log.error("Could not parse index path as uri {}", repository.getIndexDir());
-                stagingRepository.setIndexDir( "" );
+                stagingRepository.setIndexDir("");
             }
             // in case of absolute dir do not use the same
         }
-        stagingRepository.setRefreshCronExpression( repository.getRefreshCronExpression() );
-        stagingRepository.setReleases( repository.isReleases() );
-        stagingRepository.setRetentionCount( repository.getRetentionCount() );
-        stagingRepository.setScanned( repository.isScanned() );
-        stagingRepository.setSnapshots( repository.isSnapshots() );
-        stagingRepository.setSkipPackedIndexCreation( repository.isSkipPackedIndexCreation() );
+        stagingRepository.setRefreshCronExpression(repository.getRefreshCronExpression());
+        stagingRepository.setReleases(repository.isReleases());
+        stagingRepository.setRetentionCount(repository.getRetentionCount());
+        stagingRepository.setScanned(repository.isScanned());
+        stagingRepository.setSnapshots(repository.isSnapshots());
+        stagingRepository.setSkipPackedIndexCreation(repository.isSkipPackedIndexCreation());
         // do not duplicate description
         //stagingRepository.getDescription("")
         return stagingRepository;
     }
 
-    private void setBaseConfig( EditableRepository repo, AbstractRepositoryConfiguration cfg) throws RepositoryException {
-        String baseUriStr = archivaConfiguration.getConfiguration().getArchivaRuntimeConfiguration().getRepositoryBaseDirectory();
-        if (baseUriStr==null) {
-            baseUriStr = Paths.get(System.getProperty( "appserver.base" )).resolve("repositories").normalize().toString();
-        }
-        try
-        {
-            URI baseUri = new URI(baseUriStr);
-            repo.setBaseUri( baseUri );
-        }
-        catch ( URISyntaxException e )
-        {
-            log.error("Could not set base URI {}: {}", baseUriStr, e.getMessage(), e);
-            throw new RepositoryException( "Could not set base URI "+ baseUriStr);
-        }
-        repo.setName( repo.getPrimaryLocale(), cfg.getName() );
-        repo.setDescription( repo.getPrimaryLocale(), cfg.getDescription() );
-        repo.setLayout( cfg.getLayout() );
+    private void setBaseConfig(EditableRepository repo, AbstractRepositoryConfiguration cfg) throws RepositoryException {
+
+        URI baseUri = archivaConfiguration.getRepositoryBaseDir().toUri();
+        repo.setBaseUri(baseUri);
+
+        repo.setName(repo.getPrimaryLocale(), cfg.getName());
+        repo.setDescription(repo.getPrimaryLocale(), cfg.getDescription());
+        repo.setLayout(cfg.getLayout());
     }
 
-    public ArchivaConfiguration getArchivaConfiguration( )
-    {
+    public ArchivaConfiguration getArchivaConfiguration() {
         return archivaConfiguration;
     }
 
-    public void setArchivaConfiguration( ArchivaConfiguration archivaConfiguration )
-    {
+    public void setArchivaConfiguration(ArchivaConfiguration archivaConfiguration) {
         this.archivaConfiguration = archivaConfiguration;
     }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
index 1283f62..4a55180 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/configuration/TestConfiguration.java
@@ -2,6 +2,7 @@ package org.apache.archiva.configuration;
 
 import org.apache.archiva.redback.components.registry.RegistryException;
 import org.apache.archiva.redback.components.registry.RegistryListener;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.nio.file.Path;
@@ -103,4 +104,23 @@ public class TestConfiguration
             return Paths.get("");
         }
     }
+
+    @Override
+    public Path getRepositoryBaseDir() {
+        return getDataDirectory().resolve("repositories");
+    }
+
+    @Override
+    public Path getRemoteRepositoryBaseDir() {
+        return getDataDirectory().resolve("remotes");
+    }
+
+    @Override
+    public Path getDataDirectory() {
+        if (configuration!=null && StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory())) {
+            return Paths.get(configuration.getArchivaRuntimeConfiguration().getDataDirectory());
+        } else {
+            return getAppServerBaseDir().resolve("data");
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/conf/MockConfiguration.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/conf/MockConfiguration.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/conf/MockConfiguration.java
index a8d7837..474d3df 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/conf/MockConfiguration.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/conf/MockConfiguration.java
@@ -25,6 +25,7 @@ import org.apache.archiva.configuration.ConfigurationListener;
 import org.apache.archiva.redback.components.registry.Registry;
 import org.apache.archiva.redback.components.registry.RegistryException;
 import org.apache.archiva.redback.components.registry.RegistryListener;
+import org.apache.commons.lang.StringUtils;
 import org.easymock.IMocksControl;
 import org.springframework.stereotype.Service;
 
@@ -146,4 +147,24 @@ public class MockConfiguration
             return Paths.get("");
         }
     }
+
+
+    @Override
+    public Path getRepositoryBaseDir() {
+        return getDataDirectory().resolve("repositories");
+    }
+
+    @Override
+    public Path getRemoteRepositoryBaseDir() {
+        return getDataDirectory().resolve("remotes");
+    }
+
+    @Override
+    public Path getDataDirectory() {
+        if (configuration!=null && StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory())) {
+            return Paths.get(configuration.getArchivaRuntimeConfiguration().getDataDirectory());
+        } else {
+            return getAppServerBaseDir().resolve("data");
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/AbstractRepositoryLayerTestCase.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/AbstractRepositoryLayerTestCase.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/AbstractRepositoryLayerTestCase.java
index 98091f3..56af25f 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/AbstractRepositoryLayerTestCase.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/AbstractRepositoryLayerTestCase.java
@@ -34,6 +34,7 @@ import javax.inject.Inject;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Locale;
 
 /**
@@ -53,14 +54,14 @@ public abstract class AbstractRepositoryLayerTestCase
 
     protected MavenManagedRepository createRepository( String id, String name, Path location )
     {
-        MavenManagedRepository repo = new MavenManagedRepository( id, name);
+        MavenManagedRepository repo = new MavenManagedRepository( id, name, location.getParent().toAbsolutePath());
         repo.setLocation( location.toAbsolutePath().toUri() );
         return repo;
     }
 
     protected MavenRemoteRepository createRemoteRepository( String id, String name, String url ) throws URISyntaxException
     {
-        MavenRemoteRepository repo = new MavenRemoteRepository(id, name);
+        MavenRemoteRepository repo = new MavenRemoteRepository(id, name, Paths.get("target/remotes"));
         repo.setLocation( new URI( url ) );
         return repo;
     }
@@ -69,7 +70,7 @@ public abstract class AbstractRepositoryLayerTestCase
                                                                        String layout )
         throws Exception
     {
-        MavenManagedRepository repo = new MavenManagedRepository( id, name );
+        MavenManagedRepository repo = new MavenManagedRepository( id, name, location.getParent() );
         repo.setLocation( location.toAbsolutePath().toUri() );
         repo.setLayout( layout );
 
@@ -83,7 +84,7 @@ public abstract class AbstractRepositoryLayerTestCase
     protected RemoteRepositoryContent createRemoteRepositoryContent( String id, String name, String url, String layout )
         throws Exception
     {
-        MavenRemoteRepository repo = new MavenRemoteRepository(id, name);
+        MavenRemoteRepository repo = new MavenRemoteRepository(id, name, Paths.get("target/remotes"));
         repo.setLocation( new URI( url ) );
         repo.setLayout( layout );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/content/maven2/RepositoryRequestTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/content/maven2/RepositoryRequestTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/content/maven2/RepositoryRequestTest.java
index f918c18..faf2ba2 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/content/maven2/RepositoryRequestTest.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/content/maven2/RepositoryRequestTest.java
@@ -515,7 +515,7 @@ public class RepositoryRequestTest
                                                                        String layout )
         throws Exception
     {
-        MavenManagedRepository repo = new MavenManagedRepository( id, name);
+        MavenManagedRepository repo = new MavenManagedRepository( id, name, archivaConfiguration.getRepositoryBaseDir());
         repo.setLocation( location.toAbsolutePath().toUri() );
         repo.setLayout( layout );
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
index 54810ce..8731c7c 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
@@ -41,6 +41,7 @@ import org.junit.Test;
 import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.time.Duration;
 import java.time.Period;
 import java.time.temporal.ChronoUnit;
@@ -213,7 +214,7 @@ public class MavenRepositoryProviderTest
 
     @Test
     public void getManagedConfiguration() throws Exception {
-        MavenManagedRepository repo = new MavenManagedRepository( "test01", "My Test repo" );
+        MavenManagedRepository repo = new MavenManagedRepository( "test01", "My Test repo", Paths.get("target/repositories") );
 
         repo.setLocation( new URI("file:///this.is/a/test") );
         repo.setScanned( true );
@@ -258,7 +259,7 @@ public class MavenRepositoryProviderTest
 
     @Test
     public void getRemoteConfiguration() throws Exception {
-        MavenRemoteRepository repo = new MavenRemoteRepository( "test01", "My Test repo" );
+        MavenRemoteRepository repo = new MavenRemoteRepository( "test01", "My Test repo", Paths.get("target/remotes") );
 
         repo.setLocation( new URI("https://this.is/a/test") );
         repo.setScanned( true );

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
index 92ea54e..ceb25db 100644
--- a/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
+++ b/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/repository/metadata/Maven2RepositoryStorageTest.java
@@ -30,6 +30,7 @@ import org.springframework.test.context.ContextConfiguration;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import java.nio.file.Paths;
 import java.util.Locale;
 
 /**
@@ -48,17 +49,17 @@ public class Maven2RepositoryStorageTest
     {
         String href = "/repository/internal/org/apache/maven/someartifact.jar";
         Assert.assertEquals( "/org/apache/maven/someartifact.jar",
-                             repositoryStorage.getFilePath( href, new MavenManagedRepository( "repo01", "repo01") ) );
+                             repositoryStorage.getFilePath( href, new MavenManagedRepository( "repo01", "repo01", Paths.get("target/repositories")) ) );
 
         href = "repository/internal/org/apache/maven/someartifact.jar";
         Assert.assertEquals( "/org/apache/maven/someartifact.jar",
-                             repositoryStorage.getFilePath( href, new MavenManagedRepository( "repo01", "repo01" ) ) );
+                             repositoryStorage.getFilePath( href, new MavenManagedRepository( "repo01", "repo01", Paths.get("target/repositories") ) ) );
 
         href = "repository/internal/org/apache/maven/";
-        Assert.assertEquals( "/org/apache/maven/", repositoryStorage.getFilePath( href, new MavenManagedRepository("repo01", "repo01") ) );
+        Assert.assertEquals( "/org/apache/maven/", repositoryStorage.getFilePath( href, new MavenManagedRepository("repo01", "repo01", Paths.get("target/repositories")) ) );
 
         href = "mypath";
-        Assert.assertEquals( "/", repositoryStorage.getFilePath( href, new MavenManagedRepository("repo01", "repo01") ) );
+        Assert.assertEquals( "/", repositoryStorage.getFilePath( href, new MavenManagedRepository("repo01", "repo01", Paths.get("target/repositories")) ) );
     }
 
 

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/problem-reports/src/test/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/plugins/problem-reports/src/test/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumerTest.java b/archiva-modules/plugins/problem-reports/src/test/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumerTest.java
index 49cc241..40f1f83 100644
--- a/archiva-modules/plugins/problem-reports/src/test/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumerTest.java
+++ b/archiva-modules/plugins/problem-reports/src/test/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumerTest.java
@@ -97,7 +97,7 @@ public class DuplicateArtifactsConsumerTest
 
         assertNotNull( consumer );
 
-        config = new BasicManagedRepository(TEST_REPO, TEST_REPO);
+        config = new BasicManagedRepository(TEST_REPO, TEST_REPO, Paths.get("target"));
         config.setLocation( Paths.get( "target/test-repository" ).toAbsolutePath().toUri() );
 
         metadataRepository = mock( MetadataRepository.class );

http://git-wip-us.apache.org/repos/asf/archiva/blob/754b2d59/archiva-modules/plugins/stage-repository-merge/src/test/java/org/apache/archiva/configuration/StubConfiguration.java
----------------------------------------------------------------------
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 0206edb..077edb9 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
@@ -21,6 +21,7 @@ package org.apache.archiva.configuration;
 
 import org.apache.archiva.redback.components.registry.RegistryException;
 import org.apache.archiva.redback.components.registry.RegistryListener;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.nio.file.Path;
@@ -103,4 +104,29 @@ public class StubConfiguration
             return Paths.get("");
         }
     }
+
+    @Override
+    public Path getRepositoryBaseDir() {
+        return getDataDirectory().resolve("repositories");
+    }
+
+    @Override
+    public Path getRemoteRepositoryBaseDir() {
+        return getDataDirectory().resolve("remotes");
+    }
+
+    @Override
+    public Path getDataDirectory() {
+        if (configuration!=null && StringUtils.isNotEmpty(configuration.getArchivaRuntimeConfiguration().getDataDirectory())) {
+            Path dataDir = Paths.get(configuration.getArchivaRuntimeConfiguration().getDataDirectory());
+            if (dataDir.isAbsolute()) {
+                return dataDir;
+            } else {
+                return getAppServerBaseDir().resolve(dataDir);
+            }
+        } else {
+            return getAppServerBaseDir().resolve("data");
+        }
+
+    }
 }