You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ba...@apache.org on 2015/04/06 21:00:04 UTC

svn commit: r1671648 - in /continuum/trunk/continuum-purge: continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/ continuum-purge-core/src/main/java/org/apache/continuum/purge/repository/scanner/ continuum-purge-master/src/main/java/o...

Author: batkinson
Date: Mon Apr  6 19:00:03 2015
New Revision: 1671648

URL: http://svn.apache.org/r1671648
Log:
Moved executor factories into core and made them components.

Added:
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactory.java
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactoryImpl.java
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/MultiplexedPurgeExecutor.java
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactory.java
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactoryImpl.java
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/ScanningPurgeExecutor.java
Modified:
    continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/repository/scanner/DefaultRepositoryScanner.java
    continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java
    continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java

Added: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactory.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactory.java?rev=1671648&view=auto
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactory.java (added)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactory.java Mon Apr  6 19:00:03 2015
@@ -0,0 +1,25 @@
+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.
+ */
+
+public interface DirectoryPurgeExecutorFactory
+{
+    ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount, String dirType );
+}

Added: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactoryImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactoryImpl.java?rev=1671648&view=auto
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactoryImpl.java (added)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/DirectoryPurgeExecutorFactoryImpl.java Mon Apr  6 19:00:03 2015
@@ -0,0 +1,42 @@
+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 org.codehaus.plexus.component.annotations.Component;
+
+@Component( role = DirectoryPurgeExecutorFactory.class )
+public class DirectoryPurgeExecutorFactoryImpl
+    implements DirectoryPurgeExecutorFactory
+{
+    public ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount, String dirType )
+    {
+        if ( deleteAll )
+        {
+            return new CleanAllPurgeExecutor( dirType );
+        }
+
+        if ( daysOld > 0 )
+        {
+            return new DaysOldDirectoryPurgeExecutor( daysOld, retentionCount, dirType );
+        }
+
+        return new RetentionCountDirectoryPurgeExecutor( retentionCount, dirType );
+    }
+}

Added: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/MultiplexedPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/MultiplexedPurgeExecutor.java?rev=1671648&view=auto
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/MultiplexedPurgeExecutor.java (added)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/MultiplexedPurgeExecutor.java Mon Apr  6 19:00:03 2015
@@ -0,0 +1,43 @@
+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.util.Arrays;
+import java.util.List;
+
+public class MultiplexedPurgeExecutor
+    implements ContinuumPurgeExecutor
+{
+    private List<ContinuumPurgeExecutor> constituents;
+
+    public MultiplexedPurgeExecutor( ContinuumPurgeExecutor... executors )
+    {
+        constituents = Arrays.asList( executors );
+    }
+
+    public void purge( String path )
+        throws ContinuumPurgeExecutorException
+    {
+        for ( ContinuumPurgeExecutor child : constituents )
+        {
+            child.purge( path );
+        }
+    }
+}

Added: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactory.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactory.java?rev=1671648&view=auto
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactory.java (added)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactory.java Mon Apr  6 19:00:03 2015
@@ -0,0 +1,28 @@
+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 org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+
+public interface RepositoryPurgeExecutorFactory
+{
+    ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount, boolean deleteReleasedSnapshots,
+                                   RepositoryManagedContent repoContent );
+}

Added: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactoryImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactoryImpl.java?rev=1671648&view=auto
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactoryImpl.java (added)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/RepositoryPurgeExecutorFactoryImpl.java Mon Apr  6 19:00:03 2015
@@ -0,0 +1,61 @@
+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 org.apache.continuum.purge.ContinuumPurgeConstants;
+import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
+import org.apache.continuum.purge.repository.scanner.RepositoryScanner;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+
+@Component( role = RepositoryPurgeExecutorFactory.class )
+public class RepositoryPurgeExecutorFactoryImpl
+    implements RepositoryPurgeExecutorFactory
+{
+    @Requirement( hint = "purge" )
+    private RepositoryScanner scanner;
+
+    public ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount,
+                                          boolean deleteReleasedSnapshots, RepositoryManagedContent repoContent )
+    {
+        if ( deleteAll )
+        {
+            return new CleanAllPurgeExecutor( ContinuumPurgeConstants.PURGE_REPOSITORY );
+        }
+
+        ContinuumPurgeExecutor executor;
+        if ( daysOld > 0 )
+        {
+            executor = new DaysOldRepositoryPurgeExecutor( repoContent, daysOld, retentionCount );
+        }
+        else
+        {
+            executor = new RetentionCountRepositoryPurgeExecutor( repoContent, retentionCount );
+        }
+
+        if ( deleteReleasedSnapshots )
+        {
+            ContinuumPurgeExecutor snapshots = new ReleasedSnapshotsRepositoryPurgeExecutor( repoContent );
+            executor = new MultiplexedPurgeExecutor( snapshots, executor );
+        }
+
+        return new ScanningPurgeExecutor( scanner, executor );
+    }
+}

Added: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/ScanningPurgeExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/ScanningPurgeExecutor.java?rev=1671648&view=auto
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/ScanningPurgeExecutor.java (added)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/executor/ScanningPurgeExecutor.java Mon Apr  6 19:00:03 2015
@@ -0,0 +1,61 @@
+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 org.apache.continuum.purge.repository.scanner.RepositoryScanner;
+import org.apache.continuum.purge.repository.scanner.ScannerHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+
+public class ScanningPurgeExecutor
+    implements ContinuumPurgeExecutor, ScannerHandler
+{
+    private static final Logger log = LoggerFactory.getLogger( ScanningPurgeExecutor.class );
+
+    private RepositoryScanner scanner;
+
+    private ContinuumPurgeExecutor executor;
+
+    public ScanningPurgeExecutor( RepositoryScanner scanner, ContinuumPurgeExecutor executor )
+    {
+        this.scanner = scanner;
+        this.executor = executor;
+    }
+
+    public void purge( String path )
+        throws ContinuumPurgeExecutorException
+    {
+        scanner.scan( new File( path ), this );
+    }
+
+    public void handle( String path )
+    {
+        try
+        {
+            executor.purge( path );
+        }
+        catch ( ContinuumPurgeExecutorException e )
+        {
+            log.error( String.format( "handling failed %s: %s", path, e.getMessage() ), e );
+        }
+    }
+}

Modified: continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/repository/scanner/DefaultRepositoryScanner.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/repository/scanner/DefaultRepositoryScanner.java?rev=1671648&r1=1671647&r2=1671648&view=diff
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/repository/scanner/DefaultRepositoryScanner.java (original)
+++ continuum/trunk/continuum-purge/continuum-purge-core/src/main/java/org/apache/continuum/purge/repository/scanner/DefaultRepositoryScanner.java Mon Apr  6 19:00:03 2015
@@ -33,7 +33,7 @@ import java.util.List;
 /**
  * Codes were taken from Archiva and made some changes.
  */
-@Component( role = org.apache.continuum.purge.repository.scanner.RepositoryScanner.class, hint = "repository-scanner" )
+@Component( role = RepositoryScanner.class, hint = "purge" )
 public class DefaultRepositoryScanner
     implements RepositoryScanner
 {

Modified: continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java?rev=1671648&r1=1671647&r2=1671648&view=diff
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java (original)
+++ continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java Mon Apr  6 19:00:03 2015
@@ -21,12 +21,11 @@ package org.apache.continuum.purge.contr
 
 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.apache.continuum.purge.executor.DirectoryPurgeExecutorFactory;
 import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,7 +40,8 @@ public class DirectoryPurgeController
 {
     private static final Logger log = LoggerFactory.getLogger( DirectoryPurgeController.class );
 
-    private DirectoryPurgeExecutorFactory executorFactory = new DirectoryPurgeExecutorFactoryImpl();
+    @Requirement
+    private DirectoryPurgeExecutorFactory executorFactory;
 
     public void purge( AbstractPurgeConfiguration purgeConfig )
     {
@@ -63,26 +63,3 @@ public class DirectoryPurgeController
     }
 }
 
-interface DirectoryPurgeExecutorFactory
-{
-    ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount, String dirType );
-}
-
-class DirectoryPurgeExecutorFactoryImpl
-    implements DirectoryPurgeExecutorFactory
-{
-    public ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount, String dirType )
-    {
-        if ( deleteAll )
-        {
-            return new CleanAllPurgeExecutor( dirType );
-        }
-
-        if ( daysOld > 0 )
-        {
-            return new DaysOldDirectoryPurgeExecutor( daysOld, retentionCount, dirType );
-        }
-
-        return new RetentionCountDirectoryPurgeExecutor( retentionCount, dirType );
-    }
-}

Modified: continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java?rev=1671648&r1=1671647&r2=1671648&view=diff
==============================================================================
--- continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java (original)
+++ continuum/trunk/continuum-purge/continuum-purge-master/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java Mon Apr  6 19:00:03 2015
@@ -21,27 +21,17 @@ package org.apache.continuum.purge.contr
 
 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.executor.RepositoryPurgeExecutorFactory;
 import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
-import org.apache.continuum.purge.repository.scanner.RepositoryScanner;
-import org.apache.continuum.purge.repository.scanner.ScannerHandler;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.util.Arrays;
-import java.util.List;
-
 /**
  * DefaultPurgeController
  *
@@ -56,8 +46,8 @@ public class RepositoryPurgeController
     @Requirement
     private PurgeConfigurationService purgeConfigurationService;
 
-    @Requirement( hint = "repository-scanner" )
-    private RepositoryScanner scanner;
+    @Requirement
+    private RepositoryPurgeExecutorFactory executorFactory;
 
     public void purge( AbstractPurgeConfiguration purgeConfig )
     {
@@ -66,9 +56,10 @@ public class RepositoryPurgeController
         {
             String path = config.getRepository().getLocation();
             RepositoryManagedContent repositoryContent = getManagedContent( config.getRepository().getId() );
-            ContinuumPurgeExecutor executor = new RepositoryPurgeExecutorFactoryImpl( scanner )
-                .create( config.isDeleteAll(), config.getDaysOlder(), config.getRetentionCount(),
-                         config.isDeleteReleasedSnapshots(), repositoryContent );
+            ContinuumPurgeExecutor executor = executorFactory.create( config.isDeleteAll(), config.getDaysOlder(),
+                                                                      config.getRetentionCount(),
+                                                                      config.isDeleteReleasedSnapshots(),
+                                                                      repositoryContent );
             log.info( "purging repository '{}'", path );
             executor.purge( path );
             log.info( "purge complete '{}'", path );
@@ -93,100 +84,3 @@ public class RepositoryPurgeController
     }
 }
 
-interface RepositoryPurgeExecutorFactory
-{
-    ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount, boolean deleteReleasedSnapshots,
-                                   RepositoryManagedContent repoContent );
-}
-
-class MultiplexedPurgeExecutor
-    implements ContinuumPurgeExecutor
-{
-    List<ContinuumPurgeExecutor> constituents;
-
-    public MultiplexedPurgeExecutor( ContinuumPurgeExecutor... executors )
-    {
-        constituents = Arrays.asList( executors );
-    }
-
-    public void purge( String path )
-        throws ContinuumPurgeExecutorException
-    {
-        for ( ContinuumPurgeExecutor child : constituents )
-        {
-            child.purge( path );
-        }
-    }
-}
-
-class ScanningPurgeExecutor
-    implements ContinuumPurgeExecutor, ScannerHandler
-{
-    private static final Logger log = LoggerFactory.getLogger( ScanningPurgeExecutor.class );
-
-    RepositoryScanner scanner;
-
-    ContinuumPurgeExecutor executor;
-
-    public ScanningPurgeExecutor( RepositoryScanner scanner, ContinuumPurgeExecutor executor )
-    {
-        this.scanner = scanner;
-        this.executor = executor;
-    }
-
-    public void purge( String path )
-        throws ContinuumPurgeExecutorException
-    {
-        scanner.scan( new File( path ), this );
-    }
-
-    public void handle( String path )
-    {
-        try
-        {
-            executor.purge( path );
-        }
-        catch ( ContinuumPurgeExecutorException e )
-        {
-            log.error( String.format( "handling failed %s: %s", path, e.getMessage() ), e );
-        }
-    }
-}
-
-class RepositoryPurgeExecutorFactoryImpl
-    implements RepositoryPurgeExecutorFactory
-{
-    RepositoryScanner scanner;
-
-    public RepositoryPurgeExecutorFactoryImpl( RepositoryScanner scanner )
-    {
-        this.scanner = scanner;
-    }
-
-    public ContinuumPurgeExecutor create( boolean deleteAll, int daysOld, int retentionCount,
-                                          boolean deleteReleasedSnapshots, RepositoryManagedContent repoContent )
-    {
-        if ( deleteAll )
-        {
-            return new CleanAllPurgeExecutor( ContinuumPurgeConstants.PURGE_REPOSITORY );
-        }
-
-        ContinuumPurgeExecutor executor;
-        if ( daysOld > 0 )
-        {
-            executor = new DaysOldRepositoryPurgeExecutor( repoContent, daysOld, retentionCount );
-        }
-        else
-        {
-            executor = new RetentionCountRepositoryPurgeExecutor( repoContent, retentionCount );
-        }
-
-        if ( deleteReleasedSnapshots )
-        {
-            ContinuumPurgeExecutor snapshots = new ReleasedSnapshotsRepositoryPurgeExecutor( repoContent );
-            executor = new MultiplexedPurgeExecutor( snapshots, executor );
-        }
-
-        return new ScanningPurgeExecutor( scanner, executor );
-    }
-}
\ No newline at end of file