From 3332f36a12526d3d9ab0f9392ea5c420f6618e2d Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Sat, 5 Nov 2011 09:08:42 +0000 Subject: [PATCH] [MRM-815] aggregate indices for repository groups. correctlty returned various index files. git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1197906 13f79535-47bb-0310-9956-ffa450edef68 --- .../src/main/webapp/WEB-INF/web.xml | 9 + .../webdav/ArchivaDavResourceFactory.java | 170 +++++++++++------- 2 files changed, 112 insertions(+), 67 deletions(-) diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml index 4e0a1ecbe..2cb7f1d9d 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/web.xml @@ -85,6 +85,10 @@ + + net.sf.ehcache.constructs.web.ShutdownListener + + contextConfigLocation @@ -190,4 +194,9 @@ /restServices/* + + + 30 + + 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 e374d504b..f57f64b80 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 @@ -98,8 +98,10 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -253,7 +255,8 @@ public class ArchivaDavResourceFactory // handle browse requests for virtual repos if ( RepositoryPathUtil.getLogicalResource( archivaLocator.getOrigResourcePath() ).endsWith( "/" ) ) { - return getResource( request, repoGroupConfig.getRepositories(), archivaLocator ); + return getResource( request, repoGroupConfig.getRepositories(), archivaLocator, + archivaLocator.getRepositoryId() ); } else { @@ -262,7 +265,7 @@ public class ArchivaDavResourceFactory // infrequent List repositories = new ArrayList( repoGroupConfig.getRepositories() ); resource = processRepositoryGroup( request, archivaLocator, repositories, activePrincipal, - resourcesInAbsolutePath ); + resourcesInAbsolutePath, archivaLocator.getRepositoryId() ); } } else @@ -394,51 +397,71 @@ public class ArchivaDavResourceFactory private DavResource processRepositoryGroup( final DavServletRequest request, ArchivaDavResourceLocator archivaLocator, List repositories, - String activePrincipal, List resourcesInAbsolutePath ) + String activePrincipal, List resourcesInAbsolutePath, + String repositoryGroupId ) throws DavException { DavResource resource = null; List storedExceptions = new ArrayList(); - for ( String repositoryId : repositories ) + String pathInfo = StringUtils.removeEnd( request.getPathInfo(), "/" ); + + String rootPath = StringUtils.substringBeforeLast( pathInfo, "/" ); + + if ( StringUtils.endsWith( rootPath, "/.indexer" ) ) { - ManagedRepositoryContent managedRepository; - try - { - managedRepository = repositoryFactory.getManagedRepositoryContent( repositoryId ); - } - catch ( RepositoryNotFoundException e ) - { - throw new DavException( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e ); - } - catch ( RepositoryException e ) - { - throw new DavException( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e ); - } + // we are in the case of index file request + String requestedFileName = StringUtils.substringAfterLast( pathInfo, "/" ); + File temporaryIndexDirectory = + buildMergedIndexDirectory( repositories, activePrincipal, request, repositoryGroupId ); - try + File resourceFile = new File( temporaryIndexDirectory, requestedFileName ); + resource = new ArchivaDavResource( resourceFile.getAbsolutePath(), requestedFileName, null, + request.getRemoteAddr(), activePrincipal, request.getDavSession(), + archivaLocator, this, mimeTypes, auditListeners, scheduler ); + + } + else + { + for ( String repositoryId : repositories ) { - DavResource updatedResource = - processRepository( request, archivaLocator, activePrincipal, managedRepository ); - if ( resource == null ) + ManagedRepositoryContent managedRepository; + try { - resource = updatedResource; + managedRepository = repositoryFactory.getManagedRepositoryContent( repositoryId ); } + catch ( RepositoryNotFoundException e ) + { + throw new DavException( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e ); + } + catch ( RepositoryException e ) + { + throw new DavException( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e ); + } + + try + { + DavResource updatedResource = + processRepository( request, archivaLocator, activePrincipal, managedRepository ); + if ( resource == null ) + { + resource = updatedResource; + } - String logicalResource = RepositoryPathUtil.getLogicalResource( archivaLocator.getResourcePath() ); - if ( logicalResource.endsWith( "/" ) ) + String logicalResource = RepositoryPathUtil.getLogicalResource( archivaLocator.getResourcePath() ); + if ( logicalResource.endsWith( "/" ) ) + { + logicalResource = logicalResource.substring( 1 ); + } + resourcesInAbsolutePath.add( + new File( managedRepository.getRepoRoot(), logicalResource ).getAbsolutePath() ); + } + catch ( DavException e ) { - logicalResource = logicalResource.substring( 1 ); + storedExceptions.add( e ); } - resourcesInAbsolutePath.add( - new File( managedRepository.getRepoRoot(), logicalResource ).getAbsolutePath() ); - } - catch ( DavException e ) - { - storedExceptions.add( e ); } } - if ( resource == null ) { if ( !storedExceptions.isEmpty() ) @@ -918,7 +941,7 @@ public class ArchivaDavResourceFactory } private DavResource getResource( DavServletRequest request, List repositories, - ArchivaDavResourceLocator locator ) + ArchivaDavResourceLocator locator, String groupId ) throws DavException { List mergedRepositoryContents = new ArrayList(); @@ -945,21 +968,8 @@ public class ArchivaDavResourceFactory String pathInfo = StringUtils.removeEnd( request.getPathInfo(), "/" ); if ( StringUtils.endsWith( pathInfo, "/.indexer" ) ) { - try - { - File mergedRepoDir = buildMergedIndexDirectory( repositories, activePrincipal, request ); - mergedRepositoryContents.add( mergedRepoDir ); - - } - catch ( RepositoryAdminException e ) - { - throw new DavException( 500, e ); - } - catch ( IndexMergerException e ) - { - throw new DavException( 500, e ); - } - + File mergedRepoDir = buildMergedIndexDirectory( repositories, activePrincipal, request, groupId ); + mergedRepositoryContents.add( mergedRepoDir ); } else { @@ -1181,35 +1191,61 @@ public class ArchivaDavResourceFactory } protected File buildMergedIndexDirectory( List repositories, String activePrincipal, - DavServletRequest request ) - throws RepositoryAdminException, IndexMergerException + DavServletRequest request, String groupId ) + throws DavException { - Set authzRepos = new HashSet(); - for ( String repository : repositories ) + try { - try + HttpSession session = request.getSession(); + Map testValue = (Map) session.getAttribute( "TMP_GROUP_INDEXES" ); + if ( testValue == null ) { - if ( servletAuth.isAuthorized( activePrincipal, repository, - WebdavMethodUtil.getMethodPermission( request.getMethod() ) ) ) - { - authzRepos.add( repository ); - authzRepos.addAll( this.repositorySearch.getRemoteIndexingContextIds( repository ) ); - } + testValue = new HashMap(); } - catch ( UnauthorizedException e ) + + File tmp = testValue.get( groupId ); + if ( tmp != null ) { - // TODO: review exception handling - if ( log.isDebugEnabled() ) + return tmp; + } + + Set authzRepos = new HashSet(); + for ( String repository : repositories ) + { + try + { + if ( servletAuth.isAuthorized( activePrincipal, repository, + WebdavMethodUtil.getMethodPermission( request.getMethod() ) ) ) + { + authzRepos.add( repository ); + authzRepos.addAll( this.repositorySearch.getRemoteIndexingContextIds( repository ) ); + } + } + catch ( UnauthorizedException e ) { - log.debug( "Skipping repository '" + repository + "' for user '" + activePrincipal + "': " - + e.getMessage() ); + // TODO: review exception handling + if ( log.isDebugEnabled() ) + { + log.debug( "Skipping repository '" + repository + "' for user '" + activePrincipal + "': " + + e.getMessage() ); + } } } - } - File mergedRepoDir = indexMerger.buildMergedIndex( authzRepos, true ); - return mergedRepoDir; + File mergedRepoDir = indexMerger.buildMergedIndex( authzRepos, true ); + testValue.put( groupId, mergedRepoDir ); + session.setAttribute( "TMP_GROUP_INDEXES", testValue ); + return mergedRepoDir; + } + catch ( RepositoryAdminException e ) + { + throw new DavException( 500, e ); + } + catch ( IndexMergerException e ) + { + throw new DavException( 500, e ); + } } -- 2.39.5