diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/utils/DataCompletedFilter.java b/datamover/source/java/ch/systemsx/cisd/datamover/utils/DataCompletedFilter.java index e13f554746f45d9838ca6af7083b5c0b792310e7..dbb0935c5c781bdccdf291107b906cc8cd379d06 100644 --- a/datamover/source/java/ch/systemsx/cisd/datamover/utils/DataCompletedFilter.java +++ b/datamover/source/java/ch/systemsx/cisd/datamover/utils/DataCompletedFilter.java @@ -21,11 +21,14 @@ import java.util.List; import org.apache.log4j.Logger; +import ch.systemsx.cisd.common.logging.ConditionalNotificationLogger; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; +import ch.systemsx.cisd.common.logging.LogLevel; import ch.systemsx.cisd.common.process.ProcessExecutionHelper; import ch.systemsx.cisd.common.process.ProcessResult; import ch.systemsx.cisd.common.utilities.AbstractHashable; +import ch.systemsx.cisd.common.utilities.OSUtilities; import ch.systemsx.cisd.common.utilities.StoreItem; import ch.systemsx.cisd.datamover.filesystem.intf.IFileStore; import ch.systemsx.cisd.datamover.filesystem.intf.StoreItemLocation; @@ -115,6 +118,8 @@ public class DataCompletedFilter implements IStoreItemFilter private final long dataCompletedScriptTimeout; + private final ConditionalNotificationLogger notificationLogger; + private Status lastStatus = Status.NULL; /** @@ -128,6 +133,7 @@ public class DataCompletedFilter implements IStoreItemFilter throw new IllegalArgumentException("Data completed script not specified."); } this.dataCompletedScript = dataCompletedScript; + notificationLogger = new ConditionalNotificationLogger(getClass(), 0); this.dataCompletedScriptTimeout = dataCompletedScriptTimeout; if (fileStore == null) { @@ -136,7 +142,40 @@ public class DataCompletedFilter implements IStoreItemFilter this.fileStore = fileStore; } - public boolean accept(final StoreItem item) + private final List<String> createCommand(final StoreItem item) + { + final StoreItemLocation storeItemLocation = fileStore.getStoreItemLocation(item); + final List<String> command = new ArrayList<String>(); + command.add("sh"); + command.add(getDataCompletedScript()); + command.add(storeItemLocation.getAbsolutePath()); + final String host = storeItemLocation.getHost(); + if (host != null) + { + command.add(host); + } + return command; + } + + private final String getDataCompletedScript() + { + if (OSUtilities.executableExists(dataCompletedScript) == false) + { + notificationLogger.log(LogLevel.ERROR, String.format( + "Cannot find specified script '%s'.", dataCompletedScript)); + } else + { + notificationLogger.reset(String.format("Script '%s' is again accessible.", + dataCompletedScript)); + } + return dataCompletedScript; + } + + // + // IStoreItemFilter + // + + public final boolean accept(final StoreItem item) { final List<String> commandLine = createCommand(item); final ProcessResult result = @@ -165,19 +204,4 @@ public class DataCompletedFilter implements IStoreItemFilter return ok; } - private List<String> createCommand(final StoreItem item) - { - final StoreItemLocation storeItemLocation = fileStore.getStoreItemLocation(item); - final List<String> command = new ArrayList<String>(); - command.add("sh"); - command.add(dataCompletedScript); - command.add(storeItemLocation.getAbsolutePath()); - final String host = storeItemLocation.getHost(); - if (host != null) - { - command.add(host); - } - return command; - } - }