From a2ddbd1d294a30547526aafa89fa8cd00e4e8495 Mon Sep 17 00:00:00 2001
From: ribeaudc <ribeaudc>
Date: Thu, 15 May 2008 18:23:14 +0000
Subject: [PATCH] [DMV-12] change: - 'HighwaterMarkWatcher' should take its
 path from destination file store.

SVN: 6081
---
 .../datamover/filesystem/intf/FileStore.java  | 13 ++++++++-----
 .../datamover/filesystem/intf/IFileStore.java | 11 +++++++----
 .../filesystem/remote/RemotePathMover.java    | 17 +++++++++--------
 .../filesystem/store/FileStoreLocal.java      | 17 +++++++++++++----
 .../filesystem/store/FileStoreRemote.java     | 19 ++++++++++++-------
 5 files changed, 49 insertions(+), 28 deletions(-)

diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java
index ccc2ea76ec3..965eb8b69aa 100644
--- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java
+++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/FileStore.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.highwatermark.FileWithHighwaterMark;
 import ch.systemsx.cisd.common.highwatermark.HighwaterMarkSelfTestable;
+import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher;
 import ch.systemsx.cisd.common.utilities.StoreItem;
 import ch.systemsx.cisd.datamover.filesystem.remote.RemotePathMover;
 
@@ -49,12 +50,12 @@ public abstract class FileStore implements IFileStore
 
     protected final IFileSysOperationsFactory factory;
 
-    protected FileStore(final FileWithHighwaterMark path, final String hostOrNull,
+    protected FileStore(final FileWithHighwaterMark fileWithHighwaterMark, final String hostOrNull,
             final boolean remote, final String kind, final IFileSysOperationsFactory factory)
     {
-        assert path != null;
+        assert fileWithHighwaterMark != null;
         assert kind != null;
-        this.fileWithHighwaterMark = path;
+        this.fileWithHighwaterMark = fileWithHighwaterMark;
         this.kind = kind;
         this.hostOrNull = hostOrNull;
         this.remote = remote;
@@ -79,7 +80,8 @@ public abstract class FileStore implements IFileStore
 
     public final StoreItemLocation getStoreItemLocation(StoreItem item)
     {
-        return new StoreItemLocation(hostOrNull, StoreItem.asFile(getPath(), item).getAbsolutePath());
+        return new StoreItemLocation(hostOrNull, StoreItem.asFile(getPath(), item)
+                .getAbsolutePath());
     }
 
     protected final File getPath()
@@ -172,7 +174,8 @@ public abstract class FileStore implements IFileStore
         {
             throw new ConfigurationFailureException(errorMessage);
         }
-        new HighwaterMarkSelfTestable(fileWithHighwaterMark.getFile(), getHighwaterMarkWatcher())
+        final HighwaterMarkWatcher highwaterMarkWatcher = getHighwaterMarkWatcher();
+        new HighwaterMarkSelfTestable(fileWithHighwaterMark.getFile(), highwaterMarkWatcher)
                 .check();
     }
 
diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java
index 0546ae8a954..8b60e1e1ea0 100644
--- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java
+++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/intf/IFileStore.java
@@ -41,15 +41,15 @@ public interface IFileStore extends ISelfTestable
      * share and mounted via NFS or CIFS.
      */
     public boolean isRemote();
-    
+
     /**
      * Returns the location of the specified store item.
      */
     public StoreItemLocation getStoreItemLocation(StoreItem item);
 
     /**
-     * Returns <code>true</code> if this file store is the parent directory of
-     * the specified file store.
+     * Returns <code>true</code> if this file store is the parent directory of the specified file
+     * store.
      */
     public boolean isParentDirectory(IFileStore child);
 
@@ -120,12 +120,15 @@ public interface IFileStore extends ISelfTestable
     /**
      * Returns this file store as an extended file store if possible.
      * 
-     *  @return <code>null</code> if this file store can not be returned as an extended file store.
+     * @return <code>null</code> if this file store can not be returned as an extended file store.
      */
     public IExtendedFileStore tryAsExtended();
 
     /**
      * Returns the <code>HighwaterMarkWatcher</code> for this implementation.
+     * <p>
+     * Note that we expect the path to be set in the returned <code>HighwaterMarkWatcher</code>.
+     * </p>
      */
     public HighwaterMarkWatcher getHighwaterMarkWatcher();
 }
\ No newline at end of file
diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java
index fd878162771..c3ad6090e19 100644
--- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java
+++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/remote/RemotePathMover.java
@@ -22,6 +22,7 @@ import org.apache.log4j.Logger;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.exceptions.StatusFlag;
+import ch.systemsx.cisd.common.highwatermark.HighwaterMarkWatcher;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.IStoreHandler;
@@ -291,9 +292,13 @@ public final class RemotePathMover implements IStoreHandler
     // IStoreHandler
     //
 
-    public final boolean mayHandle(StoreItem item)
+    public final boolean mayHandle(final StoreItem item)
     {
-        return true;
+        final HighwaterMarkWatcher highwaterMarkWatcher =
+                destinationDirectory.getHighwaterMarkWatcher();
+        assert highwaterMarkWatcher.getPath() != null : "Remote path not set";
+        highwaterMarkWatcher.run();
+        return highwaterMarkWatcher.isBelow() == false;
     }
 
     public final void handle(final StoreItem item)
@@ -304,11 +309,8 @@ public final class RemotePathMover implements IStoreHandler
             // finish the job.
             if (operationLog.isInfoEnabled())
             {
-                operationLog
-                        .info(String
-                                .format(
-                                        "Detected recovery situation: '%s' has been interrupted in deletion phase, finishing up.",
-                                        getSrcPath(item)));
+                operationLog.info(String.format("Detected recovery situation: '%s' has been "
+                        + "interrupted in deletion phase, finishing up.", getSrcPath(item)));
             }
             removeAndMark(item);
             return;
@@ -371,7 +373,6 @@ public final class RemotePathMover implements IStoreHandler
                 // here.
             }
         } while (true);
-
         notificationLog.error(String.format(MOVING_PATH_TO_REMOTE_FAILED_TEMPLATE,
                 getSrcPath(item), destinationDirectory));
     }
diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java
index a4cc889c499..aadfe1d2372 100644
--- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java
+++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreLocal.java
@@ -54,13 +54,22 @@ public class FileStoreLocal extends FileStore implements IExtendedFileStore
 
     private final HighwaterMarkWatcher highwaterMarkWatcher;
 
-    public FileStoreLocal(final FileWithHighwaterMark file, final String desription,
-            final IFileSysOperationsFactory factory)
+    public FileStoreLocal(final FileWithHighwaterMark highwaterMarkWatcher,
+            final String desription, final IFileSysOperationsFactory factory)
     {
-        super(file, null, false, desription, factory);
+        super(highwaterMarkWatcher, null, false, desription, factory);
         this.remover = factory.getRemover();
         this.mover = factory.getMover();
-        this.highwaterMarkWatcher = new HighwaterMarkWatcher(file.getHighwaterMark());
+        this.highwaterMarkWatcher = createHighwaterMarkWatcher(highwaterMarkWatcher);
+    }
+
+    private final static HighwaterMarkWatcher createHighwaterMarkWatcher(
+            final FileWithHighwaterMark fileWithHighwaterMark)
+    {
+        final HighwaterMarkWatcher highwaterMarkWatcher =
+                new HighwaterMarkWatcher(fileWithHighwaterMark.getHighwaterMark());
+        highwaterMarkWatcher.setPath(fileWithHighwaterMark.getFile());
+        return highwaterMarkWatcher;
     }
 
     public final Status delete(final StoreItem item)
diff --git a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java
index 84781c0800d..2789c72fbd1 100644
--- a/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java
+++ b/datamover/source/java/ch/systemsx/cisd/datamover/filesystem/store/FileStoreRemote.java
@@ -48,16 +48,17 @@ public class FileStoreRemote extends FileStore
 
     private final HighwaterMarkWatcher highwaterMarkWatcher;
 
-    public FileStoreRemote(final FileWithHighwaterMark path, final String host, final String kind,
-            final IFileSysOperationsFactory factory)
+    public FileStoreRemote(final FileWithHighwaterMark fileWithHighwaterMark, final String host,
+            final String kind, final IFileSysOperationsFactory factory)
     {
-        super(path, host, true, kind, factory);
+        super(fileWithHighwaterMark, host, true, kind, factory);
         assert host != null : "Unspecified host";
-        highwaterMarkWatcher = createHighwaterMarkWatcher(path.getHighwaterMark(), host);
+        highwaterMarkWatcher = createHighwaterMarkWatcher(fileWithHighwaterMark, host, factory);
     }
 
-    private final HighwaterMarkWatcher createHighwaterMarkWatcher(final long highwaterMark,
-            final String host)
+    private final static HighwaterMarkWatcher createHighwaterMarkWatcher(
+            final FileWithHighwaterMark fileWithHighwaterMark, final String host,
+            final IFileSysOperationsFactory factory)
     {
         final File sshExecutable = factory.tryFindSshExecutable();
         final IFreeSpaceProvider freeSpaceProvider;
@@ -70,7 +71,11 @@ public class FileStoreRemote extends FileStore
                     + "('ssh' executable not found).");
             freeSpaceProvider = AlwaysAboveFreeSpaceProvider.INSTANCE;
         }
-        return new HighwaterMarkWatcher(highwaterMark, freeSpaceProvider);
+        final HighwaterMarkWatcher highwaterMarkWatcher =
+                new HighwaterMarkWatcher(fileWithHighwaterMark.getHighwaterMark(),
+                        freeSpaceProvider);
+        highwaterMarkWatcher.setPath(fileWithHighwaterMark.getFile());
+        return highwaterMarkWatcher;
     }
 
     //
-- 
GitLab