From 616093d6446c220f397399f5af60b94c4e991e2d Mon Sep 17 00:00:00 2001
From: gpawel <gpawel>
Date: Fri, 24 Jun 2011 14:06:53 +0000
Subject: [PATCH] [LMS-2342] upload client: more intelligent triggering of
 Validation, refresh button

SVN: 21842
---
 .../client/api/gui/DataSetMetadataPanel.java  | 94 ++++++++++++++++---
 .../api/gui/DataSetUploadClientModel.java     |  7 +-
 .../dss/client/api/gui/ValidatedFile.java     | 77 +++++++++++++++
 3 files changed, 163 insertions(+), 15 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ValidatedFile.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java
index 6f9d9d8f622..d0fefe37d8a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java
@@ -72,7 +72,7 @@ public class DataSetMetadataPanel extends JPanel implements Observer
             {
                 try
                 {
-                    if (validationQueue.take() != null)
+                    if (validationQueue.take())
                     {
                         // empty the queue
                         validationQueue.clear();
@@ -88,12 +88,56 @@ public class DataSetMetadataPanel extends JPanel implements Observer
         }
     }
 
+    private class ModificationDateChecker implements Runnable
+    {
+        private ValidatedFile file = null;
+
+        public void run()
+        {
+            while (true)
+            {
+                try
+                {
+                    if (isVisible() && validationRequired())
+                    {
+                        validationQueue.add(Boolean.TRUE);
+                    }
+                    Thread.sleep(1000l);
+                } catch (Throwable t)
+                {
+                    // ignore the error, thread cannot die
+                }
+            }
+        }
+
+        private synchronized boolean validationRequired()
+        {
+            if (file != null)
+            {
+                if (file.getFile().exists() && file.validationRequired())
+                {
+                    file.markValidation();
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public synchronized void observeFile(@SuppressWarnings("hiding") ValidatedFile file)
+        {
+            this.file = file;
+        }
+
+    }
+
     private static final String EMPTY_FILE_SELECTION = "";
 
     private static final long serialVersionUID = 1L;
 
     private final BlockingQueue<Boolean> validationQueue = new LinkedBlockingQueue<Boolean>();
 
+    private final ModificationDateChecker modificationDateChecker = new ModificationDateChecker();
+
     private final JFrame mainWindow;
 
     private final DataSetUploadClientModel clientModel;
@@ -114,6 +158,8 @@ public class DataSetMetadataPanel extends JPanel implements Observer
 
     private final JButton dataSetFileButton;
 
+    private final JButton dataSetFileRefreshButton;
+
     private final JRadioButton experimentButton;
 
     private final JRadioButton sampleButton;
@@ -130,6 +176,7 @@ public class DataSetMetadataPanel extends JPanel implements Observer
         super();
 
         new Thread(new AsynchronousValidator()).start();
+        new Thread(modificationDateChecker).start();
 
         setLayout(new GridBagLayout());
 
@@ -153,6 +200,7 @@ public class DataSetMetadataPanel extends JPanel implements Observer
             { EMPTY_FILE_SELECTION };
         dataSetFileComboBox = new JComboBox(initialOptions);
         dataSetFileButton = new JButton("Browse...");
+        dataSetFileRefreshButton = new JButton("Refresh");
         dataSetFileLabel = new JLabel("File:", JLabel.TRAILING);
 
         validationErrors = new ErrorsPanel(mainWindow);
@@ -262,9 +310,12 @@ public class DataSetMetadataPanel extends JPanel implements Observer
                         if (null == selectedItem || EMPTY_FILE_SELECTION == selectedItem)
                         {
                             newDataSetInfo.getNewDataSetBuilder().setFile(null);
+                            modificationDateChecker.observeFile(null);
                         } else
                         {
-                            newDataSetInfo.getNewDataSetBuilder().setFile((File) selectedItem);
+                            newDataSetInfo.getNewDataSetBuilder().setFile(
+                                    ((ValidatedFile) selectedItem).getFile());
+                            modificationDateChecker.observeFile((ValidatedFile) selectedItem);
                         }
 
                         validationQueue.add(Boolean.TRUE);
@@ -272,7 +323,7 @@ public class DataSetMetadataPanel extends JPanel implements Observer
                 }
 
             });
-        dataSetFileButton.setPreferredSize(new Dimension(40, BUTTON_HEIGHT));
+        dataSetFileButton.setPreferredSize(new Dimension(90, BUTTON_HEIGHT));
         dataSetFileButton.setToolTipText("The file to upload.");
         dataSetFileButton.addActionListener(new ActionListener()
             {
@@ -289,15 +340,29 @@ public class DataSetMetadataPanel extends JPanel implements Observer
                     if (newDirOrNull != null)
                     {
                         newDataSetInfo.getNewDataSetBuilder().setFile(newDirOrNull);
-                        clientModel.userDidSelectFile(newDirOrNull);
+                        clientModel.userDidSelectFile(new ValidatedFile(newDirOrNull));
                         updateFileComboBoxList();
                         updateFileLabel();
                         validationQueue.add(Boolean.TRUE);
                     }
                 }
-
             });
-        addRow(1, dataSetFileLabel, dataSetFileComboBox, dataSetFileButton);
+        dataSetFileRefreshButton.setPreferredSize(new Dimension(90, BUTTON_HEIGHT));
+        dataSetFileRefreshButton.setToolTipText("File will be refreshed and revalidated");
+        dataSetFileRefreshButton.addActionListener(new ActionListener()
+            {
+                public void actionPerformed(ActionEvent e)
+                {
+                    if (null == newDataSetInfo
+                            || newDataSetInfo.getNewDataSetBuilder().getFile() == null)
+                    {
+                        return;
+                    }
+                    validationQueue.add(Boolean.TRUE);
+                }
+            });
+        addRow(1, dataSetFileLabel, dataSetFileComboBox, dataSetFileButton,
+                dataSetFileRefreshButton);
 
         // The owner row
         ownerIdLabel.setPreferredSize(new Dimension(LABEL_WIDTH, BUTTON_HEIGHT));
@@ -388,8 +453,9 @@ public class DataSetMetadataPanel extends JPanel implements Observer
     private void updateFileComboBoxList()
     {
         dataSetFileComboBox.removeAllItems();
-        ArrayList<File> files = new ArrayList<File>(clientModel.getUserSelectedFiles());
-        for (File file : files)
+        ArrayList<ValidatedFile> files =
+                new ArrayList<ValidatedFile>(clientModel.getUserSelectedFiles());
+        for (ValidatedFile file : files)
         {
             dataSetFileComboBox.addItem(file);
         }
@@ -407,7 +473,7 @@ public class DataSetMetadataPanel extends JPanel implements Observer
         File file = newDataSetInfo.getNewDataSetBuilder().getFile();
         if (null != file)
         {
-            dataSetFileComboBox.setSelectedItem(file);
+            dataSetFileComboBox.setSelectedItem(new ValidatedFile(file));
         } else
         {
             dataSetFileComboBox.setSelectedItem(EMPTY_FILE_SELECTION);
@@ -454,7 +520,8 @@ public class DataSetMetadataPanel extends JPanel implements Observer
         }
     }
 
-    private void addRow(int rowy, Component label, Component field, Component button)
+    private void addRow(int rowy, Component label, Component field, Component button,
+            Component refreshButton)
     {
         GridBagConstraints c = new GridBagConstraints();
         c.fill = GridBagConstraints.HORIZONTAL;
@@ -471,8 +538,13 @@ public class DataSetMetadataPanel extends JPanel implements Observer
 
         ++c.gridx;
         c.weightx = 0;
-        c.insets = new Insets((rowy > 0) ? 5 : 0, 0, 0, 0);
+        c.insets = new Insets((rowy > 0) ? 5 : 0, 0, 0, 5);
         add(button, c);
+
+        ++c.gridx;
+        c.weightx = 0;
+        c.insets = new Insets((rowy > 0) ? 5 : 0, 0, 0, 0);
+        add(refreshButton, c);
     }
 
     private void addRow(int rowy, Component label, Component field)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java
index d1715e125aa..7e87051bd5d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.dss.client.api.gui;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -78,7 +77,7 @@ public class DataSetUploadClientModel
     // Track which files a user selected to make share the list of files in the selection combo box.
     // The list is reverse-ordered according to selection made by user. There are no duplictes on
     // the list.
-    private final LinkedList<File> userSelectedFiles = new LinkedList<File>();
+    private final LinkedList<ValidatedFile> userSelectedFiles = new LinkedList<ValidatedFile>();
 
     // Generic validator for property values.
     private final SimplePropertyValidator simplePropertyValidator = new SimplePropertyValidator();
@@ -395,7 +394,7 @@ public class DataSetUploadClientModel
 
     }
 
-    public void userDidSelectFile(File selectedFile)
+    public void userDidSelectFile(ValidatedFile selectedFile)
     {
         userSelectedFiles.remove(selectedFile);
         userSelectedFiles.addFirst(selectedFile);
@@ -419,7 +418,7 @@ public class DataSetUploadClientModel
         return null;
     }
 
-    public List<File> getUserSelectedFiles()
+    public List<ValidatedFile> getUserSelectedFiles()
     {
         return userSelectedFiles;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ValidatedFile.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ValidatedFile.java
new file mode 100644
index 00000000000..bad6b4b7c41
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ValidatedFile.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2011 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.openbis.dss.client.api.gui;
+
+import java.io.File;
+
+/**
+ * @author Pawel Glyzewski
+ */
+public class ValidatedFile
+{
+    private File file;
+
+    private long lastValidated;
+
+    public ValidatedFile(File file)
+    {
+        this.file = file;
+        this.lastValidated = file.lastModified();
+    }
+
+    public File getFile()
+    {
+        return file;
+    }
+
+    public long getLastValidated()
+    {
+        return lastValidated;
+    }
+
+    public boolean validationRequired()
+    {
+        return lastValidated < file.lastModified();
+    }
+
+    public void markValidation()
+    {
+        this.lastValidated = file.lastModified();
+    }
+
+    @Override
+    public String toString()
+    {
+        return file.toString();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (o instanceof ValidatedFile)
+        {
+            return file.equals(((ValidatedFile) o).getFile());
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return file.hashCode();
+    }
+}
-- 
GitLab