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