You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ol...@apache.org on 2008/07/25 00:31:26 UTC
svn commit: r679588 [4/8] - in /continuum/branches/CONTINUUM-782: ./
continuum-api/ continuum-api/src/main/java/org/apache/continuum/purge/
continuum-api/src/main/java/org/apache/continuum/purge/controller/
continuum-api/src/main/java/org/apache/contin...
Propchange: continuum/branches/CONTINUUM-782/continuum-purge-07242008.patch
------------------------------------------------------------------------------
svn:executable = *
Added: continuum/branches/CONTINUUM-782/continuum-purge/pom.xml
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/pom.xml?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/pom.xml (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/pom.xml Thu Jul 24 15:31:19 2008
@@ -0,0 +1,130 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>continuum</artifactId>
+ <groupId>org.apache.continuum</groupId>
+ <version>1.2-SNAPSHOT</version>
+ </parent>
+ <artifactId>continuum-purge</artifactId>
+ <name>Continuum Purge System</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.continuum</groupId>
+ <artifactId>continuum-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.continuum</groupId>
+ <artifactId>continuum-commons</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.continuum</groupId>
+ <artifactId>continuum-release</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-taskqueue</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-common</artifactId>
+ <version>${archiva.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-core-consumers</artifactId>
+ <version>${archiva.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-database</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-configuration</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-indexer</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-consumer-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-repository-layer</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-repository-layer</artifactId>
+ <version>${archiva.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.archiva</groupId>
+ <artifactId>archiva-configuration</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <!-- === Testing Dependencies === -->
+ <dependency>
+ <groupId>hsqldb</groupId>
+ <artifactId>hsqldb</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.continuum</groupId>
+ <artifactId>continuum-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generate</id>
+ <goals>
+ <goal>descriptor</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>merge</id>
+ <goals>
+ <goal>merge-descriptors</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ </testResources>
+ </build>
+</project>
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/pom.xml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,10 @@
+package org.apache.continuum.purge;
+
+public class ContinuumPurgeConstants
+{
+ public static final String PURGE_REPOSITORY = "repository";
+
+ public static final String PURGE_DIRECTORY_RELEASES = "releases";
+
+ public static final String PURGE_DIRECTORY_BUILDOUTPUT = "buildOutput";
+}
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,355 @@
+package org.apache.continuum.purge;
+
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
+import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.LocalRepository;
+import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.apache.maven.continuum.store.ContinuumObjectNotFoundException;
+import org.apache.maven.continuum.store.ContinuumStore;
+import org.apache.maven.continuum.store.ContinuumStoreException;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
+
+/**
+ * DefaultPurgeConfigurationService
+ *
+ * @author Maria Catherine Tan
+ * @plexus.component role="org.apache.continuum.purge.PurgeConfigurationService" role-hint="default"
+ */
+public class DefaultPurgeConfigurationService
+ implements PurgeConfigurationService, Contextualizable
+{
+ /**
+ * @plexus.requirement role-hint="jdo"
+ */
+ private ContinuumStore store;
+
+ private PlexusContainer container;
+
+ public AbstractPurgeConfiguration addPurgeConfiguration( AbstractPurgeConfiguration purgeConfig )
+ throws PurgeConfigurationServiceException
+ {
+ AbstractPurgeConfiguration purgeConfiguration = null;
+
+ if ( purgeConfig instanceof RepositoryPurgeConfiguration )
+ {
+ purgeConfiguration = addRepositoryPurgeConfiguration( (RepositoryPurgeConfiguration) purgeConfig );
+ }
+ else if ( purgeConfig instanceof DirectoryPurgeConfiguration )
+ {
+ purgeConfiguration = addDirectoryPurgeConfiguration( (DirectoryPurgeConfiguration) purgeConfig );
+ }
+
+ return purgeConfiguration;
+ }
+
+ public void updatePurgeConfiguration( AbstractPurgeConfiguration purgeConfig )
+ throws PurgeConfigurationServiceException
+ {
+ if ( purgeConfig instanceof RepositoryPurgeConfiguration )
+ {
+ updateRepositoryPurgeConfiguration( (RepositoryPurgeConfiguration) purgeConfig );
+ }
+ else if ( purgeConfig instanceof DirectoryPurgeConfiguration )
+ {
+ updateDirectoryPurgeConfiguration( (DirectoryPurgeConfiguration) purgeConfig );
+ }
+ }
+
+ public void removePurgeConfiguration( int purgeConfigId )
+ throws PurgeConfigurationServiceException
+ {
+ AbstractPurgeConfiguration purgeConfig = getPurgeConfiguration( purgeConfigId );
+
+ if ( purgeConfig instanceof RepositoryPurgeConfiguration )
+ {
+ removeRepositoryPurgeConfiguration( (RepositoryPurgeConfiguration) purgeConfig );
+ }
+ else if ( purgeConfig instanceof DirectoryPurgeConfiguration )
+ {
+ removeDirectoryPurgeConfiguration( (DirectoryPurgeConfiguration) purgeConfig );
+ }
+ }
+
+ public DirectoryPurgeConfiguration addDirectoryPurgeConfiguration( DirectoryPurgeConfiguration dirPurge )
+ throws PurgeConfigurationServiceException
+ {
+ DirectoryPurgeConfiguration dirPurgeConfig = null;
+
+ try
+ {
+ dirPurgeConfig = store.addDirectoryPurgeConfiguration( dirPurge );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+
+ return dirPurgeConfig;
+ }
+
+ public RepositoryPurgeConfiguration addRepositoryPurgeConfiguration( RepositoryPurgeConfiguration repoPurge )
+ throws PurgeConfigurationServiceException
+ {
+ RepositoryPurgeConfiguration repoPurgeConfig = null;
+
+ try
+ {
+ repoPurgeConfig = store.addRepositoryPurgeConfiguration( repoPurge );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+
+ return repoPurgeConfig;
+ }
+
+ public RepositoryPurgeConfiguration getDefaultPurgeConfigurationForRepository( int repositoryId )
+ {
+ List<RepositoryPurgeConfiguration> purgeConfigs = getRepositoryPurgeConfigurationsByRepository( repositoryId );
+
+ for ( RepositoryPurgeConfiguration purgeConfig : purgeConfigs )
+ {
+ if ( purgeConfig.isDefaultPurge() )
+ {
+ return purgeConfig;
+ }
+ }
+
+ return null;
+ }
+
+ public List<DirectoryPurgeConfiguration> getAllDirectoryPurgeConfigurations()
+ {
+ return store.getAllDirectoryPurgeConfigurations();
+ }
+
+ public List<RepositoryPurgeConfiguration> getAllRepositoryPurgeConfigurations()
+ {
+ return store.getAllRepositoryPurgeConfigurations();
+ }
+
+ public List<AbstractPurgeConfiguration> getAllPurgeConfigurations()
+ {
+ List<RepositoryPurgeConfiguration> repoPurge = getAllRepositoryPurgeConfigurations();
+ List<DirectoryPurgeConfiguration> dirPurge = getAllDirectoryPurgeConfigurations();
+
+ List<AbstractPurgeConfiguration> allPurgeConfigs = new ArrayList<AbstractPurgeConfiguration>();
+
+ allPurgeConfigs.addAll( repoPurge );
+ allPurgeConfigs.addAll( dirPurge );
+
+ return allPurgeConfigs;
+ }
+
+ public DirectoryPurgeConfiguration getDefaultPurgeConfigurationForDirectoryType( String directoryType )
+ {
+ List<DirectoryPurgeConfiguration> purgeConfigs = store.getDirectoryPurgeConfigurationsByType( directoryType );
+
+ for ( DirectoryPurgeConfiguration purgeConfig : purgeConfigs )
+ {
+ if ( purgeConfig.isDefaultPurge() )
+ {
+ return purgeConfig;
+ }
+ }
+
+ return null;
+ }
+
+ public List<DirectoryPurgeConfiguration> getDirectoryPurgeConfigurationsByLocation( String location )
+ {
+ return store.getDirectoryPurgeConfigurationsByLocation( location );
+ }
+
+ public List<DirectoryPurgeConfiguration> getDirectoryPurgeConfigurationsBySchedule( int scheduleId )
+ {
+ return store.getDirectoryPurgeConfigurationsBySchedule( scheduleId );
+ }
+
+ public List<RepositoryPurgeConfiguration> getRepositoryPurgeConfigurationsByRepository( int repositoryId )
+ {
+ return store.getRepositoryPurgeConfigurationsByLocalRepository( repositoryId );
+ }
+
+ public List<RepositoryPurgeConfiguration> getRepositoryPurgeConfigurationsBySchedule( int scheduleId )
+ {
+ return store.getRepositoryPurgeConfigurationsBySchedule( scheduleId );
+ }
+
+ public void removeDirectoryPurgeConfiguration( DirectoryPurgeConfiguration purgeConfig )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ store.removeDirectoryPurgeConfiguration( purgeConfig );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ }
+
+ public void removeRepositoryPurgeConfiguration( RepositoryPurgeConfiguration purgeConfig )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ store.removeRepositoryPurgeConfiguration( purgeConfig );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ }
+
+ public void updateDirectoryPurgeConfiguration( DirectoryPurgeConfiguration purgeConfig )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ store.updateDirectoryPurgeConfiguration( purgeConfig );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ }
+
+ public void updateRepositoryPurgeConfiguration( RepositoryPurgeConfiguration purgeConfig )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ store.updateRepositoryPurgeConfiguration( purgeConfig );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ }
+
+ public DirectoryPurgeConfiguration getDirectoryPurgeConfiguration( int purgeConfigId )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ return store.getDirectoryPurgeConfiguration( purgeConfigId );
+ }
+ catch ( ContinuumObjectNotFoundException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ }
+
+ public RepositoryPurgeConfiguration getRepositoryPurgeConfiguration( int purgeConfigId )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ return store.getRepositoryPurgeConfiguration( purgeConfigId );
+ }
+ catch ( ContinuumObjectNotFoundException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( e.getMessage(), e );
+ }
+ }
+
+ public AbstractPurgeConfiguration getPurgeConfiguration( int purgeConfigId )
+ {
+ AbstractPurgeConfiguration purgeConfig = null;
+
+ try
+ {
+ purgeConfig = getRepositoryPurgeConfiguration( purgeConfigId );
+ }
+ catch ( PurgeConfigurationServiceException e )
+ {
+ // purgeConfigId is not of type repository purge configuration
+ }
+
+ if ( purgeConfig == null )
+ {
+ try
+ {
+ purgeConfig = getDirectoryPurgeConfiguration( purgeConfigId );
+ }
+ catch ( PurgeConfigurationServiceException e )
+ {
+ // purgeConfigId is not of type directory purge configuration
+ }
+ }
+
+ return purgeConfig;
+ }
+
+ public RepositoryManagedContent getManagedRepositoryContent( int repositoryId )
+ throws PurgeConfigurationServiceException
+ {
+ try
+ {
+ LocalRepository repository = store.getLocalRepository( repositoryId );
+
+ RepositoryManagedContent repoContent;
+
+ repoContent = (RepositoryManagedContent) container.lookup( RepositoryManagedContent.class, repository.getLayout() );
+ repoContent.setRepository( repository );
+
+ return repoContent;
+ }
+ catch ( ContinuumObjectNotFoundException e )
+ {
+ throw new PurgeConfigurationServiceException( "Error retrieving managed repository content for: " + repositoryId, e );
+ }
+ catch ( ContinuumStoreException e )
+ {
+ throw new PurgeConfigurationServiceException( "Error retrieving managed repository content for: " + repositoryId, e );
+ }
+ catch ( ComponentLookupException e )
+ {
+ throw new PurgeConfigurationServiceException( "Error retrieving managed repository content for: " + repositoryId, e );
+ }
+ }
+
+ public void contextualize( Context context )
+ throws ContextException
+ {
+ container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+ }
+}
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,73 @@
+package org.apache.continuum.purge.controller;
+
+/*
+ * 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.continuum.model.repository.AbstractPurgeConfiguration;
+import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.purge.executor.CleanAllPurgeExecutor;
+import org.apache.continuum.purge.executor.ContinuumPurgeExecutor;
+import org.apache.continuum.purge.executor.ContinuumPurgeExecutorException;
+import org.apache.continuum.purge.executor.DaysOldDirectoryPurgeExecutor;
+import org.apache.continuum.purge.executor.RetentionCountDirectoryPurgeExecutor;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+/**
+ * DirectoryPurgeController
+ *
+ * @author Maria Catherine Tan
+ * @plexus.component role="org.apache.continuum.purge.controller.PurgeController" role-hint="purge-directory"
+ */
+public class DirectoryPurgeController
+ extends AbstractLogEnabled
+ implements PurgeController
+{
+ private ContinuumPurgeExecutor purgeExecutor;
+
+ public void doPurge( String path )
+ {
+ try
+ {
+ purgeExecutor.purge( path );
+ }
+ catch ( ContinuumPurgeExecutorException e )
+ {
+ getLogger().error( e.getMessage(), e );
+ }
+ }
+
+ public void initializeExecutors( AbstractPurgeConfiguration purgeConfig )
+ throws ContinuumPurgeExecutorException
+ {
+ DirectoryPurgeConfiguration dirPurge = (DirectoryPurgeConfiguration) purgeConfig;
+
+ if ( dirPurge.isDeleteAll() )
+ {
+ purgeExecutor = new CleanAllPurgeExecutor( dirPurge.getDirectoryType() );
+ }
+ else if ( dirPurge.getDaysOlder() > 0 )
+ {
+ purgeExecutor = new DaysOldDirectoryPurgeExecutor( dirPurge.getDaysOlder(), dirPurge.getRetentionCount(), dirPurge.getDirectoryType() );
+ }
+ else
+ {
+ purgeExecutor = new RetentionCountDirectoryPurgeExecutor( dirPurge.getRetentionCount(), dirPurge.getDirectoryType() );
+ }
+ }
+}
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,109 @@
+package org.apache.continuum.purge.controller;
+
+/*
+ * 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.continuum.model.repository.AbstractPurgeConfiguration;
+import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
+import org.apache.continuum.purge.ContinuumPurgeConstants;
+import org.apache.continuum.purge.PurgeConfigurationService;
+import org.apache.continuum.purge.PurgeConfigurationServiceException;
+import org.apache.continuum.purge.executor.CleanAllPurgeExecutor;
+import org.apache.continuum.purge.executor.ContinuumPurgeExecutor;
+import org.apache.continuum.purge.executor.ContinuumPurgeExecutorException;
+import org.apache.continuum.purge.executor.DaysOldRepositoryPurgeExecutor;
+import org.apache.continuum.purge.executor.ReleasedSnapshotsRepositoryPurgeExecutor;
+import org.apache.continuum.purge.executor.RetentionCountRepositoryPurgeExecutor;
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+/**
+ * DefaultPurgeController
+ *
+ * @author Maria Catherine Tan
+ * @plexus.component role="org.apache.continuum.purge.controller.PurgeController" role-hint="purge-repository"
+ */
+public class RepositoryPurgeController
+ extends AbstractLogEnabled
+ implements PurgeController
+{
+ private ContinuumPurgeExecutor purgeExecutor;
+
+ private ContinuumPurgeExecutor purgeReleasedSnapshotsExecutor;
+
+ /**
+ * @plexus.requirement
+ */
+ private PurgeConfigurationService purgeConfigurationService;
+
+ private boolean deleteReleasedSnapshots = false;
+
+ public void initializeExecutors( AbstractPurgeConfiguration purgeConfig )
+ throws ContinuumPurgeExecutorException
+ {
+ RepositoryManagedContent repositoryContent;
+
+ RepositoryPurgeConfiguration repoPurge = (RepositoryPurgeConfiguration) purgeConfig;
+
+ try
+ {
+ repositoryContent = purgeConfigurationService.getManagedRepositoryContent( repoPurge.getRepository().getId() );
+ }
+ catch( PurgeConfigurationServiceException e )
+ {
+ throw new ContinuumPurgeExecutorException( "Error while initializing purge executors", e );
+ }
+
+ if ( repoPurge.isDeleteAll() )
+ {
+ purgeExecutor = new CleanAllPurgeExecutor( ContinuumPurgeConstants.PURGE_REPOSITORY );
+ }
+ else
+ {
+ if ( repoPurge.getDaysOlder() > 0 )
+ {
+ purgeExecutor = new DaysOldRepositoryPurgeExecutor( repositoryContent, repoPurge.getDaysOlder(), repoPurge.getRetentionCount() );
+ }
+ else
+ {
+ purgeExecutor = new RetentionCountRepositoryPurgeExecutor( repositoryContent, repoPurge.getRetentionCount() );
+ }
+
+ purgeReleasedSnapshotsExecutor = new ReleasedSnapshotsRepositoryPurgeExecutor( repositoryContent );
+ deleteReleasedSnapshots = repoPurge.isDeleteReleasedSnapshots();
+ }
+ }
+
+ public void doPurge( String path )
+ {
+ try
+ {
+ if ( deleteReleasedSnapshots)
+ {
+ purgeReleasedSnapshotsExecutor.purge( path );
+ }
+
+ purgeExecutor.purge( path );
+ }
+ catch ( ContinuumPurgeExecutorException e )
+ {
+ getLogger().error( e.getMessage(), e );
+ }
+ }
+}
\ No newline at end of file
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,83 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.io.FilenameFilter;
+import java.util.Set;
+
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.apache.maven.archiva.consumers.core.repository.ArtifactFilenameFilter;
+import org.apache.maven.archiva.model.ArtifactReference;
+
+/**
+ * Some codes were taken from Archiva.
+ * @author Maria Catherine Tan
+ */
+public abstract class AbstractContinuumPurgeExecutor
+ implements ContinuumPurgeExecutor
+{
+ public void purge( Set<ArtifactReference> references, RepositoryManagedContent repository )
+ {
+ if( references != null && !references.isEmpty() )
+ {
+ for ( ArtifactReference reference : references )
+ {
+ File artifactFile = repository.toFile( reference );
+ artifactFile.delete();
+ purgeSupportFiles( artifactFile, artifactFile.getName() );
+ // purge maven metadata
+ purgeSupportFiles( artifactFile.getParentFile(), "maven-metadata" );
+ }
+ }
+ }
+
+ /**
+ * <p>
+ * This find support files for the artifactFile and deletes them.
+ * </p>
+ * <p>
+ * Support Files are things like ".sha1", ".md5", ".asc", etc.
+ * </p>
+ *
+ * @param artifactFile the file to base off of.
+ */
+ protected void purgeSupportFiles( File artifactFile, String filename )
+ {
+ File parentDir = artifactFile.getParentFile();
+
+ if ( !parentDir.exists() )
+ {
+ return;
+ }
+
+ FilenameFilter filter = new ArtifactFilenameFilter( filename );
+
+ File[] files = parentDir.listFiles( filter );
+
+ for ( File file : files )
+ {
+ if ( file.exists() && file.isFile() )
+ {
+ file.delete();
+ }
+ }
+ }
+}
\ No newline at end of file
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,118 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+
+import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.apache.continuum.purge.ContinuumPurgeConstants;
+import org.apache.maven.archiva.consumers.core.repository.ArtifactFilenameFilter;
+import org.codehaus.plexus.util.FileUtils;
+
+/**
+ * @author Maria Catherine Tan
+ */
+public class CleanAllPurgeExecutor
+ extends AbstractContinuumPurgeExecutor
+{
+ private String purgeType;
+
+ public CleanAllPurgeExecutor( String purgeType )
+ {
+ this.purgeType = purgeType;
+ }
+
+ public void purge( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ if ( purgeType.equals( ContinuumPurgeConstants.PURGE_REPOSITORY ) )
+ {
+ purgeRepository( path );
+ }
+ else if ( purgeType.equals( ContinuumPurgeConstants.PURGE_DIRECTORY_RELEASES ) )
+ {
+ purgeReleases( path );
+ }
+ else if ( purgeType.equals( ContinuumPurgeConstants.PURGE_DIRECTORY_BUILDOUTPUT ) )
+ {
+ purgeBuildOutput( path );
+ }
+ }
+
+ private void purgeRepository( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ try
+ {
+ FileUtils.cleanDirectory( path );
+ }
+ catch ( IOException e )
+ {
+ throw new ContinuumPurgeExecutorException( "Error while purging all artifacts or directories in " + path, e );
+ }
+ }
+
+ private void purgeReleases( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ File workingDir = new File( path );
+
+ FilenameFilter filter = new ArtifactFilenameFilter( "releases-" );
+
+ File[] releasesDir = workingDir.listFiles( filter );
+
+ try
+ {
+ for ( File releaseDir : releasesDir )
+ {
+ FileUtils.deleteDirectory( releaseDir );
+ }
+ }
+ catch ( IOException e )
+ {
+ throw new ContinuumPurgeExecutorException( "Error while purging all releases directories", e );
+ }
+ }
+
+ private void purgeBuildOutput( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ File buildOutputDir = new File( path );
+
+ FileFilter filter = DirectoryFileFilter.DIRECTORY;
+
+ File[] projectsDir = buildOutputDir.listFiles( filter );
+
+ try
+ {
+ for ( File projectDir : projectsDir )
+ {
+ FileUtils.cleanDirectory( projectDir );
+ }
+ }
+ catch ( IOException e )
+ {
+ throw new ContinuumPurgeExecutorException( "Error while purging all buildOutput directories", e );
+ }
+ }
+}
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,166 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Calendar;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.comparator.LastModifiedFileComparator;
+import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.continuum.purge.ContinuumPurgeConstants;
+import org.apache.maven.archiva.consumers.core.repository.ArtifactFilenameFilter;
+
+/**
+ * @author Maria Catherine Tan
+ */
+public class DaysOldDirectoryPurgeExecutor
+ extends AbstractContinuumPurgeExecutor
+ implements ContinuumPurgeExecutor
+{
+ private int daysOlder;
+
+ private int retentionCount;
+
+ private String directoryType;
+
+ public DaysOldDirectoryPurgeExecutor( int daysOlder, int retentionCount, String directoryType )
+ {
+ this.daysOlder = daysOlder;
+
+ this.retentionCount = retentionCount;
+
+ this.directoryType = directoryType;
+ }
+
+ public void purge( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ if ( directoryType.equals( ContinuumPurgeConstants.PURGE_DIRECTORY_RELEASES ) )
+ {
+ purgeReleaseDirectory( path );
+ }
+ else if ( directoryType.equals( ContinuumPurgeConstants.PURGE_DIRECTORY_BUILDOUTPUT ) )
+ {
+ purgeBuildOutputDirectory( path );
+ }
+ }
+
+ private void purgeReleaseDirectory( String path )
+ {
+ File releaseDir = new File( path );
+
+ FilenameFilter filter = new ArtifactFilenameFilter( "releases-" );
+
+ File[] releasesDir = releaseDir.listFiles( filter );
+
+ if ( retentionCount > releasesDir.length )
+ {
+ return;
+ }
+
+ Arrays.sort( releasesDir, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR );
+
+ Calendar olderThanThisDate = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );
+ olderThanThisDate.add( Calendar.DATE, -daysOlder );
+
+ int countToPurge = releasesDir.length - retentionCount;
+
+ for ( File dir : releasesDir )
+ {
+ if ( countToPurge <= 0 )
+ {
+ break;
+ }
+
+ if ( dir.lastModified() < olderThanThisDate.getTimeInMillis() )
+ {
+ try
+ {
+ FileUtils.deleteDirectory( dir );
+ countToPurge--;
+ }
+ catch ( IOException e )
+ {
+ //throw new ContinuumPurgeExecutorException( "Error while purging release directories", e );
+ }
+ }
+ }
+ }
+
+ private void purgeBuildOutputDirectory( String path )
+ {
+ File buildOutputDir = new File( path );
+
+ FileFilter filter = DirectoryFileFilter.DIRECTORY;
+
+ File[] projectsDir = buildOutputDir.listFiles( filter );
+
+ for ( File projectDir : projectsDir )
+ {
+ File[] buildsDir = projectDir.listFiles( filter );
+
+ if ( retentionCount > buildsDir.length )
+ {
+ continue;
+ }
+
+ int countToPurge = buildsDir.length - retentionCount;
+
+ Calendar olderThanThisDate = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );
+ olderThanThisDate.add( Calendar.DATE, -daysOlder );
+
+ Arrays.sort( buildsDir, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR );
+
+ for ( File buildDir : buildsDir )
+ {
+ if ( countToPurge <= 0 )
+ {
+ break;
+ }
+
+ if ( buildDir.lastModified() < olderThanThisDate.getTimeInMillis() )
+ {
+ try
+ {
+ FileUtils.deleteDirectory( buildDir );
+ File logFile = new File ( buildDir.getAbsoluteFile() + ".log.txt" );
+
+ if ( logFile.exists() )
+ {
+ logFile.delete();
+ }
+
+ countToPurge--;
+ }
+ catch ( IOException e )
+ {
+ // swallow?
+ }
+ }
+ }
+ }
+ }
+}
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldRepositoryPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldRepositoryPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldRepositoryPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldRepositoryPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,200 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+
+import org.apache.commons.lang.time.DateUtils;
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.apache.maven.archiva.common.utils.VersionComparator;
+import org.apache.maven.archiva.common.utils.VersionUtil;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.ContentNotFoundException;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+
+/**
+ * Codes were taken from Archiva's DaysOldRepositoryPurge and made some few changes.
+ *
+ * @author Maria Catherine Tan
+ */
+public class DaysOldRepositoryPurgeExecutor
+ extends AbstractContinuumPurgeExecutor
+ implements ContinuumPurgeExecutor
+{
+ private int daysOlder;
+
+ private int retentionCount;
+
+ private RepositoryManagedContent repository;
+
+ private SimpleDateFormat timestampParser;
+
+ public DaysOldRepositoryPurgeExecutor( RepositoryManagedContent repository, int daysOlder, int retentionCount )
+ {
+ this.repository = repository;
+ this.daysOlder = daysOlder;
+ this.retentionCount = retentionCount;
+ timestampParser = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
+ timestampParser.setTimeZone( DateUtils.UTC_TIME_ZONE );
+ }
+
+ public void purge( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ try
+ {
+ File artifactFile = new File( repository.getRepoRoot(), path );
+
+ if ( !artifactFile.exists() )
+ {
+ return;
+ }
+
+ ArtifactReference artifact = repository.toArtifactReference( path );
+
+ Calendar olderThanThisDate = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );
+ olderThanThisDate.add( Calendar.DATE, -daysOlder );
+
+ // respect retention count
+ VersionedReference reference = new VersionedReference();
+ reference.setGroupId( artifact.getGroupId() );
+ reference.setArtifactId( artifact.getArtifactId() );
+ reference.setVersion( artifact.getVersion() );
+
+ List<String> versions = new ArrayList<String>( repository.getVersions( reference ) );
+
+ Collections.sort( versions, VersionComparator.getInstance() );
+
+ if ( retentionCount > versions.size() )
+ {
+ // Done. nothing to do here. skip it.
+ return;
+ }
+
+ int countToPurge = versions.size() - retentionCount;
+
+ for ( String version : versions )
+ {
+ if ( countToPurge <= 0 )
+ {
+ break;
+ }
+
+ ArtifactReference newArtifactReference =
+ repository.toArtifactReference( artifactFile.getAbsolutePath() );
+ newArtifactReference.setVersion( version );
+
+ File newArtifactFile = repository.toFile( newArtifactReference );
+
+ // Is this a generic snapshot "1.0-SNAPSHOT" ?
+ if ( VersionUtil.isGenericSnapshot( newArtifactReference.getVersion() ) )
+ {
+ if ( newArtifactFile.lastModified() < olderThanThisDate.getTimeInMillis() )
+ {
+ doPurgeAllRelated( newArtifactReference );
+ countToPurge--;
+ }
+ }
+ // Is this a timestamp snapshot "1.0-20070822.123456-42" ?
+ else if ( VersionUtil.isUniqueSnapshot( newArtifactReference.getVersion() ) )
+ {
+ Calendar timestampCal = uniqueSnapshotToCalendar( newArtifactReference.getVersion() );
+
+ if ( timestampCal.getTimeInMillis() < olderThanThisDate.getTimeInMillis() )
+ {
+ doPurgeAllRelated( newArtifactReference );
+ countToPurge--;
+ }
+ else if ( newArtifactFile.lastModified() < olderThanThisDate.getTimeInMillis() )
+ {
+ doPurgeAllRelated( newArtifactReference );
+ countToPurge--;
+ }
+ }
+ }
+ }
+ catch ( LayoutException e )
+ {
+ throw new ContinuumPurgeExecutorException( e.getMessage() + ": " + path, e );
+ }
+ catch ( ContentNotFoundException e )
+ {
+ throw new ContinuumPurgeExecutorException( e.getMessage(), e );
+ }
+ }
+
+ private Calendar uniqueSnapshotToCalendar( String version )
+ {
+ // The latestVersion will contain the full version string "1.0-alpha-5-20070821.213044-8"
+ // This needs to be broken down into ${base}-${timestamp}-${build_number}
+
+ Matcher m = VersionUtil.UNIQUE_SNAPSHOT_PATTERN.matcher( version );
+ if ( m.matches() )
+ {
+ Matcher mtimestamp = VersionUtil.TIMESTAMP_PATTERN.matcher( m.group( 2 ) );
+ if ( mtimestamp.matches() )
+ {
+ String tsDate = mtimestamp.group( 1 );
+ String tsTime = mtimestamp.group( 2 );
+
+ Date versionDate;
+ try
+ {
+ versionDate = timestampParser.parse( tsDate + "." + tsTime );
+ Calendar cal = Calendar.getInstance( DateUtils.UTC_TIME_ZONE );
+ cal.setTime( versionDate );
+
+ return cal;
+ }
+ catch ( ParseException e )
+ {
+ // Invalid Date/Time
+ return null;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void doPurgeAllRelated( ArtifactReference reference )
+ throws LayoutException
+ {
+ try
+ {
+ Set<ArtifactReference> related = repository.getRelatedArtifacts( reference );
+ purge( related, repository );
+ }
+ catch ( ContentNotFoundException e )
+ {
+ // Nothing to do here.
+ // TODO: Log this?
+ }
+ }
+}
\ No newline at end of file
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldRepositoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldRepositoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,134 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.apache.maven.archiva.common.utils.VersionComparator;
+import org.apache.maven.archiva.common.utils.VersionUtil;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.model.ProjectReference;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.ContentNotFoundException;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+
+/**
+ * Codes were taken from Archiva's CleanupReleasedSnapshotsRepositoryPurge and just made some few changes
+ *
+ * @author Maria Catherine Tan
+ */
+public class ReleasedSnapshotsRepositoryPurgeExecutor
+ extends AbstractContinuumPurgeExecutor
+{
+ private RepositoryManagedContent repository;
+
+ public ReleasedSnapshotsRepositoryPurgeExecutor( RepositoryManagedContent repository )
+ {
+ this.repository = repository;
+ }
+
+ public void purge( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ try
+ {
+ File artifactFile = new File( repository.getRepoRoot(), path );
+
+ if ( !artifactFile.exists() )
+ {
+ // Nothing to do here, file doesn't exist, skip it.
+ return;
+ }
+
+ ArtifactReference artifact = repository.toArtifactReference( path );
+
+ if ( !VersionUtil.isSnapshot( artifact.getVersion() ) )
+ {
+ // Nothing to do here, not a snapshot, skip it.
+ return;
+ }
+
+ ProjectReference reference = new ProjectReference();
+ reference.setGroupId( artifact.getGroupId() );
+ reference.setArtifactId( artifact.getArtifactId() );
+
+ // Gather up all of the versions.
+ List<String> allVersions = new ArrayList<String>( repository.getVersions( reference ) );
+
+ // Split the versions into released and snapshots.
+ List<String> releasedVersions = new ArrayList<String>();
+ List<String> snapshotVersions = new ArrayList<String>();
+
+ for ( String version : allVersions )
+ {
+ if ( VersionUtil.isSnapshot( version ) )
+ {
+ snapshotVersions.add( version );
+ }
+ else
+ {
+ releasedVersions.add( version );
+ }
+ }
+
+ Collections.sort( allVersions, VersionComparator.getInstance() );
+ Collections.sort( releasedVersions, VersionComparator.getInstance() );
+ Collections.sort( snapshotVersions, VersionComparator.getInstance() );
+
+ VersionedReference versionRef = new VersionedReference();
+ versionRef.setGroupId( artifact.getGroupId() );
+ versionRef.setArtifactId( artifact.getArtifactId() );
+
+ for ( String version : snapshotVersions )
+ {
+ if( releasedVersions.contains( VersionUtil.getReleaseVersion( version ) ) )
+ {
+ versionRef.setVersion( version );
+ repository.deleteVersion( versionRef );
+
+ removeMetadata( versionRef );
+ }
+ }
+ }
+ catch ( LayoutException e )
+ {
+ throw new ContinuumPurgeExecutorException( e.getMessage(), e );
+ }
+ catch ( ContentNotFoundException e )
+ {
+ throw new ContinuumPurgeExecutorException( e.getMessage(), e );
+ }
+ }
+
+ private void removeMetadata( VersionedReference versionRef )
+ throws ContinuumPurgeExecutorException
+ {
+ String path = repository.toMetadataPath( versionRef );
+ File projectPath = new File( repository.getRepoRoot(), path );
+
+ File projectDir = projectPath.getParentFile();
+
+ purgeSupportFiles( projectDir, "maven-metadata" );
+ }
+}
\ No newline at end of file
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,146 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.io.FileFilter;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.comparator.LastModifiedFileComparator;
+import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.apache.continuum.purge.ContinuumPurgeConstants;
+import org.apache.maven.archiva.consumers.core.repository.ArtifactFilenameFilter;
+
+/**
+ * @author Maria Catherine Tan
+ */
+public class RetentionCountDirectoryPurgeExecutor
+ extends AbstractContinuumPurgeExecutor
+ implements ContinuumPurgeExecutor
+{
+ private int retentionCount;
+
+ private String directoryType;
+
+ public RetentionCountDirectoryPurgeExecutor( int retentionCount, String directoryType )
+ {
+ this.retentionCount = retentionCount;
+
+ this.directoryType = directoryType;
+ }
+
+ public void purge( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ if ( directoryType.equals( ContinuumPurgeConstants.PURGE_DIRECTORY_RELEASES ) )
+ {
+ purgeReleaseDirectory( path );
+ }
+ else if ( directoryType.equals( ContinuumPurgeConstants.PURGE_DIRECTORY_BUILDOUTPUT ) )
+ {
+ purgeBuildOutputDirectory( path );
+ }
+ }
+
+ private void purgeReleaseDirectory( String path )
+ {
+ File releaseDir = new File( path );
+
+ FilenameFilter filter = new ArtifactFilenameFilter( "releases-" );
+
+ File[] files = releaseDir.listFiles( filter );
+
+ if ( retentionCount > files.length )
+ {
+ return;
+ }
+
+ Arrays.sort( files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR );
+
+ int countToPurge = files.length - retentionCount;
+
+ for ( File file : files )
+ {
+ if ( countToPurge-- <= 0 )
+ {
+ break;
+ }
+
+ try
+ {
+ FileUtils.deleteDirectory( file );
+ countToPurge--;
+ }
+ catch ( IOException e )
+ {
+ //throw new ContinuumPurgeExecutorException( "Error while purging release directories", e );
+ }
+ }
+ }
+
+ private void purgeBuildOutputDirectory( String path )
+ {
+ File buildOutputDir = new File( path );
+
+ FileFilter filter = DirectoryFileFilter.DIRECTORY;
+
+ File[] projectsDir = buildOutputDir.listFiles( filter );
+
+ for ( File projectDir : projectsDir )
+ {
+ File[] buildsDir = projectDir.listFiles( filter );
+
+ if ( retentionCount > buildsDir.length )
+ {
+ continue;
+ }
+
+ Arrays.sort( buildsDir, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR );
+
+ int countToPurge = buildsDir.length - retentionCount;
+
+ for ( File buildDir : buildsDir )
+ {
+ if ( countToPurge-- <= 0 )
+ {
+ break;
+ }
+
+ try
+ {
+ FileUtils.deleteDirectory( buildDir );
+ File logFile = new File ( buildDir.getAbsoluteFile() + ".log.txt" );
+
+ if ( logFile.exists() )
+ {
+ logFile.delete();
+ }
+ }
+ catch ( IOException e )
+ {
+ //swallow?
+ }
+ }
+ }
+ }
+}
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id
Added: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountRepositoryPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountRepositoryPurgeExecutor.java?rev=679588&view=auto
==============================================================================
--- continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountRepositoryPurgeExecutor.java (added)
+++ continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountRepositoryPurgeExecutor.java Thu Jul 24 15:31:19 2008
@@ -0,0 +1,131 @@
+package org.apache.continuum.purge.executor;
+
+/*
+ * 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 java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.apache.maven.archiva.common.utils.VersionComparator;
+import org.apache.maven.archiva.common.utils.VersionUtil;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.ContentNotFoundException;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+
+/**
+ * Codes were taken from Archiva's RetentionCountRepository Purge and made some few changes.
+ *
+ * @author Maria Catherine Tan
+ */
+public class RetentionCountRepositoryPurgeExecutor
+ extends AbstractContinuumPurgeExecutor
+ implements ContinuumPurgeExecutor
+{
+ private int retentionCount;
+
+ private RepositoryManagedContent repository;
+
+ public RetentionCountRepositoryPurgeExecutor( RepositoryManagedContent repository, int retentionCount )
+ {
+ this.repository = repository;
+ this.retentionCount = retentionCount;
+ }
+
+ public void purge( String path )
+ throws ContinuumPurgeExecutorException
+ {
+ try
+ {
+ File artifactFile = new File( repository.getRepoRoot(), path );
+
+ if ( !artifactFile.exists() )
+ {
+ return;
+ }
+
+ ArtifactReference artifact = repository.toArtifactReference( path );
+
+ if ( VersionUtil.isSnapshot( artifact.getVersion() ) )
+ {
+ VersionedReference reference = new VersionedReference();
+ reference.setGroupId( artifact.getGroupId() );
+ reference.setArtifactId( artifact.getArtifactId() );
+ reference.setVersion( artifact.getVersion() );
+
+ List<String> versions = new ArrayList<String>( repository.getVersions( reference ) );
+
+ Collections.sort( versions, VersionComparator.getInstance() );
+
+ if ( retentionCount > versions.size() )
+ {
+ // Done. nothing to do here. skip it.
+ return;
+ }
+
+ int countToPurge = versions.size() - retentionCount;
+
+ for ( String version : versions )
+ {
+ if ( countToPurge-- <= 0 )
+ {
+ break;
+ }
+
+ doPurgeAllRelated( artifact, version );
+ }
+ }
+ }
+ catch ( LayoutException e )
+ {
+ throw new ContinuumPurgeExecutorException( e.getMessage(), e );
+ }
+ catch ( ContentNotFoundException e )
+ {
+ // Nothing to do here.
+ // TODO: Log this condition?
+ }
+ }
+
+ private void doPurgeAllRelated( ArtifactReference reference, String version )
+ throws LayoutException
+ {
+ ArtifactReference artifact = new ArtifactReference();
+ artifact.setGroupId( reference.getGroupId() );
+ artifact.setArtifactId( reference.getArtifactId() );
+ artifact.setVersion( version );
+ artifact.setClassifier( reference.getClassifier() );
+ artifact.setType( reference.getType() );
+
+ try
+ {
+ Set<ArtifactReference> related = repository.getRelatedArtifacts( artifact );
+ purge( related, repository );
+ }
+ catch ( ContentNotFoundException e )
+ {
+ // Nothing to do here.
+ // TODO: Log this?
+ }
+ }
+}
\ No newline at end of file
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountRepositoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: continuum/branches/CONTINUUM-782/continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountRepositoryPurgeExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Revision Id