Skip to content
Snippets Groups Projects
Commit d7fe10b3 authored by felmer's avatar felmer
Browse files

SE-191 service interface slightly changed for choice of copy tasks

SVN: 14462
parent a9ee6f7b
No related branches found
No related tags found
No related merge requests found
Showing
with 223 additions and 111 deletions
......@@ -92,6 +92,7 @@ public interface IPhosphoNetXClientService extends IClientService
public String prepareExportRawDataSamples(TableExportCriteria<GenericTableRow> exportCriteria)
throws UserFailureException;
public void copyRawData(long[] rawDataSampleIDs) throws UserFailureException;
public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs)
throws UserFailureException;
}
......@@ -111,6 +111,6 @@ public interface IPhosphoNetXClientServiceAsync extends IClientServiceAsync
public void prepareExportRawDataSamples(TableExportCriteria<GenericTableRow> exportCriteria,
AsyncCallback<String> callback);
/** @see IPhosphoNetXClientService#copyRawData(long[]) */
public void copyRawData(long[] rawDataSampleIDs, AsyncCallback<Void> callback);
/** @see IPhosphoNetXClientService#processRawData(String, long[]) */
public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs, AsyncCallback<Void> callback);
}
\ No newline at end of file
/*
* Copyright 2010 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.plugin.phosphonetx.client.web.client.application;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.Dict.COPY_DATA_SETS_MESSAGE;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.Dict.COPY_DATA_SETS_TITLE;
import java.util.List;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataConfirmationDialog;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.TextToolItem;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericTableRow;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SerializableComparableIDDecorator;
import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
/**
*
*
* @author Franz-Josef Elmer
*/
public class RawDataProcessingMenu extends TextToolItem
{
private static final class CopyConfirmationDialog extends
AbstractDataConfirmationDialog<List<GenericTableRow>>
{
private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext;
private final List<GenericTableRow> samples;
private final DatastoreServiceDescription datastoreServiceDescription;
private CopyConfirmationDialog(
IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext,
DatastoreServiceDescription datastoreServiceDescription,
List<GenericTableRow> samples, String title)
{
super(specificViewContext, samples, title);
this.specificViewContext = specificViewContext;
this.datastoreServiceDescription = datastoreServiceDescription;
this.samples = samples;
}
@Override
protected String createMessage()
{
String list = "[";
String delim = "";
for (GenericTableRow sample : samples)
{
list += delim + sample.tryToGetValue(0);
delim = ", ";
}
list += "]";
String label = datastoreServiceDescription.getLabel();
return specificViewContext.getMessage(COPY_DATA_SETS_MESSAGE, label, list);
}
@Override
protected void executeConfirmedAction()
{
long[] rawDataSampleIDs = new long[samples.size()];
for (int i = 0; i < samples.size(); i++)
{
GenericTableRow row = samples.get(i);
ISerializableComparable c = row.tryToGetValue(0);
if (c instanceof SerializableComparableIDDecorator == false)
{
throw new IllegalArgumentException("Missing id: " + c);
}
rawDataSampleIDs[i] = ((SerializableComparableIDDecorator) c).getID();
}
specificViewContext.getService().processRawData(datastoreServiceDescription.getKey(),
rawDataSampleIDs, new VoidAsyncCallback<Void>(specificViewContext));
}
@Override
protected void extendForm()
{
}
}
private final IViewContext<IPhosphoNetXClientServiceAsync> viewContext;
private final IDelegatedActionWithResult<List<GenericTableRow>> selectedDataProvider;
public RawDataProcessingMenu(IViewContext<IPhosphoNetXClientServiceAsync> viewContext,
IDelegatedActionWithResult<List<GenericTableRow>> selectedDataProvider)
{
super(viewContext.getMessage(Dict.COPY_DATA_SETS_BUTTON_LABEL));
this.viewContext = viewContext;
this.selectedDataProvider = selectedDataProvider;
IViewContext<ICommonClientServiceAsync> commonViewContext =
viewContext.getCommonViewContext();
viewContext.getCommonService().listDataStoreServices(DataStoreServiceKind.PROCESSING,
new AbstractAsyncCallback<List<DatastoreServiceDescription>>(commonViewContext)
{
@Override
public final void process(List<DatastoreServiceDescription> plugins)
{
createMenu(plugins);
}
});
}
private void createMenu(List<DatastoreServiceDescription> plugins)
{
Menu subMenu = new Menu();
for (final DatastoreServiceDescription datastoreServiceDescription : plugins)
{
IActionMenuItem actionMenuItem = new IActionMenuItem()
{
public String getMenuText(IMessageProvider messageProvider)
{
return datastoreServiceDescription.getLabel();
}
public String getMenuId()
{
return datastoreServiceDescription.getKey();
}
};
IDelegatedAction action = new IDelegatedAction()
{
public void execute()
{
String title = viewContext.getMessage(COPY_DATA_SETS_TITLE);
List<GenericTableRow> selectedSamples = selectedDataProvider.execute();
new CopyConfirmationDialog(viewContext, datastoreServiceDescription,
selectedSamples, title).show();
}
};
subMenu.add(new ActionMenu(actionMenuItem, viewContext, action));
}
setMenu(subMenu);
}
}
......@@ -18,25 +18,18 @@ package ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.applicatio
import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.createOrDelete;
import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.edit;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.Dict.COPY_DATA_SETS_BUTTON_LABEL;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.Dict.COPY_DATA_SETS_MESSAGE;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.application.Dict.COPY_DATA_SETS_TITLE;
import java.util.List;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.google.gwt.user.client.rpc.AsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.VoidAsyncCallback;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.GenericTableBrowserGrid;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ICellListener;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataConfirmationDialog;
import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedActionWithResult;
import ch.systemsx.cisd.openbis.generic.client.web.client.dto.GenericTableResultSet;
import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IResultSetConfig;
import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
......@@ -45,7 +38,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericTableRow;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SerializableComparableIDDecorator;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
import ch.systemsx.cisd.openbis.plugin.phosphonetx.client.web.client.IPhosphoNetXClientServiceAsync;
......@@ -66,59 +58,6 @@ class RawDataSampleGrid extends GenericTableBrowserGrid
return grid.asDisposableWithoutToolbar();
}
private static final class CopyConfirmationDialog extends
AbstractDataConfirmationDialog<List<GenericTableRow>>
{
private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext;
private final List<GenericTableRow> samples;
private CopyConfirmationDialog(
IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext,
List<GenericTableRow> samples, String title)
{
super(specificViewContext, samples, title);
this.specificViewContext = specificViewContext;
this.samples = samples;
}
@Override
protected String createMessage()
{
String list = "[";
String delim = "";
for (GenericTableRow sample : samples)
{
list += delim + sample.tryToGetValue(0);
delim = ", ";
}
list += "]";
return specificViewContext.getMessage(COPY_DATA_SETS_MESSAGE, list);
}
@Override
protected void executeConfirmedAction()
{
long[] rawDataSampleIDs = new long[samples.size()];
for (int i = 0; i < samples.size(); i++)
{
GenericTableRow row = samples.get(i);
ISerializableComparable c = row.tryToGetValue(0);
if (c instanceof SerializableComparableIDDecorator == false)
{
throw new IllegalArgumentException("Missing id: " + c);
}
rawDataSampleIDs[i] = ((SerializableComparableIDDecorator) c).getID();
}
specificViewContext.getService().copyRawData(rawDataSampleIDs,
new VoidAsyncCallback<Void>(specificViewContext));
}
@Override
protected void extendForm()
{
}
}
private final IViewContext<IPhosphoNetXClientServiceAsync> specificViewContext;
......@@ -136,20 +75,16 @@ class RawDataSampleGrid extends GenericTableBrowserGrid
});
allowMultipleSelection();
addEntityOperationsLabel();
Button uploadButton =
new Button(viewContext.getMessage(COPY_DATA_SETS_BUTTON_LABEL),
new AbstractCreateDialogListener()
{
@Override
protected Dialog createDialog(List<GenericTableRow> samples,
IBrowserGridActionInvoker invoker)
{
return new CopyConfirmationDialog(specificViewContext, samples,
specificViewContext.getMessage(COPY_DATA_SETS_TITLE));
}
});
addButton(uploadButton);
RawDataProcessingMenu button = new RawDataProcessingMenu(viewContext,
new IDelegatedActionWithResult<List<GenericTableRow>>()
{
public List<GenericTableRow> execute()
{
return getSelectedBaseObjects();
}
});
enableButtonOnSelectedItems(button);
addButton(button);
}
@Override
......
......@@ -42,11 +42,11 @@ var phosphonetx = {
ALL_RAW_DATA_SAMPLES_menu_item: "All MS INJECTION Samples",
ALL_RAW_DATA_SAMPLES_tab_label: "MS INJECTION Samples and Related Biological Samples",
openbis_raw_data_sample_browser_CODE: "MS INJECTION Sample",
openbis_raw_data_sample_browser_REGISTRATION_DATE: "Regustration Date",
openbis_raw_data_sample_browser_REGISTRATION_DATE: "Registration Date",
openbis_raw_data_sample_browser_PARENT: "Biological Sample",
copy_data_sets_button_label: "Copy Data Sets",
copy_data_sets_title: "Copy Data Sets Confirmation",
copy_data_sets_message: "Do you want to make the data sets of the samples {0} available for processing?",
copy_data_sets_button_label: "Process Data Sets",
copy_data_sets_title: "Process Data Sets Confirmation",
copy_data_sets_message: "Do you want to process '{0}' for the data sets of the samples {1}?",
// LAST LINE: KEEP IT AT THE END
lastline: "" // we need a line without a comma
......
......@@ -201,10 +201,10 @@ public class PhosphoNetXClientService extends AbstractClientService implements
return prepareExportEntities(exportCriteria);
}
public void copyRawData(long[] rawDataSampleIDs)
public void processRawData(String dataSetProcessingKey, long[] rawDataSampleIDs)
throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
{
rawDataService.copyRawData(getSessionToken(), rawDataSampleIDs);
rawDataService.processRawData(getSessionToken(), dataSetProcessingKey, rawDataSampleIDs);
}
}
......@@ -67,13 +67,15 @@ public class RawDataService extends AbstractServer<IRawDataService> implements I
}
}
public void copyRawData(String sessionToken, String userID, long[] rawDataSampleIDs)
public void processingRawData(String sessionToken, String userID, String dataSetProcessingKey,
long[] rawDataSampleIDs)
{
checkSession(sessionToken);
SessionContextDTO session = login(userID);
try
{
service.copyRawData(session.getSessionToken(), rawDataSampleIDs);
service.processRawData(session.getSessionToken(), dataSetProcessingKey,
rawDataSampleIDs);
} finally
{
service.logout(session.getSessionToken());
......
......@@ -56,9 +56,7 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.authorization.validato
*/
public class RawDataServiceInternal extends AbstractServer<IRawDataServiceInternal> implements IRawDataServiceInternal
{
@Private static final String COPY_PROCESSING_KEY = "copy-data-sets";
@Private static final String GROUP_CODE = "MS_DATA";
@Private static final String GROUP_CODE = "MS_DATA";
@Private static final String RAW_DATA_SAMPLE_TYPE = "MS_INJECTION";
......@@ -95,11 +93,12 @@ public class RawDataServiceInternal extends AbstractServer<IRawDataServiceIntern
return loadAllRawDataSamples(getSession(sessionToken));
}
public void copyRawData(String sessionToken, long[] rawDataSampleIDs)
public void processRawData(String sessionToken, String dataSetProcessingKey,
long[] rawDataSampleIDs)
{
Session session = getSession(sessionToken);
PersonPE person = session.tryGetPerson();
List<Sample> samples = loadAllRawDataSamples(session);
Set<Long> sampleIDs = new HashSet<Long>();
for (Sample sample : samples)
......@@ -109,7 +108,7 @@ public class RawDataServiceInternal extends AbstractServer<IRawDataServiceIntern
sampleIDs.add(sample.getId());
}
}
ISampleDAO sampleDAO = getDAOFactory().getSampleDAO();
IExternalDataDAO externalDataDAO = getDAOFactory().getExternalDataDAO();
List<String> dataSetCodes = new ArrayList<String>();
......@@ -127,10 +126,10 @@ public class RawDataServiceInternal extends AbstractServer<IRawDataServiceIntern
dataSetCodes.add(dataSet.getCode());
}
}
String dataStoreServerCode = findDataStoreServer();
String dataStoreServerCode = findDataStoreServer(dataSetProcessingKey);
IExternalDataTable externalDataTable =
businessObjectFactory.createExternalDataTable(session);
externalDataTable.processDatasets(COPY_PROCESSING_KEY, dataStoreServerCode, dataSetCodes);
externalDataTable.processDatasets(dataSetProcessingKey, dataStoreServerCode, dataSetCodes);
}
private List<Sample> loadAllRawDataSamples(Session session)
......@@ -147,7 +146,7 @@ public class RawDataServiceInternal extends AbstractServer<IRawDataServiceIntern
return sampleLister.list(criteria2);
}
private String findDataStoreServer()
private String findDataStoreServer(String dataSetProcessingKey)
{
List<DataStorePE> dataStores = getDAOFactory().getDataStoreDAO().listDataStores();
for (DataStorePE dataStore : dataStores)
......@@ -156,13 +155,13 @@ public class RawDataServiceInternal extends AbstractServer<IRawDataServiceIntern
for (DataStoreServicePE dataStoreService : services)
{
if (DataStoreServiceKind.PROCESSING.equals(dataStoreService.getKind())
&& COPY_PROCESSING_KEY.equals(dataStoreService.getKey()))
&& dataSetProcessingKey.equals(dataStoreService.getKey()))
{
return dataStore.getCode();
}
}
}
throw new EnvironmentFailureException("No data store processing service with key '"
+ COPY_PROCESSING_KEY + "' found.");
+ dataSetProcessingKey + "' found.");
}
}
......@@ -44,7 +44,7 @@ class RawDataServiceInternalLogger extends AbstractServerLogger implements IRawD
return null;
}
public void copyRawData(String sessionToken, long[] rawDataSampleIDs)
public void processRawData(String sessionToken, String dataSetProcessingKey, long[] rawDataSampleIDs)
{
int numberOfDataSets = rawDataSampleIDs == null ? 0 : rawDataSampleIDs.length;
logAccess(sessionToken, "copy_raw_data", "NUMBER_OF_DATA_SETS(%s)", numberOfDataSets);
......
......@@ -44,11 +44,13 @@ class RawDataServiceLogger extends AbstractServerLogger implements IRawDataServi
return null;
}
public void copyRawData(String sessionToken, String userID, long[] rawDataSampleIDs)
public void processingRawData(String sessionToken, String userID, String dataSetProcessingKey,
long[] rawDataSampleIDs)
{
int numberOfDataSets = rawDataSampleIDs == null ? 0 : rawDataSampleIDs.length;
logAccess(sessionToken, "copy_raw_data", "USER_ID(%s) NUMBER_OF_DATA_SETS(%s)", userID,
numberOfDataSets);
logAccess(sessionToken, "copy_raw_data",
"USER_ID(%s) DSS_PROCESSING_PLUGIN(%s) NUMBER_OF_DATA_SETS(%s)", userID,
dataSetProcessingKey, numberOfDataSets);
}
}
......@@ -39,8 +39,14 @@ public interface IRawDataService extends IServer
@Transactional(readOnly = true)
@RolesAllowed(RoleSet.INSTANCE_ADMIN_OBSERVER)
public List<Sample> listRawDataSamples(String sessionToken, String userID);
/**
* Processes the data sets of specified samples by the DSS processing plug-in of specified key
* for the specified user. Implementations should check that the specified user is allowed
* to read specified samples.
*/
@Transactional(readOnly = true)
@RolesAllowed(RoleSet.INSTANCE_ADMIN_OBSERVER)
public void copyRawData(String sessionToken, String userID, long[] rawDataSampleIDs);
public void processingRawData(String sessionToken, String userID, String dataSetProcessingKey,
long[] rawDataSampleIDs);
}
......@@ -45,5 +45,5 @@ public interface IRawDataServiceInternal extends IServer
@Transactional(readOnly = true)
@RolesAllowed(RoleSet.USER)
public void copyRawData(String sessionToken, long[] rawDataSampleIDs);
public void processRawData(String sessionToken, String dataSetProcessingKey, long[] rawDataSampleIDs);
}
\ No newline at end of file
......@@ -67,6 +67,6 @@ public class RawDataTestClient
Sample sample = samples.get(i);
ids[i] = sample.getId();
}
service.copyRawData(sessionToken, "test_a", ids);
service.processingRawData(sessionToken, "test_a", "copy-data-sets", ids);
}
}
......@@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.plugin.phosphonetx.server;
import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind.PROCESSING;
import static ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind.QUERIES;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.server.RawDataServiceInternal.COPY_PROCESSING_KEY;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.server.RawDataServiceInternal.GROUP_CODE;
import static ch.systemsx.cisd.openbis.plugin.phosphonetx.server.RawDataServiceInternal.RAW_DATA_SAMPLE_TYPE;
......@@ -57,6 +56,7 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.IRawDataServiceInterna
@Friend(toClasses=RawDataServiceInternal.class)
public class RawDataServiceInternalTest extends AbstractServerTestCase
{
private static final String COPY_PROCESSING_KEY = "copy-data-sets";
private IRawDataServiceInternal service;
private ICommonBusinessObjectFactory boFactory;
private ISampleLister sampleLister;
......@@ -126,7 +126,7 @@ public class RawDataServiceInternalTest extends AbstractServerTestCase
});
service.copyRawData(SESSION_TOKEN, ids);
service.processRawData(SESSION_TOKEN, COPY_PROCESSING_KEY, ids);
context.assertIsSatisfied();
}
......
......@@ -99,7 +99,7 @@ public class RawDataServiceTest extends AbstractServerTestCase
try
{
service.copyRawData(SESSION_TOKEN, "abc", new long[0]);
service.processingRawData(SESSION_TOKEN, "abc", null, new long[0]);
fail("UserFailureException expected");
} catch (UserFailureException ex)
{
......@@ -118,11 +118,11 @@ public class RawDataServiceTest extends AbstractServerTestCase
context.checking(new Expectations()
{
{
one(internalService).copyRawData(session2.getSessionToken(), ids);
one(internalService).processRawData(session2.getSessionToken(), null, ids);
}
});
service.copyRawData(SESSION_TOKEN, "abc", ids);
service.processingRawData(SESSION_TOKEN, "abc", null, ids);
context.assertIsSatisfied();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment