From aa68c370b2d26d9b8b4fb405919a0b572c5a9512 Mon Sep 17 00:00:00 2001 From: Martin Stockhammer Date: Thu, 6 Jun 2019 21:37:19 +0200 Subject: [PATCH] Refactoring index merger --- .../group/DefaultRepositoryGroupAdmin.java | 2 +- .../MockMergedRemoteIndexesScheduler.java | 2 +- .../archiva/indexer/ArchivaIndexManager.java | 2 +- .../merger/MergedRemoteIndexesScheduler.java | 2 +- .../DefaultMergedRemoteIndexesScheduler.java | 1 - .../repository/RepositoryRegistry.java | 89 +++++++++-- .../indexer/maven/DefaultIndexMerger.java | 2 +- .../indexer/maven/MavenIndexContext.java | 2 +- .../maven2/MavenRepositoryProvider.java | 10 +- .../maven2/MavenRepositoryProviderTest.java | 17 +- .../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 37fe14a2a..7cd943dca 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 62e5d3963..6cd910c2d 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 7af9d019d..4a5e26208 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 9ba97e701..8125610b6 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 0e918a58c..fb762b653 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 73114fcfb..d46c1d016 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 remoteRepositories = new HashMap<>( ); private Map uRemoteRepositories = Collections.unmodifiableMap( remoteRepositories ); + private Map repositoryGroups = new HashMap<>(); + private Map 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 getRepositorGroupsFromConfig( ) + { + try + { + List repositoryGroupConfigurations = + getArchivaConfiguration( ).getConfiguration( ).getRepositoryGroups(); + + if ( repositoryGroupConfigurations == null ) + { + return Collections.emptyMap(); + } + + Map repositoryGroupMap = new LinkedHashMap<>( repositoryGroupConfigurations.size( ) ); + + Map 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 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 0843f230b..e41834136 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 e031922fb..47de4b72c 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 24216ef86..f04602636 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; @@ -57,9 +55,6 @@ public class MavenRepositoryProvider implements RepositoryProvider { @Inject private ArchivaConfiguration archivaConfiguration; - @Inject - private RepositoryRegistry repositoryRegistry; - @Inject private FileLockManager fileLockManager; @@ -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 0ec850e47..8511b9991 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 e9c8eb1f7..07ad2fdfa 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 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 repositories, + ArchivaDavResourceLocator archivaLocator, String activePrincipal, List 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 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 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 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 repositories, String activePrincipal ) + private boolean isAllowedToContinue( DavServletRequest request, List 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 repositories, String activePrincipal, + protected Path buildMergedIndexDirectory( String activePrincipal, DavServletRequest request, - RepositoryGroupConfiguration repositoryGroupConfiguration ) + RepositoryGroup repositoryGroup ) throws DavException { try { + final List repositories = repositoryGroup.getRepositories(); HttpSession session = request.getSession(); @SuppressWarnings( "unchecked" ) Map 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; -- 2.39.5