From bd1bae52b9c8b71708dab08977b6a3a1632f228b Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Wed, 16 May 2012 14:08:47 +0000
Subject: [PATCH] SP-45, BIS-21 add to faulty paths handler possibility to say
 that some files should not go to the faulty paths

SVN: 25283
---
 .../filesystem/DirectoryScannedStore.java     | 12 ++++++++---
 .../DirectoryScanningTimerTask.java           | 10 ++++++++-
 .../FaultyPathDirectoryScanningHandler.java   | 21 ++++++++++++++++++-
 3 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScannedStore.java b/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScannedStore.java
index 099df325dd0..20fb2df3757 100644
--- a/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScannedStore.java
+++ b/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScannedStore.java
@@ -49,10 +49,16 @@ public final class DirectoryScannedStore implements IScannedStore
     //
     // IScannedStore
     //
-
+    
+    
     public final String getLocationDescription(final StoreItem item)
     {
-        return StoreItem.asFile(directory, item).getPath();
+        return asFile(item).getPath();
+    }
+
+    public final File asFile(final StoreItem item)
+    {
+        return StoreItem.asFile(directory, item);
     }
 
     public StoreItem asStoreItem(String locationDescription)
@@ -62,7 +68,7 @@ public final class DirectoryScannedStore implements IScannedStore
 
     public final boolean existsOrError(final StoreItem item)
     {
-        return StoreItem.asFile(directory, item).exists();
+        return asFile(item).exists();
     }
 
     public StoreItem[] tryListSorted(ISimpleLogger loggerOrNull)
diff --git a/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScanningTimerTask.java b/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScanningTimerTask.java
index bc69916863b..c5f6e72007c 100644
--- a/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScanningTimerTask.java
+++ b/common/source/java/ch/systemsx/cisd/common/filesystem/DirectoryScanningTimerTask.java
@@ -171,7 +171,7 @@ public final class DirectoryScanningTimerTask extends TimerTask implements ITime
             final IPathHandler pathHandler, final int ignoredErrorCount)
     {
         this(asScannedStore(sourceDirectory, fileFilter), new FaultyPathDirectoryScanningHandler(
-                sourceDirectory, pathHandler), PathHandlerAdapter.asScanningHandler(
+                sourceDirectory, pathHandler, null), PathHandlerAdapter.asScanningHandler(
                 sourceDirectory, pathHandler), ignoredErrorCount);
     }
 
@@ -449,6 +449,14 @@ public final class DirectoryScanningTimerTask extends TimerTask implements ITime
          */
         String getLocationDescription(StoreItem item);
 
+        /**
+         * Convert the store item to a file.
+         * 
+         * @throws UnsupportedOperationException Thrown if the store item cannot be represented as a
+         *             file object.
+         */
+        File asFile(StoreItem item) throws UnsupportedOperationException;
+
         /**
          * Constructs a {@link StoreItem} from a location description as created by
          * {@link #getLocationDescription(StoreItem)}.
diff --git a/common/source/java/ch/systemsx/cisd/common/filesystem/FaultyPathDirectoryScanningHandler.java b/common/source/java/ch/systemsx/cisd/common/filesystem/FaultyPathDirectoryScanningHandler.java
index 8f6a145b584..1469ff5e589 100644
--- a/common/source/java/ch/systemsx/cisd/common/filesystem/FaultyPathDirectoryScanningHandler.java
+++ b/common/source/java/ch/systemsx/cisd/common/filesystem/FaultyPathDirectoryScanningHandler.java
@@ -55,12 +55,24 @@ public final class FaultyPathDirectoryScanningHandler implements IDirectoryScann
 
     private IStopSignaler stopSignaler;
 
+    public static interface IFaultyPathDirectoryScanningHandlerDelegate
+    {
+        /**
+         * return true if the given path should NOT end in faulty paths
+         */
+        boolean shouldNotAddToFaultyPathsOrNull(File file);
+    }
+
+    private final IFaultyPathDirectoryScanningHandlerDelegate delegate;
+
     public FaultyPathDirectoryScanningHandler(final File faultyPathDirectory,
-            final IStopSignaler stopSignaler)
+            final IStopSignaler stopSignaler, IFaultyPathDirectoryScanningHandlerDelegate delegate)
     {
         this.faultyPaths = new HashSet<StoreItem>();
         this.faultyPathsFile = new File(faultyPathDirectory, Constants.FAULTY_PATH_FILENAME);
         this.stopSignaler = stopSignaler;
+
+        this.delegate = delegate;
     }
 
     private Set<String> faultyPathsAsStrings(IScannedStore scannedStore)
@@ -195,6 +207,13 @@ public final class FaultyPathDirectoryScanningHandler implements IDirectoryScann
 
     public final Status finishItemHandle(final IScannedStore scannedStore, final StoreItem storeItem)
     {
+        // if the external provided predicate says we should not add it to faulty paths, we won't
+        if (delegate != null
+                && delegate.shouldNotAddToFaultyPathsOrNull(scannedStore.asFile(storeItem)))
+        {
+            return Status.OK;
+        }
+
         // If the item still exists, we assume that it has not been handled. So it
         // should be added to the faulty paths.
         if (scannedStore.existsOrError(storeItem) && stopSignaler.isStopped() == false)
-- 
GitLab