diff artifact-database/src/main/java/de/intevation/artifactdatabase/DatabaseCleaner.java @ 230:fbd57d2eeaef

Changed semantics of locked artifact ids. artifacts/trunk@1634 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 31 Mar 2011 14:48:28 +0000
parents b2115f484edb
children 1ea35226a6de
line wrap: on
line diff
--- a/artifact-database/src/main/java/de/intevation/artifactdatabase/DatabaseCleaner.java	Thu Mar 31 08:58:42 2011 +0000
+++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/DatabaseCleaner.java	Thu Mar 31 14:48:28 2011 +0000
@@ -19,6 +19,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.Collections;
 
 import javax.sql.DataSource;
 
@@ -57,6 +59,10 @@
 
     } // interface ArtifactReviver
 
+    public interface LockedIdsProvider {
+        Set<Integer> getLockedIds();
+    } // interface LockedIdsProvider
+
     private static Logger logger = Logger.getLogger(DatabaseCleaner.class);
 
     /**
@@ -66,6 +72,8 @@
      */
     public static final int MAX_ROWS = 50;
 
+    public static final Set<Integer> EMPTY_IDS = Collections.emptySet();
+
     /**
      * The SQL statement to select the outdated artifacts.
      */
@@ -110,7 +118,7 @@
      * A specialized Id filter which only delete some artifacts.
      * This is used to prevent deletion of living artifacts.
      */
-    protected Id.Filter filter;
+    protected LockedIdsProvider lockedIdsProvider;
 
     /**
      * The reviver used to bring the dead artifact on last
@@ -144,8 +152,8 @@
      * would create severe internal problems.
      * @param filter
      */
-    public void setFilter(Id.Filter filter) {
-        this.filter = filter;
+    public void setLockedIdsProvider(LockedIdsProvider lockedIdsProvider) {
+        this.lockedIdsProvider = lockedIdsProvider;
     }
 
     /**
@@ -179,14 +187,14 @@
         return SLEEP_DEFAULT;
     }
 
-    private static final class IdData
-    extends                    Id
-    {
+    private static final class IdData {
+
+        int     id;
         byte [] data;
         String  factoryName;
 
         public IdData(int id, String factoryName, byte [] data) {
-            super(id);
+            this.id          = id;
             this.factoryName = factoryName;
             this.data        = data;
         }
@@ -224,15 +232,22 @@
             fetchIds.setMaxRows(MAX_ROWS);
 
             for (;;) {
-                List ids = new ArrayList();
+                List<IdData> ids = new ArrayList<IdData>();
+
+                Set<Integer> filter = lockedIdsProvider != null
+                    ? lockedIdsProvider.getLockedIds()
+                    : EMPTY_IDS;
 
                 result = fetchIds.executeQuery();
 
                 while (result.next()) {
-                    ids.add(new IdData(
-                        result.getInt(1),
-                        result.getString(2),
-                        result.getBytes(3)));
+                    int id = result.getInt(1);
+                    if (!filter.contains(id)) {
+                        ids.add(new IdData(
+                            id,
+                            result.getString(2),
+                            result.getBytes(3)));
+                    }
                 }
 
                 result.close(); result = null;
@@ -241,12 +256,8 @@
                     break;
                 }
 
-                if (filter != null) {
-                    ids = filter.filterIds(ids);
-                }
-
                 for (int i = ids.size()-1; i >= 0; --i) {
-                    IdData idData = (IdData)ids.get(i);
+                    IdData idData = ids.get(i);
                     Artifact artifact = reviver.reviveArtifact(
                         idData.factoryName, idData.data);
                     idData.data = null;

http://dive4elements.wald.intevation.org