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 1e9121111122e399aef49e4040360dc7020340c7..9c9c7a124bb39d6b6da88e3f4faf9686eab816f8 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 @@ -29,6 +29,8 @@ import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.io.File; @@ -193,6 +195,19 @@ public class DataSetMetadataPanel extends JPanel } }); + ownerIdText.addFocusListener(new FocusListener() + { + + public void focusLost(FocusEvent e) + { + setOwnerId(ownerIdText.getText()); + } + + public void focusGained(FocusEvent e) + { + // Do nothing + } + }); experimentButton.addActionListener(new ActionListener() { diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java index 719d6455224a1fc5c7c325b634dc7da554f1c474..9604843ef6d3e4c232344a07ba4f26d143127b71 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java @@ -26,6 +26,8 @@ import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -111,6 +113,18 @@ public class DataSetPropertiesPanel extends JPanel } }); + textField.addFocusListener(new FocusListener() + { + public void focusLost(FocusEvent e) + { + setPropertyValue(propertyType, textField.getText()); + } + + public void focusGained(FocusEvent e) + { + // Do nothing + } + }); addFormField(col, row, label, textField); formFields.put(propertyType.getCode(), textField); } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java index 143a753a6d43e8b8d1704fdfb422fcef6ae3ca52..02a72f39110e7cac052838799fd022dc5f744467 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java @@ -46,7 +46,6 @@ import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.common.utilities.ITimeProvider; /** @@ -82,7 +81,7 @@ public class DataSetUploadClient extends AbstractSwingGUI throws ch.systemsx.cisd.cifex.shared.basic.UserFailureException, EnvironmentFailureException { - setLookAndFeelToMetal(); + setLookAndFeelToNative(); try { @@ -205,7 +204,7 @@ public class DataSetUploadClient extends AbstractSwingGUI { public void actionPerformed(ActionEvent e) { - throw new NotImplementedException(); + clientModel.queueUploadOfDataSet(clientModel.getNewDataSetInfos()); } }); 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 08d678ccc417a821ab8ea055422e02645101014b..55d3c9ecbb788ab8ba0c7830fb5596fd2933631a 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 @@ -20,10 +20,15 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import ch.systemsx.cisd.base.namedthread.NamingThreadPoolExecutor; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.io.TransmissionSpeedCalculator; import ch.systemsx.cisd.common.utilities.ITimeProvider; +import ch.systemsx.cisd.openbis.dss.client.api.gui.DataSetUploadClientModel.NewDataSetInfo.Status; import ch.systemsx.cisd.openbis.dss.client.api.v1.IDssComponent; import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO; import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO; @@ -38,6 +43,8 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup; */ public class DataSetUploadClientModel { + private static ExecutorService executor = new NamingThreadPoolExecutor("Data Set Upload", 1, 1, + 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()).daemonize(); private final IDssComponent dssComponent; @@ -175,6 +182,12 @@ public class DataSetUploadClientModel { return status; } + + public boolean canBeQueued() + { + return status != Status.UPLOADING && status != Status.STALLED + && status != Status.COMPLETED_UPLOAD; + } } /** @@ -191,11 +204,24 @@ public class DataSetUploadClientModel public NewDataSetInfo addNewDataSetInfo() { NewDataSetDTOBuilder newDataSetBuilder = new NewDataSetDTOBuilder(); + String defaultDataSetTypeCode = getDefaultDataSetTypeCode(); + newDataSetBuilder.getDataSetMetadata().setDataSetTypeOrNull(defaultDataSetTypeCode); NewDataSetInfo newDataSetInfo = new NewDataSetInfo(newDataSetBuilder, timeProvider); newDataSetInfos.add(newDataSetInfo); return newDataSetInfo; } + private String getDefaultDataSetTypeCode() + { + if (dataSetTypes.size() > 0) + { + return getDataSetTypes().get(0).getCode(); + } else + { + return null; + } + } + /** * Remove a data set info. */ @@ -285,6 +311,30 @@ public class DataSetUploadClientModel return newDataSetDTO; } + /** + * Start a data set upload in a separate thread. Callers need to ensure that queuing makes + * sense. + */ + public void queueUploadOfDataSet(NewDataSetInfo newDataSetInfo) + { + if (false == newDataSetInfo.canBeQueued()) + { + return; + } + newDataSetInfo.setStatus(Status.QUEUED_FOR_UPLOAD); + DataSetUploadOperation op = new DataSetUploadOperation(tableModel, this, newDataSetInfo); + executor.submit(op); + } + + public void queueUploadOfDataSet(List<NewDataSetInfo> newDataSetInfosToQueue) + { + for (NewDataSetInfo newDataSetInfo : newDataSetInfosToQueue) + { + queueUploadOfDataSet(newDataSetInfo); + } + + } + private DataSetType tryDataSetType(String dataSetTypeCode) { if (null == dataSetTypeCode) diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java index ff6d18ccd7364a831ccc535204ea831e26c5ecbb..af1f13f85934da77f4ecd19689e46b325f243efe 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java @@ -22,9 +22,6 @@ import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; import javax.swing.JFrame; import javax.swing.JTable; @@ -33,9 +30,7 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; -import ch.systemsx.cisd.base.namedthread.NamingThreadPoolExecutor; import ch.systemsx.cisd.openbis.dss.client.api.gui.DataSetUploadClientModel.NewDataSetInfo; -import ch.systemsx.cisd.openbis.dss.client.api.gui.DataSetUploadClientModel.NewDataSetInfo.Status; import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO.DataSetOwner; import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTOBuilder; @@ -62,9 +57,6 @@ public class DataSetUploadTableModel extends AbstractTableModel static final int UPLOAD_STATUS_COLUMN = 4; - private static ExecutorService executor = new NamingThreadPoolExecutor("Data Set Upload", 1, 1, - 0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()).daemonize(); - private final JFrame mainWindow; private final DataSetUploadClientModel clientModel; @@ -301,9 +293,7 @@ public class DataSetUploadTableModel extends AbstractTableModel // Only start uploading if the file hasn't been upload yet NewDataSetInfo.Status status = newDataSetInfo.getStatus(); - if ((status != NewDataSetInfo.Status.TO_UPLOAD) - && (status != NewDataSetInfo.Status.COMPLETED_UPLOAD) - && (status != NewDataSetInfo.Status.FAILED)) + if ((status != NewDataSetInfo.Status.TO_UPLOAD) && (status != NewDataSetInfo.Status.FAILED)) { return; } @@ -353,12 +343,30 @@ public class DataSetUploadTableModel extends AbstractTableModel { NewDataSetInfo newlyCreated = clientModel.addNewDataSetInfo(); syncNewDataSetInfos(); + ArrayList<Integer> selectedIndices = new ArrayList<Integer>(); + selectedIndices.add(clientModel.getNewDataSetInfos().size() - 1); + setSelectedIndices(selectedIndices); selectNewDataSetInfo(newlyCreated); } public void removeSelectedDataSet() { - assert false : "Not yet implemented"; + if (selectedRow < 0) + { + return; + } + if (selectedRow >= newDataSetInfos.size()) + { + return; + } + NewDataSetInfo dataSetInfoToRemove = newDataSetInfos.get(selectedRow); + + int newSelectedRow = Math.max(0, selectedRow - 1); + ArrayList<Integer> selectedIndices = new ArrayList<Integer>(); + selectedIndices.add(newSelectedRow); + setSelectedIndices(selectedIndices); + clientModel.removeNewDataSetInfo(dataSetInfoToRemove); + syncNewDataSetInfos(); } /** @@ -390,9 +398,7 @@ public class DataSetUploadTableModel extends AbstractTableModel */ private void queueUploadOfDataSet(NewDataSetInfo newDataSetInfo) { - newDataSetInfo.setStatus(Status.QUEUED_FOR_UPLOAD); - DataSetUploadOperation op = new DataSetUploadOperation(this, clientModel, newDataSetInfo); - executor.submit(op); + clientModel.queueUploadOfDataSet(newDataSetInfo); } public NewDataSetInfo getSelectedNewDataSet() diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java index 3d7725a8d688fe24d55f43d3dd603bde31cea89c..019cc94cdc1315551edbb93ae25477023ecb29c7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java @@ -117,7 +117,7 @@ public class UploadStatusTableCellRenderer implements TableCellRenderer case STALLED: panel = progressPanel; progressBar.setValue(0); - progressLabel.setText("progress..."); + progressLabel.setText("uploading..."); break; case COMPLETED_UPLOAD: panel = completedPanel; diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java index d2d4c1ee22d91a74943e7871b9ca19b68ffa45cc..07b14e6524d7b1bc12e0bd8f4485ef23c0f03c83 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java @@ -110,6 +110,10 @@ public class NewDataSetDTOBuilder try { ArrayList<FileInfoDssDTO> fileInfos = new ArrayList<FileInfoDssDTO>(); + if (null == file) + { + return fileInfos; + } if (false == file.exists()) { return fileInfos;