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

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

commit aa68c370b2d26d9b8b4fb405919a0b572c5a9512
Author: Martin Stockhammer <[email protected]>
AuthorDate: Thu Jun 6 21:37:19 2019 +0200

    Refactoring index merger
---
 .../group/DefaultRepositoryGroupAdmin.java         |   2 +-
 .../mock/MockMergedRemoteIndexesScheduler.java     |   2 +-
 .../archiva/indexer/ArchivaIndexManager.java       |   2 +-
 .../merger/MergedRemoteIndexesScheduler.java       |   2 +-
 .../DefaultMergedRemoteIndexesScheduler.java       |   1 -
 .../archiva/repository/RepositoryRegistry.java     |  89 ++++++++++--
 .../archiva/indexer/maven/DefaultIndexMerger.java  |   2 +-
 .../archiva/indexer/maven/MavenIndexContext.java   |   2 +-
 .../repository/maven2/MavenRepositoryProvider.java |  10 +-
 .../maven2/MavenRepositoryProviderTest.java        |  17 +--
 .../archiva/webdav/ArchivaDavResourceFactory.java  | 150 +++++++++++----------
 11 files changed, 168 insertions(+), 111 deletions(-)

diff --git 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
index 37fe14a..7cd943d 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/main/java/org/apache/archiva/admin/repository/group/DefaultRepositoryGroupAdmin.java
@@ -28,7 +28,7 @@ import 
org.apache.archiva.admin.repository.AbstractRepositoryAdmin;
 import org.apache.archiva.configuration.Configuration;
 import org.apache.archiva.configuration.RepositoryGroupConfiguration;
 import org.apache.archiva.metadata.model.facets.AuditEvent;
-import org.apache.archiva.scheduler.MergedRemoteIndexesScheduler;
+import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
index 62e5d39..6cd910c 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-default/src/test/java/org/apache/archiva/admin/mock/MockMergedRemoteIndexesScheduler.java
@@ -20,7 +20,7 @@ package org.apache.archiva.admin.mock;
  */
 
 import org.apache.archiva.admin.model.beans.RepositoryGroup;
-import org.apache.archiva.scheduler.MergedRemoteIndexesScheduler;
+import org.apache.archiva.indexer.merger.MergedRemoteIndexesScheduler;
 import org.springframework.stereotype.Service;
 
 import java.nio.file.Path;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
index 7af9d01..4a5e262 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/ArchivaIndexManager.java
@@ -96,7 +96,7 @@ public interface ArchivaIndexManager {
     ArchivaIndexingContext move(ArchivaIndexingContext context, Repository 
repo) throws IndexCreationFailedException;
 
     /**
-     * Returns the local path where the index is stored.
+     * Updates the local path where the index is stored using the repository 
information.
      * @return
      */
     public void updateLocalIndexPath(Repository repo);
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/MergedRemoteIndexesScheduler.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/MergedRemoteIndexesScheduler.java
index 9ba97e7..8125610 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/MergedRemoteIndexesScheduler.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/indexer/merger/MergedRemoteIndexesScheduler.java
@@ -1,4 +1,4 @@
-package org.apache.archiva.scheduler;
+package org.apache.archiva.indexer.merger;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
index 0e918a5..fb762b6 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/indexer/merger/DefaultMergedRemoteIndexesScheduler.java
@@ -21,7 +21,6 @@ package org.apache.archiva.indexer.merger;
 
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.RepositoryGroup;
-import org.apache.archiva.scheduler.MergedRemoteIndexesScheduler;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
index 73114fc..d46c1d0 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/RepositoryRegistry.java
@@ -19,14 +19,7 @@ package org.apache.archiva.repository;
  * under the License.
  */
 
-import org.apache.archiva.configuration.ArchivaConfiguration;
-import org.apache.archiva.configuration.Configuration;
-import org.apache.archiva.configuration.ConfigurationEvent;
-import org.apache.archiva.configuration.ConfigurationListener;
-import org.apache.archiva.configuration.IndeterminateConfigurationException;
-import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
-import org.apache.archiva.configuration.ProxyConnectorConfiguration;
-import org.apache.archiva.configuration.RemoteRepositoryConfiguration;
+import org.apache.archiva.configuration.*;
 import org.apache.archiva.indexer.ArchivaIndexManager;
 import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.indexer.IndexCreationFailedException;
@@ -95,6 +88,9 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
     private Map<String, RemoteRepository> remoteRepositories = new HashMap<>( 
);
     private Map<String, RemoteRepository> uRemoteRepositories = 
Collections.unmodifiableMap( remoteRepositories );
 
+    private Map<String, RepositoryGroup> repositoryGroups = new HashMap<>();
+    private Map<String, RepositoryGroup> uRepositoryGroups = 
Collections.unmodifiableMap(repositoryGroups);
+
     private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock( );
 
     public void setArchivaConfiguration( ArchivaConfiguration 
archivaConfiguration) {
@@ -118,6 +114,10 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
             }
             remoteRepositories.clear( );
             remoteRepositories.putAll( getRemoteRepositoriesFromConfig( ) );
+
+            repositoryGroups.clear();
+            repositoryGroups.putAll(getRepositorGroupsFromConfig());
+
             // archivaConfiguration.addChangeListener(this);
             archivaConfiguration.addListener(this);
         }
@@ -341,6 +341,59 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
         }
     }
 
+    private Map<String, RepositoryGroup> getRepositorGroupsFromConfig( )
+    {
+        try
+        {
+            List<RepositoryGroupConfiguration> repositoryGroupConfigurations =
+                    getArchivaConfiguration( ).getConfiguration( 
).getRepositoryGroups();
+
+            if ( repositoryGroupConfigurations == null )
+            {
+                return Collections.emptyMap();
+            }
+
+            Map<String, RepositoryGroup> repositoryGroupMap = new 
LinkedHashMap<>( repositoryGroupConfigurations.size( ) );
+
+            Map<RepositoryType, RepositoryProvider> providerMap = 
createProviderMap( );
+            for ( RepositoryGroupConfiguration repoConfig : 
repositoryGroupConfigurations )
+            {
+                RepositoryType repositoryType = RepositoryType.valueOf( 
repoConfig.getType( ) );
+                if ( providerMap.containsKey( repositoryType ) )
+                {
+                    try
+                    {
+                        RepositoryGroup repo = createNewRepositoryGroup( 
providerMap.get( repositoryType ), repoConfig );
+                        repositoryGroupMap.put( repo.getId( ), repo );
+                    }
+                    catch ( Exception e )
+                    {
+                        log.error( "Could not create repository group {}: {}", 
repoConfig.getId( ), e.getMessage( ), e );
+                    }
+                }
+            }
+            return repositoryGroupMap;
+        } catch (Throwable e) {
+            log.error("Could not initialize repositories from config: 
{}",e.getMessage(), e );
+            //noinspection unchecked
+            return Collections.emptyMap();
+        }
+    }
+
+    RepositoryGroup createNewRepositoryGroup(RepositoryProvider provider, 
RepositoryGroupConfiguration config) throws RepositoryException {
+        RepositoryGroup repositoryGroup = 
provider.createRepositoryGroup(config);
+        repositoryGroup.addListener(this);
+        updateRepositoryReferences(provider, repositoryGroup, config);
+        return repositoryGroup;
+    }
+
+    private void updateRepositoryReferences(RepositoryProvider provider, 
RepositoryGroup group, RepositoryGroupConfiguration configuration) {
+        if (group instanceof EditableRepositoryGroup) {
+            EditableRepositoryGroup eGroup = (EditableRepositoryGroup) group;
+            
eGroup.setRepositories(configuration.getRepositories().stream().map(r -> 
getManagedRepository(r)).collect(Collectors.toList()));
+        }
+    }
+
     private ArchivaConfiguration getArchivaConfiguration( )
     {
         return this.archivaConfiguration;
@@ -356,7 +409,7 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
         rwLock.readLock( ).lock( );
         try
         {
-            return Stream.concat( managedRepositories.values( ).stream( ), 
remoteRepositories.values( ).stream( ) ).collect( Collectors.toList( ) );
+            return Stream.concat( managedRepositories.values( ).stream( ), 
remoteRepositories.values( ).stream( )).collect( Collectors.toList( ) );
         }
         finally
         {
@@ -398,6 +451,15 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
         }
     }
 
+    public Collection<RepositoryGroup>  getRepositoryGroups() {
+        rwLock.readLock().lock();
+        try {
+            return uRepositoryGroups.values();
+        } finally {
+            rwLock.readLock().unlock();
+        }
+    }
+
     /**
      * Returns the repository with the given id. The returned repository may 
be a managed or remote repository.
      * It returns null, if no repository is registered with the given id.
@@ -468,6 +530,15 @@ public class RepositoryRegistry implements 
ConfigurationListener, RepositoryEven
         }
     }
 
+    public RepositoryGroup getRepositoryGroup( String groupId ) {
+        rwLock.readLock().lock();
+        try {
+            return repositoryGroups.get(groupId);
+        } finally {
+            rwLock.readLock().unlock();
+        }
+    }
+
     /**
      * Adds a new repository to the current list, or replaces the repository 
definition with
      * the same id, if it exists already.
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
index 0843f23..e418341 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/DefaultIndexMerger.java
@@ -1,4 +1,4 @@
-package org.apache.archiva.indexer.maven.merger;
+package org.apache.archiva.indexer.maven;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexContext.java
 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexContext.java
index e031922..47de4b7 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexContext.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-indexer/src/main/java/org/apache/archiva/indexer/maven/MavenIndexContext.java
@@ -39,7 +39,7 @@ public class MavenIndexContext implements 
ArchivaIndexingContext {
     private IndexingContext delegate;
     private Repository repository;
 
-    MavenIndexContext(Repository repository, IndexingContext delegate) {
+    protected MavenIndexContext(Repository repository, IndexingContext 
delegate) {
         this.delegate = delegate;
         this.repository = repository;
 
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
index 24216ef..f046026 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven2/MavenRepositoryProvider.java
@@ -42,8 +42,6 @@ import java.time.Duration;
 import java.time.Period;
 import java.time.temporal.ChronoUnit;
 import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -58,9 +56,6 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
     private ArchivaConfiguration archivaConfiguration;
 
     @Inject
-    private RepositoryRegistry repositoryRegistry;
-
-    @Inject
     private FileLockManager fileLockManager;
 
     private static final Logger log = 
LoggerFactory.getLogger(MavenRepositoryProvider.class);
@@ -257,10 +252,10 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
     @Override
     public void updateRepositoryGroupInstance(EditableRepositoryGroup 
repositoryGroup, RepositoryGroupConfiguration configuration) throws 
RepositoryException {
         repositoryGroup.setName(repositoryGroup.getPrimaryLocale(), 
configuration.getName());
-        
repositoryGroup.setRepositories(configuration.getRepositories().stream().map(rid
 -> repositoryRegistry.getManagedRepository(rid)).collect(Collectors.toList()));
         repositoryGroup.setMergedIndexPath(configuration.getMergedIndexPath());
         repositoryGroup.setMergedIndexTTL(configuration.getMergedIndexTtl());
         
repositoryGroup.setSchedulingDefinition(configuration.getCronExpression());
+        // References to other repositories are set filled by the registry
     }
 
     @Override
@@ -447,7 +442,4 @@ public class MavenRepositoryProvider implements 
RepositoryProvider {
         //
     }
 
-    public void setRepositoryRegistry(RepositoryRegistry reg) {
-        this.repositoryRegistry = reg;
-    }
 }
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
index 0ec850e..8511b99 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven2/MavenRepositoryProviderTest.java
@@ -72,9 +72,6 @@ public class MavenRepositoryProviderTest
         
mockConfiguration.getConfiguration().getArchivaRuntimeConfiguration().setRepositoryBaseDirectory(
 "repositories" );
         provider.setArchivaConfiguration( mockConfiguration );
 
-        reg = new RepositoryRegistryMock();
-        reg.setArchivaConfiguration(mockConfiguration);
-        provider.setRepositoryRegistry(reg);
     }
 
     @After
@@ -337,14 +334,6 @@ public class MavenRepositoryProviderTest
 
     @Test
     public void createRepositoryGroupWithCfg() throws RepositoryException {
-        MavenManagedRepository repo1 = new MavenManagedRepository( "test01", 
"My Test repo", Paths.get("target/repositories") );
-
-        MavenManagedRepository repo2 = new MavenManagedRepository( "test02", 
"My Test repo", Paths.get("target/repositories") );
-        reg.putRepository(repo1);
-        reg.putRepository(repo2);
-
-        assertNotNull(reg.getManagedRepository("test01"));
-        assertNotNull(reg.getManagedRepository("test02"));
 
         RepositoryGroupConfiguration cfg = new RepositoryGroupConfiguration();
         cfg.setId("group2");
@@ -364,9 +353,9 @@ public class MavenRepositoryProviderTest
         assertEquals("0 0 03 ? * MON", grp.getSchedulingDefinition());
         assertEquals(".index-abc", grp.getMergedIndexPath().getName());
         assertEquals(504, grp.getMergedIndexTTL());
-        assertEquals(2, grp.getRepositories().size());
-        assertTrue(grp.getRepositories().stream().anyMatch(r -> 
"test01".equals(r.getId())));
-        assertTrue(grp.getRepositories().stream().anyMatch(r -> 
"test02".equals(r.getId())));
+        assertEquals(0, grp.getRepositories().size());
+        // assertTrue(grp.getRepositories().stream().anyMatch(r -> 
"test01".equals(r.getId())));
+        // assertTrue(grp.getRepositories().stream().anyMatch(r -> 
"test02".equals(r.getId())));
     }
 
 }
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
index e9c8eb1..07ad2fd 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
@@ -31,6 +31,7 @@ import org.apache.archiva.common.utils.PathUtil;
 import org.apache.archiva.common.utils.VersionUtil;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.configuration.RepositoryGroupConfiguration;
+import org.apache.archiva.indexer.ArchivaIndexingContext;
 import org.apache.archiva.indexer.merger.IndexMerger;
 import org.apache.archiva.indexer.merger.IndexMergerException;
 import org.apache.archiva.indexer.merger.IndexMergerRequest;
@@ -59,6 +60,7 @@ import org.apache.archiva.redback.system.SecuritySession;
 import org.apache.archiva.redback.users.User;
 import org.apache.archiva.redback.users.UserManager;
 import org.apache.archiva.repository.*;
+import org.apache.archiva.repository.content.FilesystemAsset;
 import org.apache.archiva.repository.content.maven2.MavenRepositoryRequestInfo;
 import org.apache.archiva.repository.events.AuditListener;
 import org.apache.archiva.repository.features.IndexCreationFeature;
@@ -210,10 +212,9 @@ public class ArchivaDavResourceFactory
 
         final String sRepoId = archivaLocator.getRepositoryId();
 
-        RepositoryGroupConfiguration repoGroupConfig =
-            
archivaConfiguration.getConfiguration().getRepositoryGroupsAsMap().get( sRepoId 
);
+        RepositoryGroup repoGroup = 
repositoryRegistry.getRepositoryGroup(sRepoId);
 
-        final boolean isGroupRepo = repoGroupConfig != null;
+        final boolean isGroupRepo = repoGroup != null;
 
         String activePrincipal = getActivePrincipal( request );
 
@@ -230,14 +231,14 @@ public class ArchivaDavResourceFactory
                                         "Write method not allowed for 
repository groups." );
             }
 
-            log.debug( "Repository group '{}' accessed by '{}", 
repoGroupConfig.getId(), activePrincipal );
+            log.debug( "Repository group '{}' accessed by '{}", 
repoGroup.getId(), activePrincipal );
 
             // handle browse requests for virtual repos
             if ( getLogicalResource( archivaLocator, null, true ).endsWith( 
"/" ) )
             {
                 DavResource davResource =
-                    getResourceFromGroup( request, 
repoGroupConfig.getRepositories(), archivaLocator,
-                                          repoGroupConfig );
+                    getResourceFromGroup( request, archivaLocator,
+                                          repoGroup );
 
                 setHeaders( response, locator, davResource, true );
 
@@ -249,11 +250,9 @@ public class ArchivaDavResourceFactory
                 // make a copy to avoid potential concurrent modifications 
(eg. by configuration)
                 // TODO: ultimately, locking might be more efficient than 
copying in this fashion since updates are
                 //  infrequent
-                List<String> repositories = new ArrayList<>( 
repoGroupConfig.getRepositories() );
-                resource = processRepositoryGroup( request, archivaLocator, 
repositories, activePrincipal,
-                                                   resourcesInAbsolutePath, 
repoGroupConfig );
-                for (String repoId: repositories ) {
-                    ManagedRepository repo = 
repositoryRegistry.getManagedRepository(repoId);
+                resource = processRepositoryGroup( request, archivaLocator, 
activePrincipal,
+                                                   resourcesInAbsolutePath, 
repoGroup );
+                for (ManagedRepository repo : repoGroup.getRepositories() ) {
                     if (repo!=null) {
                         repositoryRequestInfo = repo.getRequestInfo();
                         break;
@@ -397,9 +396,9 @@ public class ArchivaDavResourceFactory
     }
 
     private DavResource processRepositoryGroup( final DavServletRequest 
request,
-                                                ArchivaDavResourceLocator 
archivaLocator, List<String> repositories,
+                                                ArchivaDavResourceLocator 
archivaLocator,
                                                 String activePrincipal, 
List<String> resourcesInAbsolutePath,
-                                                RepositoryGroupConfiguration 
repoGroupConfig )
+                                                RepositoryGroup repoGroup )
         throws DavException
     {
         DavResource resource = null;
@@ -409,18 +408,23 @@ public class ArchivaDavResourceFactory
 
         String rootPath = StringUtils.substringBeforeLast( pathInfo, "/" );
 
-        if ( StringUtils.endsWith( rootPath, 
repoGroupConfig.getMergedIndexPath() ) )
+        if ( StringUtils.endsWith( rootPath, 
repoGroup.getMergedIndexPath().getPath() ) )
         {
             // we are in the case of index file request
             String requestedFileName = StringUtils.substringAfterLast( 
pathInfo, "/" );
             Path temporaryIndexDirectory =
-                buildMergedIndexDirectory( repositories, activePrincipal, 
request, repoGroupConfig );
+                buildMergedIndexDirectory( activePrincipal, request, repoGroup 
);
+            asset = new FilesystemAsset()
 
             Path resourceFile = temporaryIndexDirectory.resolve( 
requestedFileName );
-            resource = new ArchivaDavResource( 
resourceFile.toAbsolutePath().toString(), requestedFileName, null,
-                                               request.getRemoteAddr(), 
activePrincipal, request.getDavSession(),
-                                               archivaLocator, this, 
mimeTypes, auditListeners, scheduler,
-                                               fileLockManager );
+            try {
+                resource = new ArchivaDavResource( 
resourceFile.toAbsolutePath().toString(), requestedFileName, null,
+                                                   request.getRemoteAddr(), 
activePrincipal, request.getDavSession(),
+                                                   archivaLocator, this, 
mimeTypes, auditListeners, scheduler );
+            } catch (LayoutException e) {
+                log.error("Bad layout: {}", e.getMessage(), e);
+                throw new DavException(500, e);
+            }
 
         }
         else
@@ -969,28 +973,29 @@ public class ArchivaDavResourceFactory
         }
     }
 
-    private DavResource getResourceFromGroup( DavServletRequest request, 
List<String> repositories,
+    private DavResource getResourceFromGroup( DavServletRequest request,
                                               ArchivaDavResourceLocator 
locator,
-                                              RepositoryGroupConfiguration 
repositoryGroupConfiguration )
+                                              RepositoryGroup repositoryGroup )
         throws DavException
     {
-        if ( repositoryGroupConfiguration.getRepositories() == null
-            || repositoryGroupConfiguration.getRepositories().isEmpty() )
+        final String id = repositoryGroup.getId();
+        final List<ManagedRepository> repositories = 
repositoryGroup.getRepositories();
+        if ( repositories == null
+            || repositories.isEmpty() )
         {
-            Path file =
-                Paths.get( System.getProperty( "appserver.base" ), "groups/" + 
repositoryGroupConfiguration.getId() );
-
-            return new ArchivaDavResource( file.toString(), "groups/" + 
repositoryGroupConfiguration.getId(), null,
-                                           request.getDavSession(), locator, 
this, mimeTypes, auditListeners, scheduler,
-                                           fileLockManager );
+            try {
+                return new ArchivaDavResource( repositoryGroup.getAsset("/"), 
"groups/" + id, null,
+                                               request.getDavSession(), 
locator, this, mimeTypes, auditListeners, scheduler);
+            } catch (LayoutException e) {
+                log.error("Bad repository layout: {}", e.getMessage(), e);
+                throw new DavException(500, e);
+            }
         }
         List<Path> mergedRepositoryContents = new ArrayList<>();
-        // multiple repo types so we guess they are all the same type
-        // so use the first one
-        // FIXME add a method with group in the repository storage
-        String firstRepoId = 
repositoryGroupConfiguration.getRepositories().get( 0 );
 
-        String path = getLogicalResource( locator, 
repositoryRegistry.getManagedRepository( firstRepoId ), false );
+        ManagedRepository firstRepo = repositories.get( 0 );
+
+        String path = getLogicalResource( locator, firstRepo, false );
         if ( path.startsWith( "/" ) )
         {
             path = path.substring( 1 );
@@ -1012,19 +1017,19 @@ public class ArchivaDavResourceFactory
         if ( allow )
         {
 
-            if ( StringUtils.endsWith( pathInfo, 
repositoryGroupConfiguration.getMergedIndexPath() ) )
+            if ( StringUtils.endsWith( pathInfo, 
repositoryGroup.getMergedIndexPath().getPath() ) )
             {
                 Path mergedRepoDir =
-                    buildMergedIndexDirectory( repositories, activePrincipal, 
request, repositoryGroupConfiguration );
+                    buildMergedIndexDirectory( activePrincipal, request, 
repositoryGroup );
                 mergedRepositoryContents.add( mergedRepoDir );
             }
             else
             {
-                if ( StringUtils.equalsIgnoreCase( pathInfo, "/" + 
repositoryGroupConfiguration.getId() ) )
+                if ( StringUtils.equalsIgnoreCase( pathInfo, "/" + id ) )
                 {
                     Path tmpDirectory = Paths.get( 
SystemUtils.getJavaIoTmpDir().toString(),
-                                                  
repositoryGroupConfiguration.getId(),
-                                                      
repositoryGroupConfiguration.getMergedIndexPath() );
+                                                  id,
+                                                      
repositoryGroup.getMergedIndexPath().getFilePath().toString() );
                     if ( !Files.exists(tmpDirectory) )
                     {
                         synchronized ( 
tmpDirectory.toAbsolutePath().toString() )
@@ -1044,19 +1049,18 @@ public class ArchivaDavResourceFactory
                     }
                     mergedRepositoryContents.add( tmpDirectory.getParent() );
                 }
-                for ( String repository : repositories )
+                for ( ManagedRepository repo : repositories )
                 {
                     ManagedRepositoryContent managedRepository = null;
-                    ManagedRepository repo = 
repositoryRegistry.getManagedRepository( repository );
                     if (repo == null) {
                         throw new DavException( 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                            "Invalid managed repository <" + repository + ">");
+                            "Invalid managed repository <" + repo.getId() + 
">");
                     }
                     managedRepository = repo.getContent();
                     if (managedRepository==null) {
-                        log.error("Inconsistency detected. Repository content 
not found for '{}'",repository);
+                        log.error("Inconsistency detected. Repository content 
not found for '{}'",repo.getId());
                         throw new DavException( 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
-                            "Invalid managed repository <" + repository + ">");
+                            "Invalid managed repository <" + repo.getId() + 
">");
                     }
                     Path resourceFile = Paths.get( 
managedRepository.getRepoRoot(), logicalResource.getPath() );
                     if ( Files.exists(resourceFile) )
@@ -1088,10 +1092,10 @@ public class ArchivaDavResourceFactory
                             {
                                 try
                                 {
-                                    if ( isAuthorized( request, repository ) )
+                                    if ( isAuthorized( request, repo.getId() ) 
)
                                     {
                                         mergedRepositoryContents.add( 
resourceFile );
-                                        log.debug( "Repository '{}' accessed 
by '{}'", repository, activePrincipal );
+                                        log.debug( "Repository '{}' accessed 
by '{}'", repo.getId(), activePrincipal );
                                     }
                                 }
                                 catch ( DavException e )
@@ -1109,12 +1113,12 @@ public class ArchivaDavResourceFactory
                                 // for the current user logged in
                                 try
                                 {
-                                    if ( servletAuth.isAuthorized( 
activePrincipal, repository,
+                                    if ( servletAuth.isAuthorized( 
activePrincipal, repo.getId(),
                                                                    
WebdavMethodUtil.getMethodPermission(
                                                                        
request.getMethod() ) ) )
                                     {
                                         mergedRepositoryContents.add( 
resourceFile );
-                                        log.debug( "Repository '{}' accessed 
by '{}'", repository, activePrincipal );
+                                        log.debug( "Repository '{}' accessed 
by '{}'", repo.getId(), activePrincipal );
                                     }
                                 }
                                 catch ( UnauthorizedException e )
@@ -1163,7 +1167,7 @@ public class ArchivaDavResourceFactory
      * @param activePrincipal
      * @return
      */
-    private boolean isAllowedToContinue( DavServletRequest request, 
List<String> repositories, String activePrincipal )
+    private boolean isAllowedToContinue( DavServletRequest request, 
List<ManagedRepository> repositories, String activePrincipal )
     {
         // when no repositories configured it's impossible to browse nothing !
         // at least make possible to see nothing :-)
@@ -1177,11 +1181,11 @@ public class ArchivaDavResourceFactory
         // if securitySession != null, it means that the user was prompted for 
authentication
         if ( httpAuth.getSecuritySession( request.getSession() ) != null )
         {
-            for ( String repository : repositories )
+            for ( ManagedRepository repository : repositories )
             {
                 try
                 {
-                    if ( isAuthorized( request, repository ) )
+                    if ( isAuthorized( request, repository.getId() ) )
                     {
                         allow = true;
                         break;
@@ -1195,11 +1199,11 @@ public class ArchivaDavResourceFactory
         }
         else
         {
-            for ( String repository : repositories )
+            for ( ManagedRepository repository : repositories )
             {
                 try
                 {
-                    if ( servletAuth.isAuthorized( activePrincipal, repository,
+                    if ( servletAuth.isAuthorized( activePrincipal, 
repository.getId(),
                                                    
WebdavMethodUtil.getMethodPermission( request.getMethod() ) ) )
                     {
                         allow = true;
@@ -1262,14 +1266,15 @@ public class ArchivaDavResourceFactory
         }
     }
 
-    protected Path buildMergedIndexDirectory( List<String> repositories, 
String activePrincipal,
+    protected Path buildMergedIndexDirectory( String activePrincipal,
                                               DavServletRequest request,
-                                              RepositoryGroupConfiguration 
repositoryGroupConfiguration )
+                                              RepositoryGroup repositoryGroup )
         throws DavException
     {
 
         try
         {
+            final List<ManagedRepository> repositories = 
repositoryGroup.getRepositories();
             HttpSession session = request.getSession();
 
             @SuppressWarnings( "unchecked" ) Map<String, TemporaryGroupIndex> 
temporaryGroupIndexMap =
@@ -1280,21 +1285,22 @@ public class ArchivaDavResourceFactory
                 temporaryGroupIndexMap = new HashMap<>();
             }
 
-            TemporaryGroupIndex tmp = temporaryGroupIndexMap.get( 
repositoryGroupConfiguration.getId() );
+            final String id = repositoryGroup.getId();
+            TemporaryGroupIndex tmp = temporaryGroupIndexMap.get(id);
 
             if ( tmp != null && tmp.getDirectory() != null && 
Files.exists(tmp.getDirectory()))
             {
                 if ( System.currentTimeMillis() - tmp.getCreationTime() > (
-                    repositoryGroupConfiguration.getMergedIndexTtl() * 60 * 
1000 ) )
+                    repositoryGroup.getMergedIndexTTL() * 60 * 1000 ) )
                 {
                     log.debug( MarkerFactory.getMarker( "group.merged.index" ),
-                               "tmp group index '{}' is too old so delete it", 
repositoryGroupConfiguration.getId() );
+                               "tmp group index '{}' is too old so delete it", 
id);
                     indexMerger.cleanTemporaryGroupIndex( tmp );
                 }
                 else
                 {
                     log.debug( MarkerFactory.getMarker( "group.merged.index" ),
-                               "merged index for group '{}' found in cache", 
repositoryGroupConfiguration.getId() );
+                               "merged index for group '{}' found in cache", 
id);
                     return tmp.getDirectory();
                 }
             }
@@ -1303,14 +1309,14 @@ public class ArchivaDavResourceFactory
 
             String permission = WebdavMethodUtil.getMethodPermission( 
request.getMethod() );
 
-            for ( String repository : repositories )
+            for ( ManagedRepository repository : repositories )
             {
                 try
                 {
-                    if ( servletAuth.isAuthorized( activePrincipal, 
repository, permission ) )
+                    if ( servletAuth.isAuthorized( activePrincipal, 
repository.getId(), permission ) )
                     {
-                        authzRepos.add( repository );
-                        authzRepos.addAll( 
this.repositorySearch.getRemoteIndexingContextIds( repository ) );
+                        authzRepos.add( repository.getId() );
+                        authzRepos.addAll( 
this.repositorySearch.getRemoteIndexingContextIds( repository.getId() ) );
                     }
                 }
                 catch ( UnauthorizedException e )
@@ -1323,15 +1329,15 @@ public class ArchivaDavResourceFactory
 
             }
             log.info( "generate temporary merged index for repository group 
'{}' for repositories '{}'",
-                      repositoryGroupConfiguration.getId(), authzRepos );
+                    id, authzRepos );
 
             Path tempRepoFile = Files.createTempDirectory( "temp" );
             tempRepoFile.toFile().deleteOnExit();
 
             IndexMergerRequest indexMergerRequest =
-                new IndexMergerRequest( authzRepos, true, 
repositoryGroupConfiguration.getId(),
-                                        
repositoryGroupConfiguration.getMergedIndexPath(),
-                                        
repositoryGroupConfiguration.getMergedIndexTtl() ).mergedIndexDirectory(
+                new IndexMergerRequest( authzRepos, true, id,
+                                        
repositoryGroup.getMergedIndexPath().getFilePath().toString(),
+                                        repositoryGroup.getMergedIndexTTL() 
).mergedIndexDirectory(
                     tempRepoFile ).temporary( true );
 
             MergedRemoteIndexesTaskRequest taskRequest =
@@ -1339,14 +1345,14 @@ public class ArchivaDavResourceFactory
 
             MergedRemoteIndexesTask job = new MergedRemoteIndexesTask( 
taskRequest );
 
-            IndexingContext indexingContext = 
job.execute().getIndexingContext();
+            ArchivaIndexingContext indexingContext = 
job.execute().getIndexingContext();
 
-            Path mergedRepoDir = 
indexingContext.getIndexDirectoryFile().toPath();
+            Path mergedRepoDir = Paths.get(indexingContext.getPath());
             TemporaryGroupIndex temporaryGroupIndex =
-                new TemporaryGroupIndex( mergedRepoDir, 
indexingContext.getId(), repositoryGroupConfiguration.getId(),
-                                         
repositoryGroupConfiguration.getMergedIndexTtl() ) //
+                new TemporaryGroupIndex( mergedRepoDir, 
indexingContext.getId(), id,
+                                         repositoryGroup.getMergedIndexTTL() ) 
//
                     .setCreationTime( new Date().getTime() );
-            temporaryGroupIndexMap.put( repositoryGroupConfiguration.getId(), 
temporaryGroupIndex );
+            temporaryGroupIndexMap.put( id, temporaryGroupIndex );
             session.setAttribute( 
TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY,
                                   temporaryGroupIndexMap );
             return mergedRepoDir;

Reply via email to