diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java index abc1d26bb66711d30bfe923cb0aa643e75100d2f..107ecdf97707456dafe64522da753ab7ac859b41 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client; +import java.util.Date; import java.util.List; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; @@ -261,9 +262,9 @@ public interface ICommonClientService extends IClientService throws UserFailureException; /** - * Assumes that preparation of the export ({@link #prepareExportSamples(TableExportCriteria)} or - * {@link #prepareExportExperiments(TableExportCriteria)} has been invoked before and returned - * with an exportDataKey passed here as a parameter. + * Assumes that preparation of the export ({@link #prepareExportSamples(TableExportCriteria)} + * or {@link #prepareExportExperiments(TableExportCriteria)} has been invoked before and + * returned with an exportDataKey passed here as a parameter. */ public String getExportTable(String exportDataKey, String lineSeparator) throws UserFailureException; @@ -350,20 +351,21 @@ public interface ICommonClientService extends IClientService * Updates experiment. */ public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier, - List<ExperimentProperty> properties, String newProjectIdentifier) + List<ExperimentProperty> properties, String newProjectIdentifier, Date version) throws UserFailureException; /** * Updates material. */ - public void updateMaterial(final String materialIdentifier, List<MaterialProperty> properties) - throws UserFailureException; + public void updateMaterial(final String materialIdentifier, List<MaterialProperty> properties, + Date version) throws UserFailureException; /** * Updates sample. */ public void updateSample(final String sampleIdentifier, List<SampleProperty> properties, - ExperimentIdentifier experimentIdentifierOrNull) throws UserFailureException; + ExperimentIdentifier experimentIdentifierOrNull, Date version) + throws UserFailureException; /** Deletes the specified data sets. */ public void deleteDataSets(List<String> dataSetCodes, String reason) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java index 2111ef79d10f9961e547d059fdc6abc19d375285..4abd04d10c62da42f9c13d85a1e36b595c0fc727 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client; +import java.util.Date; import java.util.List; import com.google.gwt.user.client.rpc.AsyncCallback; @@ -303,24 +304,23 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync final AsyncCallback<Void> asyncCallback); /** - * @see ICommonClientService#updateExperiment(String, String, List,String) + * @see ICommonClientService#updateExperiment(String, String, List, String, Date) */ public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier, - List<ExperimentProperty> properties, String newProjectIdentifier, + List<ExperimentProperty> properties, String newProjectIdentifier, Date version, final AsyncCallback<Void> asyncCallback) throws UserFailureException; /** - * @see ICommonClientService#updateMaterial(String, List) + * @see ICommonClientService#updateMaterial(String, List, Date) */ public void updateMaterial(final String materialIdentifier, List<MaterialProperty> properties, - final AsyncCallback<Void> asyncCallback) throws UserFailureException; + Date version, final AsyncCallback<Void> asyncCallback) throws UserFailureException; /** - * @see ICommonClientService#updateSample(String, List, ExperimentIdentifier) + * @see ICommonClientService#updateSample(String, List, ExperimentIdentifier, Date) */ public void updateSample(final String sampleIdentifier, List<SampleProperty> properties, - ExperimentIdentifier experimentIdentifierOrNull, final AsyncCallback<Void> asyncCallback) - throws UserFailureException; + ExperimentIdentifier experimentIdentifierOrNull, Date version, final AsyncCallback<Void> asyncCallback) throws UserFailureException; /** @see ICommonClientService#deleteDataSets(List, String) */ public void deleteDataSets(List<String> dataSetCodes, String reason, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java index ef6a1244263302e96f4e6ac28f9f8f3b06ad22ff..06d8bb143d55bb14cbefa0b36c531c0f45ab0124 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java @@ -64,6 +64,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyT */ public class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, ExperimentModel> { + public static final String ID_SUFFIX_EDIT_BUTTON = "_edit-button"; + private static final String PREFIX = "experiment-browser"; public static final String BROWSER_ID = GenericConstants.ID_PREFIX + PREFIX; @@ -125,6 +127,7 @@ public class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, Exper this.topToolbar.add(new SeparatorToolItem()); String editTitle = viewContext.getMessage(Dict.BUTTON_EDIT); Button editButton = createSelectedItemButton(editTitle, asShowEntityInvoker(true)); + editButton.setId(GRID_ID + ID_SUFFIX_EDIT_BUTTON); this.topToolbar.add(new AdapterToolItem(editButton)); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java index eed4624d838bb9c2e801acc41cb4aa541435fe73..fd152a2624914fae8f0ba4641f085976bc20c544 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java @@ -21,6 +21,7 @@ import static ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants.DAT import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import javax.servlet.http.HttpSession; @@ -974,7 +975,7 @@ public final class CommonClientService extends AbstractClientService implements } public void updateExperiment(String sessionKey, String experimentIdentifier, - List<ExperimentProperty> properties, String newProjectIdentifier) + List<ExperimentProperty> properties, String newProjectIdentifier, Date version) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException { @@ -999,7 +1000,8 @@ public final class CommonClientService extends AbstractClientService implements new ExperimentIdentifierFactory(experimentIdentifier).createIdentifier(); final ProjectIdentifier project = new ProjectIdentifierFactory(newProjectIdentifier).createIdentifier(); - commonServer.editExperiment(sessionToken, identifier, properties, attachments, project); + commonServer.editExperiment(sessionToken, identifier, properties, attachments, project, + version); } catch (final UserFailureException e) { throw UserFailureExceptionTranslator.translate(e); @@ -1030,7 +1032,8 @@ public final class CommonClientService extends AbstractClientService implements } } - public void updateMaterial(String materialIdentifier, List<MaterialProperty> properties) + public void updateMaterial(String materialIdentifier, List<MaterialProperty> properties, + Date version) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException { try @@ -1038,7 +1041,7 @@ public final class CommonClientService extends AbstractClientService implements final String sessionToken = getSessionToken(); final MaterialIdentifier identifier = MaterialIdentifier.tryParseIdentifier(materialIdentifier); - commonServer.editMaterial(sessionToken, identifier, properties); + commonServer.editMaterial(sessionToken, identifier, properties, version); } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e) { throw UserFailureExceptionTranslator.translate(e); @@ -1046,10 +1049,7 @@ public final class CommonClientService extends AbstractClientService implements } - public void updateSample( - String sampleIdentifier, - List<SampleProperty> properties, - ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier experimentIdentifierOrNull) + public void updateSample(String sampleIdentifier, List<SampleProperty> properties,ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier experimentIdentifierOrNull, Date version) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException { try @@ -1065,7 +1065,7 @@ public final class CommonClientService extends AbstractClientService implements .createBean(ExperimentIdentifier.class, experimentIdentifierOrNull); } commonServer.editSample(sessionToken, identifier, properties, - convExperimentIdentifierOrNull); + convExperimentIdentifierOrNull,version); } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e) { throw UserFailureExceptionTranslator.translate(e); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 38ec5f23137e68ca88a3c8a587297ac105efe56f..80552c80026bc40a42506ede33582db66faccb96 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -643,7 +644,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements public void editExperiment(String sessionToken, ExperimentIdentifier identifier, List<ExperimentProperty> properties, List<AttachmentPE> attachments, - ProjectIdentifier newProjectIdentifier) + ProjectIdentifier newProjectIdentifier, Date version) { final Session session = getSessionManager().getSession(sessionToken); if (newProjectIdentifier.equals(identifier) == false) @@ -653,7 +654,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements } final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session); - experimentBO.edit(identifier, properties, attachments, newProjectIdentifier); + experimentBO.edit(identifier, properties, attachments, newProjectIdentifier, version); experimentBO.save(); } @@ -679,8 +680,7 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements final List<SamplePE> samples = sampleTable.getSamples(); if (samples.size() > 0) { - checkExperimentGroupMatches(samples.get(0).getSampleIdentifier(), - newProjectIdentifier); + checkExperimentGroupMatches(samples.get(0).getSampleIdentifier(), newProjectIdentifier); } } @@ -708,21 +708,22 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements } public void editMaterial(String sessionToken, MaterialIdentifier identifier, - List<MaterialProperty> properties) + List<MaterialProperty> properties, Date version) { final Session session = getSessionManager().getSession(sessionToken); final IMaterialBO materialBO = businessObjectFactory.createMaterialBO(session); - materialBO.edit(identifier, properties); + materialBO.edit(identifier, properties, version); materialBO.save(); } public void editSample(String sessionToken, SampleIdentifier identifier, - List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull) + List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull, + Date version) { final Session session = getSessionManager().getSession(sessionToken); final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session); - sampleBO.edit(identifier, properties, experimentIdentifierOrNull); + sampleBO.edit(identifier, properties, experimentIdentifierOrNull, version); sampleBO.save(); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index 11cbffd165f02207c84dc00ae7e31666e7d5e1b4..df7dca9dacd7a22b519a4d98b69924cbccbb8484 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server; import java.util.Arrays; +import java.util.Date; import java.util.List; import ch.systemsx.cisd.authentication.ISessionManager; @@ -313,7 +314,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe public void editExperiment(String sessionToken, ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties, List<AttachmentPE> attachments, - ProjectIdentifier newProjectIdentifierOrNull) + ProjectIdentifier newProjectIdentifierOrNull, Date version) { logTracking(sessionToken, "edit_experiment", "EXPERIMENT(%s) ATTACHMENTS_ADDED(%s) NEW_PROJECT(%s)", experimentIdentifier, @@ -326,14 +327,15 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe } public void editMaterial(String sessionToken, MaterialIdentifier identifier, - List<MaterialProperty> properties) + List<MaterialProperty> properties, Date version) { logTracking(sessionToken, "edit_material", "MATERIAL(%s)", identifier); } public void editSample(String sessionToken, SampleIdentifier identifier, - List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull) + List<SampleProperty> properties, ExperimentIdentifier experimentIdentifierOrNull, + Date version) { logTracking(sessionToken, "edit_sample", "SAMPLE(%s), CHANGE_TO_EXPERIMENT(%S)", identifier, experimentIdentifierOrNull); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java index 6a131248e6d66704a4627d93ed76ed52c1a59077..9d7c58a81581ada03a916465fe91b07aca76c164 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Set; @@ -292,9 +293,13 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper } public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties, - List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifier) + List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifier, Date version) { loadByExperimentIdentifier(identifier); + if (experiment.getModificationDate().equals(version) == false) + { + throw new UserFailureException("Experiment has been modified in the meantime."); + } updateProperties(properties); updateProject(newProjectIdentifier); for (AttachmentPE a : newAttachments) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java index 0cbef8d614a9edef26e01a4d29a7c778f3a75587..f67c5ba25d0b7e6e814b397a888822ea0b197f35 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IExperimentBO.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Date; import java.util.List; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentProperty; @@ -65,5 +66,5 @@ public interface IExperimentBO extends IBusinessObject * Changes given experiment. Currently allowed changes: properties. */ public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties, - List<AttachmentPE> attachments, ProjectIdentifier newProjectIdentifier); + List<AttachmentPE> attachments, ProjectIdentifier newProjectIdentifier, Date version); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java index 8db93a800de03bd7121742448bf006b05e47d197..3ce9f521daa600f2c227bd5836b533c363f9a9cf 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMaterialBO.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Date; import java.util.List; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier; @@ -36,5 +37,5 @@ public interface IMaterialBO extends IBusinessObject /** * Changes given material. Currently allowed changes: properties. */ - public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties); + public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties, Date version); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java index a97f35aa122558990c5331f06ed76d203ec385b6..e2700c022c216bf42325af50dc8a8e262fadda97 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ISampleBO.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.Date; import java.util.List; import ch.systemsx.cisd.common.exceptions.UserFailureException; @@ -82,5 +83,5 @@ public interface ISampleBO * sample is connected. */ void edit(SampleIdentifier identifier, List<SampleProperty> properties, - ExperimentIdentifier experimentIdentifierOrNull); + ExperimentIdentifier experimentIdentifierOrNul, Date version); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java index 4d006a2d9ae494bbb3a214e76df98c7add700c23..13af410ca16fb3cfb6faaa423c4a4537b6ad9514 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MaterialBO.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.springframework.dao.DataAccessException; @@ -99,9 +100,13 @@ public final class MaterialBO extends AbstractBusinessObject implements IMateria } } - public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties) + public void edit(MaterialIdentifier identifier, List<MaterialProperty> properties, Date version) { loadByMaterialIdentifier(identifier); + if (material.getModificationDate().equals(version) == false) + { + throw new UserFailureException("Material has been modified in the meantime."); + } updateProperties(properties); dataChanged = true; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java index d32d095ef768933c9f15b7957a01a86cc456d361..99bee89142260ef59f87c4daba32f0e780d2afed 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.springframework.dao.DataAccessException; @@ -198,9 +199,13 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam } public void edit(SampleIdentifier identifier, List<SampleProperty> properties, - ExperimentIdentifier experimentIdentifierOrNull) + ExperimentIdentifier experimentIdentifierOrNull, Date version) { loadBySampleIdentifier(identifier); + if (sample.getModificationDate().equals(version) == false) + { + throw new UserFailureException("Sample has been modified in the meantime."); + } updateProperties(properties); updateExperiment(experimentIdentifierOrNull); dataChanged = true; @@ -265,7 +270,7 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam { if (validProcedureOrNull == null) { - return (newExperimentOrNull == null); + return newExperimentOrNull == null; } else { if (newExperimentOrNull == null) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java index f8a3ac82ac667964ec48c112c388abcc3352716d..ddc1db0ffef5f4ccf47d472b94f60000e99432b4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.shared; +import java.util.Date; import java.util.List; import org.springframework.transaction.annotation.Transactional; @@ -132,11 +133,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) - public void registerGroupRole( - String sessionToken, - RoleCode roleCode, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier identifier, - String person); + public void registerGroupRole(String sessionToken, RoleCode roleCode, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + GroupIdentifier identifier, String person); /** * Registers a new instance role. @@ -150,11 +149,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) - public void deleteGroupRole( - String sessionToken, - RoleCode roleCode, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier groupIdentifier, - String person); + public void deleteGroupRole(String sessionToken, RoleCode roleCode, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + GroupIdentifier groupIdentifier, String person); /** * Deletes role described by given role code and user id. @@ -189,10 +186,10 @@ public interface ICommonServer extends IServer */ @Transactional(readOnly = true) @RolesAllowed(RoleSet.OBSERVER) - public List<ExperimentPE> listExperiments( - final String sessionToken, + public List<ExperimentPE> listExperiments(final String sessionToken, ExperimentTypePE experimentType, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier project); + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier project); /** * For given {@link SampleIdentifier} returns the corresponding list of {@link ExternalDataPE}. @@ -201,9 +198,9 @@ public interface ICommonServer extends IServer */ @Transactional(readOnly = true) @RolesAllowed(RoleSet.OBSERVER) - public List<ExternalDataPE> listExternalData( - final String sessionToken, - @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) final SampleIdentifier identifier); + public List<ExternalDataPE> listExternalData(final String sessionToken, + @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) + final SampleIdentifier identifier); /** * For given {@link ExperimentIdentifier} returns the corresponding list of @@ -213,9 +210,9 @@ public interface ICommonServer extends IServer */ @Transactional(readOnly = true) @RolesAllowed(RoleSet.OBSERVER) - public List<ExternalDataPE> listExternalData( - final String sessionToken, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) final ExperimentIdentifier identifier); + public List<ExternalDataPE> listExternalData(final String sessionToken, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + final ExperimentIdentifier identifier); /** * Performs an <i>Hibernate Search</i> based on given parameters. @@ -291,10 +288,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) - public void registerProject( - String sessionToken, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier projectIdentifier, - String description, String leaderId); + public void registerProject(String sessionToken, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier projectIdentifier, String description, String leaderId); /** * Performs an <i>Hibernate Search</i> based on given parameters. @@ -350,20 +346,20 @@ public interface ICommonServer extends IServer @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) public void deleteDataSets(String sessionToken, - @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> dataSetCodes, - String reason); + @AuthorizationGuard(guardClass = DataSetCodePredicate.class) + List<String> dataSetCodes, String reason); /** * Saves changed experiment. */ @Transactional @RolesAllowed(RoleSet.USER) - public void editExperiment( - String sessionToken, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier, - List<ExperimentProperty> properties, + public void editExperiment(String sessionToken, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties, List<AttachmentPE> attachments, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier newProjectIdentifier); + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier newProjectIdentifier, Date version); /** * Saves changed material. @@ -371,18 +367,18 @@ public interface ICommonServer extends IServer @Transactional @RolesAllowed(RoleSet.INSTANCE_ADMIN) public void editMaterial(String sessionToken, MaterialIdentifier identifier, - List<MaterialProperty> properties); + List<MaterialProperty> properties, Date version); /** * Saves changed sample. */ @Transactional @RolesAllowed(RoleSet.USER) - public void editSample( - String sessionToken, - @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier, - List<SampleProperty> properties, - @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifierOrNull); + public void editSample(String sessionToken, + @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) + SampleIdentifier identifier, List<SampleProperty> properties, + @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class) + ExperimentIdentifier experimentIdentifierOrNull, Date version); /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */ @Transactional diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java index da5ec1b2e60c315920805bd7ae3e655af959432f..c1aba1aec3147c5bdb0f088ab093353c1488d54d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditForm.java @@ -130,7 +130,8 @@ public final class GenericExperimentEditForm final List<ExperimentProperty> properties = extractProperties(); final String newProjectIdentifier = extractIdentifier(); viewContext.getCommonService().updateExperiment(sessionKey, entity.getIdentifier(), - properties, newProjectIdentifier, new RegisterExperimentCallback(viewContext)); + properties, newProjectIdentifier, entity.getModificationDate(), + new RegisterExperimentCallback(viewContext)); } private String extractIdentifier() diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java index 012e5398448b81c56774c10bffb59d5f93c78389..a7a8b045d893519d8e7276f6365b9caa12989575 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/material/GenericMaterialEditForm.java @@ -62,7 +62,7 @@ public final class GenericMaterialEditForm { final List<MaterialProperty> properties = extractProperties(); viewContext.getCommonService().updateMaterial(entity.getIdentifier(), properties, - new RegisterMaterialCallback(viewContext)); + entity.getModificationDate(), new RegisterMaterialCallback(viewContext)); } public final class RegisterMaterialCallback extends AbstractAsyncCallback<Void> diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java index 4716d657e82ea95199b9cf7538aab990b815e48d..4f4040fd3941b003b6256851667bc036b2ff1f0e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java @@ -87,7 +87,8 @@ public final class GenericSampleEditForm { final List<SampleProperty> properties = extractProperties(); viewContext.getCommonService().updateSample(entity.getIdentifier(), properties, - experimentField.getValue(), new RegisterSampleCallback(viewContext)); + experimentField.getValue(), entity.getModificationDate(), + new RegisterSampleCallback(viewContext)); } public final class RegisterSampleCallback extends AbstractAsyncCallback<Void> diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java index 690073426d2c93c7019ee41b7466600f1bb356a0..6d573cd0e9772e8c3076a15db9fdd627a0abf76a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/SystemTestSuite.java @@ -63,6 +63,7 @@ public class SystemTestSuite extends GWTTestSuite // (NS_ERROR_DOM_SECURITY_ERR): Security error on CC // testSuite.addTestSuite(GenericExperimentRegistrationTest.class); testSuite.addTestSuite(GenericExperimentViewerTest.class); + // testSuite.addTestSuite(GenericExperimentEditorTest.class); testSuite.addTestSuite(PropertyTypeBrowserTest.class); testSuite.addTestSuite(PropertyTypeAssignmentBrowserTest.class); testSuite.addTestSuite(EntityTypePropertyTypeAssignmentTest.class); diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperimentEditor.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperimentEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..02ebd2c7db0ea66bc53d7cb8a530f67ee2600cbe --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ShowExperimentEditor.java @@ -0,0 +1,53 @@ +/* + * Copyright 2008 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.generic.client.web.client.application.ui.experiment; + +import com.extjs.gxt.ui.client.widget.grid.Grid; +import com.google.gwt.user.client.ui.Widget; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ExperimentModel; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.experiment.CommonExperimentColDefKind; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.GridTestUtils; +import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand; +import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil; + +/** + * A {@link AbstractDefaultTestCommand} extension for showing a experiment editor. + * + * @author Izabela Adamczyk + */ +public class ShowExperimentEditor extends AbstractDefaultTestCommand +{ + private final String code; + + public ShowExperimentEditor(final String code) + { + this.code = code; + } + + @SuppressWarnings("unchecked") + public void execute() + { + final Widget widget = GWTTestUtil.getWidgetWithID(ExperimentBrowserGrid.GRID_ID); + assertTrue(widget instanceof Grid); + final Grid<ExperimentModel> table = (Grid<ExperimentModel>) widget; + GridTestUtils.fireSingleClick(table, CommonExperimentColDefKind.CODE.id(), code); + GWTTestUtil.clickButtonWithID(ExperimentBrowserGrid.GRID_ID + + ExperimentBrowserGrid.ID_SUFFIX_EDIT_BUTTON); + + } +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java index 6b038f6d3e836ff05b9b21d4831cc003d59c763a..e76ba012d5c1e8e453e79c4d603efdb9225c292a 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/util/GridTestUtils.java @@ -57,6 +57,17 @@ public class GridTestUtils table.fireEvent(Events.CellDoubleClick, event); } + /** + * Fires a single click event on a first row which contains given value in a column with a + * specified id. + */ + public static <T extends ModelData> void fireSingleClick(final Grid<T> table, String columnId, + String columnValue) + { + GridEvent event = createGridEvent(table, columnId, columnValue); + table.fireEvent(Events.CellClick, event); + } + private static <T extends ModelData> GridEvent createGridEvent(final Grid<T> table, String columnId, String columnValue) { diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java index 47524694dcc1f3354622a0e9e62bb98c5f97a043..ce865884a9bd4e323bff14999440c743700a886c 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import org.jmock.Expectations; @@ -791,22 +792,22 @@ public final class CommonServerTest extends AbstractServerTestCase @Test public void testEditMaterialNothingChanged() throws Exception { - final MaterialIdentifier identifier = - new MaterialIdentifier(MATERIAL_1, MATERIAL_TYPE_1); + final MaterialIdentifier identifier = new MaterialIdentifier(MATERIAL_1, MATERIAL_TYPE_1); final List<MaterialProperty> properties = new ArrayList<MaterialProperty>(); prepareGetSession(); + final Date version = new Date(); context.checking(new Expectations() { { one(commonBusinessObjectFactory).createMaterialBO(SESSION); will(returnValue(materialBO)); - one(materialBO).edit(identifier, properties); + one(materialBO).edit(identifier, properties, version); one(materialBO).save(); } }); - createServer().editMaterial(SESSION_TOKEN, identifier, properties); + createServer().editMaterial(SESSION_TOKEN, identifier, properties, version); context.assertIsSatisfied(); } @@ -818,18 +819,19 @@ public final class CommonServerTest extends AbstractServerTestCase DATABASE_1, GROUP_1)), SAMPLE_1); final List<SampleProperty> properties = new ArrayList<SampleProperty>(); prepareGetSession(); + final Date version = new Date(); context.checking(new Expectations() { { one(commonBusinessObjectFactory).createSampleBO(SESSION); will(returnValue(sampleBO)); - one(sampleBO).edit(identifier, properties, null); + one(sampleBO).edit(identifier, properties, null, version); one(sampleBO).save(); } }); - createServer().editSample(SESSION_TOKEN, identifier, properties, null); + createServer().editSample(SESSION_TOKEN, identifier, properties, null, version); context.assertIsSatisfied(); } @@ -843,6 +845,7 @@ public final class CommonServerTest extends AbstractServerTestCase final ProjectIdentifier newProjectIdentifier = new ProjectIdentifier(DATABASE_1, GROUP_1, PROJECT_1); prepareGetSession(); + final Date version = new Date(); context.checking(new Expectations() { { @@ -850,13 +853,13 @@ public final class CommonServerTest extends AbstractServerTestCase will(returnValue(experimentBO)); one(experimentBO).edit(identifier, properties, attachments, - newProjectIdentifier); + newProjectIdentifier, version); one(experimentBO).save(); } }); createServer().editExperiment(SESSION_TOKEN, identifier, properties, attachments, - newProjectIdentifier); + newProjectIdentifier, version); context.assertIsSatisfied(); } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected index 08d404b56f0a17c90aebf3d8e1c0fcf004fba78c..f06f868779a27c6e3f85659ff37057194c6974ef 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected @@ -16,6 +16,7 @@ package ch.systemsx.cisd.openbis.generic.shared; +import java.util.Date; import java.util.List; import org.springframework.transaction.annotation.Transactional; @@ -132,11 +133,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) - public void registerGroupRole( - String sessionToken, - RoleCode roleCode, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier identifier, - String person); + public void registerGroupRole(String sessionToken, RoleCode roleCode, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + GroupIdentifier identifier, String person); /** * Registers a new instance role. @@ -150,11 +149,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) - public void deleteGroupRole( - String sessionToken, - RoleCode roleCode, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) GroupIdentifier groupIdentifier, - String person); + public void deleteGroupRole(String sessionToken, RoleCode roleCode, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + GroupIdentifier groupIdentifier, String person); /** * Deletes role described by given role code and user id. @@ -189,10 +186,10 @@ public interface ICommonServer extends IServer */ @Transactional(readOnly = true) @RolesAllowed(RoleSet.OBSERVER) - public List<ExperimentPE> listExperiments( - final String sessionToken, + public List<ExperimentPE> listExperiments(final String sessionToken, ExperimentTypePE experimentType, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier project); + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier project); /** * For given {@link SampleIdentifier} returns the corresponding list of {@link ExternalDataPE}. @@ -201,9 +198,9 @@ public interface ICommonServer extends IServer */ @Transactional(readOnly = true) @RolesAllowed(RoleSet.OBSERVER) - public List<ExternalDataPE> listExternalData( - final String sessionToken, - @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) final SampleIdentifier identifier); + public List<ExternalDataPE> listExternalData(final String sessionToken, + @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) + final SampleIdentifier identifier); /** * For given {@link ExperimentIdentifier} returns the corresponding list of @@ -213,9 +210,9 @@ public interface ICommonServer extends IServer */ @Transactional(readOnly = true) @RolesAllowed(RoleSet.OBSERVER) - public List<ExternalDataPE> listExternalData( - final String sessionToken, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) final ExperimentIdentifier identifier); + public List<ExternalDataPE> listExternalData(final String sessionToken, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + final ExperimentIdentifier identifier); /** * Performs an <i>Hibernate Search</i> based on given parameters. @@ -291,10 +288,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) - public void registerProject( - String sessionToken, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier projectIdentifier, - String description, String leaderId); + public void registerProject(String sessionToken, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier projectIdentifier, String description, String leaderId); /** * Performs an <i>Hibernate Search</i> based on given parameters. @@ -350,20 +346,20 @@ public interface ICommonServer extends IServer @Transactional @RolesAllowed(RoleSet.GROUP_ADMIN) public void deleteDataSets(String sessionToken, - @AuthorizationGuard(guardClass = DataSetCodePredicate.class) List<String> dataSetCodes, - String reason); + @AuthorizationGuard(guardClass = DataSetCodePredicate.class) + List<String> dataSetCodes, String reason); /** * Saves changed experiment. */ @Transactional @RolesAllowed(RoleSet.USER) - public void editExperiment( - String sessionToken, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier, - List<ExperimentProperty> properties, + public void editExperiment(String sessionToken, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties, List<AttachmentPE> attachments, - @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ProjectIdentifier newProjectIdentifier); + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier newProjectIdentifier, Date version); /** * Saves changed material. @@ -371,18 +367,18 @@ public interface ICommonServer extends IServer @Transactional @RolesAllowed(RoleSet.INSTANCE_ADMIN) public void editMaterial(String sessionToken, MaterialIdentifier identifier, - List<MaterialProperty> properties); + List<MaterialProperty> properties, Date version); /** * Saves changed sample. */ @Transactional @RolesAllowed(RoleSet.USER) - public void editSample( - String sessionToken, - @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier, - List<SampleProperty> properties, - @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifierOrNull); + public void editSample(String sessionToken, + @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) + SampleIdentifier identifier, List<SampleProperty> properties, + @AuthorizationGuard(guardClass = NullableGroupIdentifierPredicate.class) + ExperimentIdentifier experimentIdentifierOrNull, Date version); /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */ @Transactional diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/FillExperimentEditForm.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/FillExperimentEditForm.java new file mode 100644 index 0000000000000000000000000000000000000000..5c24a981b1cbdd7515124f0b299a68e36a6df852 --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/FillExperimentEditForm.java @@ -0,0 +1,95 @@ +/* + * Copyright 2008 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.generic.client.web.client.application.experiment; + +import java.util.ArrayList; +import java.util.List; + +import com.extjs.gxt.ui.client.widget.form.Field; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.Widget; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ProjectSelectionWidget; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ControlledVocabullaryField.VocabularyList; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils; +import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand; +import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil; +import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.PropertyField; + +/** + * A {@link AbstractDefaultTestCommand} extension for editing experiment. + * + * @author Izabela Adamczyk + */ +public final class FillExperimentEditForm extends AbstractDefaultTestCommand +{ + + private final String projectNameOrNull; + + private final List<PropertyField> properties; + + public FillExperimentEditForm(final String project) + { + this.projectNameOrNull = project; + this.properties = new ArrayList<PropertyField>(); + addCallbackClass(ProjectSelectionWidget.ListProjectsCallback.class); + } + + public final FillExperimentEditForm addProperty(final PropertyField property) + { + assert property != null : "Unspecified property"; + properties.add(property); + return this; + } + + // + // AbstractDefaultTestCommand + // + + public final void execute() + { + + final ProjectSelectionWidget projectSelector = + (ProjectSelectionWidget) GWTTestUtil.getWidgetWithID(ProjectSelectionWidget.ID + + ProjectSelectionWidget.SUFFIX + GenericExperimentRegistrationForm.ID); + if (projectNameOrNull != null) + { + GWTUtils.setSelectedItem(projectSelector, ModelDataPropertyNames.CODE, + projectNameOrNull); + } + + for (final PropertyField property : properties) + { + final Widget widget = GWTTestUtil.getWidgetWithID(property.getPropertyFieldId()); + if (widget instanceof Field) + { + ((Field<?>) widget).setRawValue(property.getPropertyFieldValue()); + } else if (widget instanceof VocabularyList) + { + ListBox list = (VocabularyList) widget; + GWTUtils.setSelectedItem(list, property.getPropertyFieldValue()); + } else + { + throw new IllegalStateException("Wrong widget type"); + } + } + GWTTestUtil.clickButtonWithID(GenericExperimentRegistrationForm.ID + + AbstractRegistrationForm.SAVE_BUTTON); + } +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..75f6c4534a1ff364518a84e2eb74ac5752496755 --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentEditorTest.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 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.generic.client.web.client.application.experiment; + +import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ListExperiments; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ShowExperimentEditor; +import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase; +import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.PropertyField; + +/** + * A {@link AbstractGWTTestCase} extension to test {@link GenericExperimentEditForm}. + * + * @author Izabela Adamczyk + */ +public class GenericExperimentEditorTest extends AbstractGWTTestCase +{ + + private static final String SIRNA_HCS = "SIRNA_HCS"; + + private static final String NEMO = "NEMO (CISD)"; + + private static final String EXP1 = "EXP1"; + + public final void testShowExperimentDetails() + { + prepareShowExperimentEditor(NEMO, SIRNA_HCS, EXP1); + remoteConsole.prepare(new FillExperimentEditForm("NEMO").addProperty(new PropertyField( + GenericExperimentRegistrationForm.ID + "user-description", + "New test experiment description."))); + + launchTest(60000); + } + + private void prepareShowExperimentEditor(final String projectName, + final String experimentTypeName, final String experimentCode) + { + loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_BROWSE); + remoteConsole.prepare(new ListExperiments(projectName, experimentTypeName)); + remoteConsole.prepare(new ShowExperimentEditor(experimentCode)); + } +}