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 099df325dd0014ea97221656b25d86d1e69dfacd..20fb2df37572f5bfb02fda7ba5ead9788c6b1c95 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 bc69916863b578b1dc1ebd8b2496ae5457bda0a0..c5f6e72007cdc9e7c65ea8ba0da8befd95b610e2 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 8f6a145b584b056130e85ad7e44b484411ca5921..1469ff5e58940038bf88a48365e0a8e862296928 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)