diff options
author | Olivier Lamy <olamy@apache.org> | 2011-11-05 18:50:28 +0000 |
---|---|---|
committer | Olivier Lamy <olamy@apache.org> | 2011-11-05 18:50:28 +0000 |
commit | 7ad0e303a0b77c9abb8197b4dd528c6f90bd74b3 (patch) | |
tree | ce94e155fdd4cd94c773044ac6330e9ed5f8d371 /archiva-modules/archiva-web | |
parent | e9d93aa21bc44d4cafaecb363a838b4506cbd2bb (diff) | |
download | archiva-7ad0e303a0b77c9abb8197b4dd528c6f90bd74b3.tar.gz archiva-7ad0e303a0b77c9abb8197b4dd528c6f90bd74b3.zip |
[MRM-815] aggregate indices for repository groups.
delete temporary on session end with a session listener
periodical taks to cleanup too old temp group index.
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1198011 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'archiva-modules/archiva-web')
3 files changed, 110 insertions, 10 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 2cb7f1d9d..084c7ff39 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 @@ -89,6 +89,11 @@ <listener-class>net.sf.ehcache.constructs.web.ShutdownListener</listener-class> </listener> + <!-- to cleanup temporary group index created during a session --> + <listener> + <listener-class>org.apache.archiva.webdav.util.TemporaryGroupIndexSessionCleaner</listener-class> + </listener> + <context-param> <param-name>contextConfigLocation</param-name> <param-value> 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 f57f64b80..a4341ced0 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.configuration.ArchivaConfiguration; import org.apache.archiva.configuration.RepositoryGroupConfiguration; import org.apache.archiva.indexer.merger.IndexMerger; import org.apache.archiva.indexer.merger.IndexMergerException; +import org.apache.archiva.indexer.merger.TemporaryGroupIndex; import org.apache.archiva.indexer.search.RepositorySearch; import org.apache.archiva.model.ArchivaRepositoryMetadata; import org.apache.archiva.model.ArtifactReference; @@ -52,6 +53,7 @@ import org.apache.archiva.scheduler.repository.RepositoryArchivaTaskScheduler; import org.apache.archiva.security.ServletAuthenticator; import org.apache.archiva.webdav.util.MimeTypes; import org.apache.archiva.webdav.util.RepositoryPathUtil; +import org.apache.archiva.webdav.util.TemporaryGroupIndexSessionCleaner; import org.apache.archiva.webdav.util.WebdavMethodUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; @@ -65,6 +67,7 @@ import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.lock.LockManager; import org.apache.jackrabbit.webdav.lock.SimpleLockManager; +import org.apache.maven.index.context.IndexingContext; import org.apache.maven.model.DistributionManagement; import org.apache.maven.model.Model; import org.apache.maven.model.Relocation; @@ -98,6 +101,7 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -1198,16 +1202,29 @@ public class ArchivaDavResourceFactory try { HttpSession session = request.getSession(); - Map<String, File> testValue = (Map<String, File>) session.getAttribute( "TMP_GROUP_INDEXES" ); - if ( testValue == null ) + + Map<String, TemporaryGroupIndex> temporaryGroupIndexMap = + (Map<String, TemporaryGroupIndex>) session.getAttribute( + TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY ); + if ( temporaryGroupIndexMap == null ) { - testValue = new HashMap<String, File>(); + temporaryGroupIndexMap = new HashMap<String, TemporaryGroupIndex>(); } - File tmp = testValue.get( groupId ); - if ( tmp != null ) + TemporaryGroupIndex tmp = temporaryGroupIndexMap.get( groupId ); + + if ( tmp != null && tmp.getDirectory() != null && tmp.getDirectory().exists() ) { - return tmp; + if ( System.currentTimeMillis() - tmp.getCreationTime() > ( IndexMerger.DEFAULT_GROUP_INDEX_TTL * 60 + * 1000 ) ) + { + log.debug( "tmp group index is too old so delete it" ); + indexMerger.cleanTemporaryGroupIndex( tmp ); + } + else + { + return tmp.getDirectory(); + } } Set<String> authzRepos = new HashSet<String>(); @@ -1232,10 +1249,14 @@ public class ArchivaDavResourceFactory } } } - - File mergedRepoDir = indexMerger.buildMergedIndex( authzRepos, true ); - testValue.put( groupId, mergedRepoDir ); - session.setAttribute( "TMP_GROUP_INDEXES", testValue ); + IndexingContext indexingContext = indexMerger.buildMergedIndex( authzRepos, true ); + File mergedRepoDir = indexingContext.getIndexDirectoryFile(); + TemporaryGroupIndex temporaryGroupIndex = + new TemporaryGroupIndex( mergedRepoDir, indexingContext.getId() ).setCreationTime( + new Date().getTime() ); + temporaryGroupIndexMap.put( groupId, temporaryGroupIndex ); + session.setAttribute( TemporaryGroupIndexSessionCleaner.TEMPORARY_INDEX_SESSION_KEY, + temporaryGroupIndexMap ); return mergedRepoDir; } catch ( RepositoryAdminException e ) diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/TemporaryGroupIndexSessionCleaner.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/TemporaryGroupIndexSessionCleaner.java new file mode 100644 index 000000000..20ad746bd --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/util/TemporaryGroupIndexSessionCleaner.java @@ -0,0 +1,74 @@ +package org.apache.archiva.webdav.util; +/* + * 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.merger.IndexMerger; +import org.apache.archiva.indexer.merger.TemporaryGroupIndex; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import javax.servlet.http.HttpSessionEvent; +import javax.servlet.http.HttpSessionListener; +import java.util.HashMap; +import java.util.Map; + +/** + * this http session listener will delete repository group index requested by a user + * at this end of the http session + * + * @author Olivier Lamy + * @since 1.4-M2 + */ +public class TemporaryGroupIndexSessionCleaner + implements HttpSessionListener +{ + + private Logger log = LoggerFactory.getLogger( getClass() ); + + private IndexMerger indexMerger; + + public static final String TEMPORARY_INDEX_SESSION_KEY = TemporaryGroupIndexSessionCleaner.class.getName(); + + public void sessionCreated( HttpSessionEvent httpSessionEvent ) + { + // ensure the map is here to avoid NPE + httpSessionEvent.getSession().setAttribute( TEMPORARY_INDEX_SESSION_KEY, + new HashMap<String, TemporaryGroupIndex>() ); + WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext( + httpSessionEvent.getSession().getServletContext() ); + indexMerger = webApplicationContext.getBean( IndexMerger.class ); + } + + public void sessionDestroyed( HttpSessionEvent httpSessionEvent ) + { + Map<String, TemporaryGroupIndex> tempFilesPerKey = + (Map<String, TemporaryGroupIndex>) httpSessionEvent.getSession().getAttribute( + TEMPORARY_INDEX_SESSION_KEY ); + + for ( TemporaryGroupIndex temporaryGroupIndex : tempFilesPerKey.values() ) + { + log.info( "cleanup temporaryGroupIndex {} directory {}", temporaryGroupIndex.getIndexId(), + temporaryGroupIndex.getDirectory().getAbsolutePath() ); + indexMerger.cleanTemporaryGroupIndex( temporaryGroupIndex ); + } + } +} +} |