diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/FileScannedStore.java b/datamover/source/java/ch/systemsx/cisd/datamover/FileScannedStore.java index 893f4dfa3cd551322a22c413ea4e560f6dac2491..ecde7ec5bc92ac5a827d264c5609e702531f4a47 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/FileScannedStore.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/FileScannedStore.java @@ -22,7 +22,7 @@ import ch.systemsx.cisd.common.logging.ISimpleLogger; import ch.systemsx.cisd.common.utilities.StoreItem; import ch.systemsx.cisd.common.utilities.DirectoryScanningTimerTask.IScannedStore; import ch.systemsx.cisd.datamover.filesystem.intf.IFileStore; -import ch.systemsx.cisd.datamover.utils.QuietPeriodFileFilter; +import ch.systemsx.cisd.datamover.utils.IStoreItemFilter; /** * An <code>IScannedStore</code> implementation which is based on {@link IFileStore}. @@ -33,12 +33,12 @@ final class FileScannedStore implements IScannedStore { private final IFileStore fileStore; - private final QuietPeriodFileFilter quietPeriodFileFilter; + private final IStoreItemFilter storeItemFilter; - FileScannedStore(final IFileStore fileStore, final QuietPeriodFileFilter quietPeriodFileFilter) + FileScannedStore(final IFileStore fileStore, final IStoreItemFilter storeItemFilter) { this.fileStore = fileStore; - this.quietPeriodFileFilter = quietPeriodFileFilter; + this.storeItemFilter = storeItemFilter; } private final StoreItem[] filterReadyToProcess(final StoreItem[] items) @@ -60,7 +60,7 @@ final class FileScannedStore implements IScannedStore { return false; } - return quietPeriodFileFilter.accept(item); + return storeItemFilter.accept(item); } // diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/IncomingProcessor.java b/datamover/source/java/ch/systemsx/cisd/datamover/IncomingProcessor.java index c7a9702296646eb80b8280f23049a8b86fec48cc..5917df952936dc668ec4eb50ff1cda0394dfcd05 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/IncomingProcessor.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/IncomingProcessor.java @@ -41,6 +41,7 @@ import ch.systemsx.cisd.datamover.filesystem.intf.IFileStore; import ch.systemsx.cisd.datamover.filesystem.intf.IFileSysOperationsFactory; import ch.systemsx.cisd.datamover.filesystem.intf.IPathMover; import ch.systemsx.cisd.datamover.filesystem.intf.IRecoverableTimerTaskFactory; +import ch.systemsx.cisd.datamover.utils.IStoreItemFilter; import ch.systemsx.cisd.datamover.utils.LocalBufferDirs; import ch.systemsx.cisd.datamover.utils.QuietPeriodFileFilter; @@ -72,7 +73,7 @@ public class IncomingProcessor implements IRecoverableTimerTaskFactory private final String prefixForIncoming; - private final QuietPeriodFileFilter quietPeriodFileFilter; + private final IStoreItemFilter storeItemFilter; public static final DataMoverProcess createMovingProcess(Parameters parameters, IFileSysOperationsFactory factory, LocalBufferDirs bufferDirs) @@ -99,7 +100,7 @@ public class IncomingProcessor implements IRecoverableTimerTaskFactory this.pathMover = factory.getMover(); this.factory = factory; this.bufferDirs = bufferDirs; - this.quietPeriodFileFilter = new QuietPeriodFileFilter(incomingStore, parameters, timeProvider); + this.storeItemFilter = new QuietPeriodFileFilter(incomingStore, parameters, timeProvider); } public TimerTask createRecoverableTimerTask() @@ -112,7 +113,7 @@ public class IncomingProcessor implements IRecoverableTimerTaskFactory final IStoreHandler pathHandler = createIncomingMovingPathHandler(); final DirectoryScanningTimerTask movingTask = new DirectoryScanningTimerTask(new FileScannedStore(incomingStore, - quietPeriodFileFilter), bufferDirs.getCopyInProgressDir(), pathHandler, + storeItemFilter), bufferDirs.getCopyInProgressDir(), pathHandler, NUMBER_OF_ERRORS_IN_LISTING_IGNORED); return new DataMoverProcess(movingTask, "Mover of Incoming Data", this); } diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/utils/IStoreItemFilter.java b/datamover/source/java/ch/systemsx/cisd/datamover/utils/IStoreItemFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..401daad321755fb2cdfe33caf2362f88d04e9670 --- /dev/null +++ b/datamover/source/java/ch/systemsx/cisd/datamover/utils/IStoreItemFilter.java @@ -0,0 +1,36 @@ +/* + * Copyright 2008 ETH Zuerich, CISD + * + * Licensed 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. + */ + +package ch.systemsx.cisd.datamover.utils; + +import ch.systemsx.cisd.common.utilities.StoreItem; + +/** + * Filter of {@link StoreItem} objects. Note, that a filter can be stateful. That is, invocations + * of {@link #accept(StoreItem)} with the same argument might return different values. + * + * @author Franz-Josef Elmer + */ +public interface IStoreItemFilter +{ + /** + * Accepts the specified item or not. + * + * @return <code>true</code> if the item is accepted (i.e. passes the filter). + */ + public boolean accept(StoreItem item); + +} \ No newline at end of file diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/utils/QuietPeriodFileFilter.java b/datamover/source/java/ch/systemsx/cisd/datamover/utils/QuietPeriodFileFilter.java index 9c75c42c35bbadbae3355ab7837746d9ea9294d0..c787e7fdb0adfa192c0da097665550a1d1acf336 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/utils/QuietPeriodFileFilter.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/utils/QuietPeriodFileFilter.java @@ -45,7 +45,7 @@ import ch.systemsx.cisd.datamover.intf.ITimingParameters; * * @author Bernd Rinn */ -public class QuietPeriodFileFilter +public class QuietPeriodFileFilter implements IStoreItemFilter { // @Private static final int CLEANUP_TO_QUIET_PERIOD_RATIO = 10; diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/utils/StoreItemFilterBank.java b/datamover/source/java/ch/systemsx/cisd/datamover/utils/StoreItemFilterBank.java new file mode 100644 index 0000000000000000000000000000000000000000..b5162ddc671ea97f8c08f260b4f07022429a5720 --- /dev/null +++ b/datamover/source/java/ch/systemsx/cisd/datamover/utils/StoreItemFilterBank.java @@ -0,0 +1,60 @@ +/* + * Copyright 2008 ETH Zuerich, CISD + * + * Licensed 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. + */ + +package ch.systemsx.cisd.datamover.utils; + +import java.util.ArrayList; +import java.util.List; + +import ch.systemsx.cisd.common.utilities.StoreItem; + +/** + * A filter bank of {@link IStoreItemFilter} instances. A {@link StoreItem} tries to passes the + * filters of the filter bank in the order the filters have been added (with + * {@link #add(IStoreItemFilter)}). If the item does not pass a filter (i.e. + * {@link IStoreItemFilter#accept(StoreItem)} return <code>false</code>) it does not pass the + * filter bank. Note, that in this case the other filter are not checked. + * + * @author Franz-Josef Elmer + */ +public class StoreItemFilterBank implements IStoreItemFilter +{ + private final List<IStoreItemFilter> filters = new ArrayList<IStoreItemFilter>(); + + /** + * Adds the specified filter. + */ + public void add(IStoreItemFilter filter) + { + filters.add(filter); + } + + /** + * Accepts the specified item if it accepted by all filters. + */ + public boolean accept(StoreItem item) + { + for (IStoreItemFilter filter : filters) + { + if (filter.accept(item) == false) + { + return false; + } + } + return true; + } + +}