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 87c73759f25746de3d81483b2a8bd72d8fe52cf4..e8e8fb81878ef082dc7f5a1e4ddb264bfb463bbd 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 @@ -260,9 +260,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; @@ -349,7 +349,8 @@ public interface ICommonClientService extends IClientService * Updates experiment. */ public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier, - List<ExperimentProperty> properties) throws UserFailureException; + List<ExperimentProperty> properties, String newProjectIdentifierOrNull) + throws UserFailureException; /** * Updates material. @@ -364,6 +365,7 @@ public interface ICommonClientService extends IClientService throws UserFailureException; /** Deletes the specified data sets. */ - public void deleteDataSets(List<String> dataSetCodes, String reason) throws UserFailureException; + public void deleteDataSets(List<String> dataSetCodes, String reason) + throws UserFailureException; } 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 934e8abbe11168b9b366c200f2321b8e975ed8ef..8e67325334a7e242908a6298360041e5af009c4f 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 @@ -302,11 +302,11 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync final AsyncCallback<Void> asyncCallback); /** - * @see ICommonClientService#updateExperiment(String, String, List) + * @see ICommonClientService#updateExperiment(String, String, List,String) */ public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier, - List<ExperimentProperty> properties, final AsyncCallback<Void> asyncCallback) - throws UserFailureException; + List<ExperimentProperty> properties, String newProjectIdentifier, + final AsyncCallback<Void> asyncCallback) throws UserFailureException; /** * @see ICommonClientService#updateMaterial(String, List) @@ -321,5 +321,6 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync final AsyncCallback<Void> asyncCallback) throws UserFailureException; /** @see ICommonClientService#deleteDataSets(List, String) */ - public void deleteDataSets(List<String> dataSetCodes, String reason, AsyncCallback<Void> asyncCallback); + public void deleteDataSets(List<String> dataSetCodes, String reason, + AsyncCallback<Void> asyncCallback); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java index 6a89734fcb0b4349dda4bbe270c8dfbc0b918c51..3f769e1a3c7055b337c80e712f500e9cb895dc13 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java @@ -94,6 +94,8 @@ public final class ModelDataPropertyNames public static final String IS_MANAGED_INTERNALLY = "isManagedInternally"; + public static final String PROJECT_IDENTIFIER = "projectIdentifier"; + private ModelDataPropertyNames() { // Can not be instantiated. 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 326a1bf4fcd08a0b936a56625adde89d8b0cb46f..6b8d03f0331288f28c6ba2246b5f4c48783725ab 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 @@ -134,7 +134,7 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment, { return new EditableExperiment(selectedType.getExperimentTypePropertyTypes(), experiment .getProperties(), selectedType, experiment.getIdentifier(), experiment.getId(), - experiment.getModificationDate()); + experiment.getModificationDate(), experiment.getProject().getIdentifier()); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java index bcb192fd167f819d7bc491945ced328eaa499816..b4e684c2bdea068c114a192b70d6ddfba46f34ba 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ProjectSelectionWidget.java @@ -29,6 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewConte import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AppEvents; import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.DropDownList; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.GWTUtils; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Project; import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet; @@ -55,6 +56,7 @@ public final class ProjectSelectionWidget extends public ProjectComboModel(Project project) { set(DISPLAY_COLUMN_ID, renderProjectWithGroup(project)); + set(ModelDataPropertyNames.PROJECT_IDENTIFIER, project.getIdentifier()); set(ModelDataPropertyNames.OBJECT, project); } @@ -68,11 +70,20 @@ public final class ProjectSelectionWidget extends private final IViewContext<?> viewContext; + private final String initialProjectIdentifier; + public ProjectSelectionWidget(final IViewContext<?> viewContext, final String idSuffix) + { + this(viewContext, idSuffix, null); + } + + public ProjectSelectionWidget(final IViewContext<?> viewContext, final String idSuffix, + String initialProjectIdentifier) { super(viewContext, SUFFIX + idSuffix, Dict.PROJECT, DISPLAY_COLUMN_ID, CHOOSE_SUFFIX, EMPTY_RESULT_SUFFIX); this.viewContext = viewContext; + this.initialProjectIdentifier = initialProjectIdentifier; } /** @@ -108,8 +119,19 @@ public final class ProjectSelectionWidget extends setReadOnly(true); } applyEmptyText(); + if (initialProjectIdentifier != null) + { + trySelectByIdentifier(initialProjectIdentifier); + updateOriginalValue(); + } fireEvent(AppEvents.CALLBACK_FINISHED); } + + } + + public void updateOriginalValue() + { + setOriginalValue(getValue()); } @Override @@ -129,4 +151,10 @@ public final class ProjectSelectionWidget extends DefaultResultSetConfig<String, Project> config = DefaultResultSetConfig.createFetchAll(); viewContext.getCommonService().listProjects(config, new ListProjectsCallback(viewContext)); } + + public void trySelectByIdentifier(String projectIdentifier) + { + GWTUtils + .setSelectedItem(this, ModelDataPropertyNames.PROJECT_IDENTIFIER, projectIdentifier); + } } \ No newline at end of file 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 d35fa5e82de90c14f02dc95c14a92ca8c8d55ea5..55d9da4cddb78af1fbe954b99c6ad194a25e4c50 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 @@ -974,7 +974,7 @@ public final class CommonClientService extends AbstractClientService implements } public void updateExperiment(String sessionKey, String experimentIdentifier, - List<ExperimentProperty> properties) + List<ExperimentProperty> properties, String newProjectIdentifier) throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException { @@ -997,7 +997,10 @@ public final class CommonClientService extends AbstractClientService implements } final ExperimentIdentifier identifier = new ExperimentIdentifierFactory(experimentIdentifier).createIdentifier(); - commonServer.editExperiment(sessionToken, identifier, properties, attachments); + final ProjectIdentifier project = + newProjectIdentifier == null ? null : new ProjectIdentifierFactory( + newProjectIdentifier).createIdentifier(); + commonServer.editExperiment(sessionToken, identifier, properties, attachments, project); } catch (final 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 6fc15a6082a043a1f01154f21b2fe2f019d9b768..520b9e258a2d72d270ed93211c47066a24703ce7 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 @@ -642,11 +642,12 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements } public void editExperiment(String sessionToken, ExperimentIdentifier identifier, - List<ExperimentProperty> properties, List<AttachmentPE> attachments) + List<ExperimentProperty> properties, List<AttachmentPE> attachments, + ProjectIdentifier newProjectIdentifierOrNull) { final Session session = getSessionManager().getSession(sessionToken); final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session); - experimentBO.edit(identifier, properties, attachments); + experimentBO.edit(identifier, properties, attachments, newProjectIdentifierOrNull); experimentBO.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 dc7e1cc8e11c9fee457eb60619d1eec21948c094..1a5563cbc6082da52670d4b4b1777596be130788 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 @@ -312,10 +312,12 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe } public void editExperiment(String sessionToken, ExperimentIdentifier experimentIdentifier, - List<ExperimentProperty> properties, List<AttachmentPE> attachments) + List<ExperimentProperty> properties, List<AttachmentPE> attachments, + ProjectIdentifier newProjectIdentifierOrNull) { - logTracking(sessionToken, "edit_experiment", "EXPERIMENT(%s) ATTACHMENTS_ADDED(%s)", - experimentIdentifier, attachments.size()); + logTracking(sessionToken, "edit_experiment", + "EXPERIMENT(%s) ATTACHMENTS_ADDED(%s) NEW_PROJECT(%s)", experimentIdentifier, + attachments.size(), newProjectIdentifierOrNull); } public void deleteDataSets(String sessionToken, List<String> dataSetCodes, String reason) 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 c611ea76aff066c8f95c6ec10b7d4b150f1c7413..e61ff86b096fa5fc6c0118408599292011ddb697 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 @@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; @@ -291,10 +292,11 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper } public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties, - List<AttachmentPE> newAttachments) + List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifierOrNull) { loadByExperimentIdentifier(identifier); updateProperties(properties); + updateProject(newProjectIdentifierOrNull); for (AttachmentPE a : newAttachments) { addAttachment(a); @@ -302,6 +304,24 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper dataChanged = true; } + private void updateProject(ProjectIdentifier newProjectIdentifierOrNull) + { + if (newProjectIdentifierOrNull != null) + { + ProjectPE project = + getProjectDAO().tryFindProject( + newProjectIdentifierOrNull.getDatabaseInstanceCode(), + newProjectIdentifierOrNull.getGroupCode(), + newProjectIdentifierOrNull.getProjectCode()); + if (project == null) + { + throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, + newProjectIdentifierOrNull); + } + experiment.setProject(project); + } + } + private void updateProperties(List<ExperimentProperty> properties) { final ArrayList<ExperimentPropertyPE> existingProperties = 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 74b3e7553db25891490e1497b50269707edb14ba..e9154b16db9a8d64a6f91b609576e64fa9041cc0 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 @@ -23,6 +23,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; /** * A generic experiment <i>Business Object</i>. @@ -64,5 +65,5 @@ public interface IExperimentBO extends IBusinessObject * Changes given experiment. Currently allowed changes: properties. */ public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties, - List<AttachmentPE> attachments); + List<AttachmentPE> attachments, ProjectIdentifier newProjectIdentifierOrNull); } 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 48f017687e4531761ae24bcb9ca777a76ad1864b..f98a3546fee312ae24b92432d5b9318068f46608 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 @@ -131,11 +131,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. @@ -149,11 +147,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. @@ -188,10 +184,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}. @@ -200,9 +196,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 @@ -212,9 +208,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. @@ -290,10 +286,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. @@ -360,7 +355,9 @@ public interface ICommonServer extends IServer public void editExperiment(String sessionToken, @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties, - List<AttachmentPE> attachments); + List<AttachmentPE> attachments, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier newProjectIdentifierOrNull); /** * Saves changed material. @@ -375,10 +372,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.USER) - public void editSample( - String sessionToken, - @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier, - List<SampleProperty> properties); + public void editSample(String sessionToken, + @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) + SampleIdentifier identifier, List<SampleProperty> properties); /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */ @Transactional diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java index 92991923c4cc1e1d5ccb1ebe84add7a335b297c7..64232ca286146e37a8221a7fa7de9ab8f0e3c274 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableExperiment.java @@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto; import java.util.Date; import java.util.List; - /** * @author Izabela Adamczyk */ @@ -27,11 +26,19 @@ public class EditableExperiment extends EditableEntity<ExperimentType, ExperimentTypePropertyType, ExperimentProperty> { + private final String project; + public EditableExperiment(List<ExperimentTypePropertyType> etpts, List<ExperimentProperty> properties, ExperimentType type, String identifier, Long id, - Date modificationDate) + Date modificationDate, String project) { super(EntityKind.EXPERIMENT, etpts, properties, type, identifier, id, modificationDate); + this.project = project; + } + + public String getProjectIdentifier() + { + return project; } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java index 7fd37eadc7caef5cd4fceac77d2f1b40ee492172..f66bff733724fad5126eaadd3dc4950a9976b02c 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java @@ -202,7 +202,7 @@ public class ExperimentPE implements IEntityPropertiesHolder<ExperimentPropertyP @ManyToOne(fetch = FetchType.EAGER) @NotNull(message = ValidationMessages.PROJECT_NOT_NULL_MESSAGE) - @JoinColumn(name = ColumnNames.PROJECT_COLUMN, updatable = false) + @JoinColumn(name = ColumnNames.PROJECT_COLUMN, updatable = true) @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_PROJECT) public ProjectPE getProject() { 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 45d09cd9f93a2d3d2a45199203f6456c507cf6e9..1ac2ea4d5e479454d817c246d001203b0e19b32a 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 @@ -32,6 +32,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs 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.InfoBoxCallbackListener; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ProjectSelectionWidget; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EditableExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentProperty; @@ -63,12 +65,20 @@ public final class GenericExperimentEditForm private Html attachmentsInfo; + private ProjectSelectionWidget projectChooser; + + private String originalProjectIdentifier; + public GenericExperimentEditForm(IViewContext<IGenericClientServiceAsync> viewContext, EditableExperiment entity, boolean editMode) { super(viewContext, entity, editMode); this.viewContext = viewContext; sessionKey = createSimpleId(EntityKind.EXPERIMENT, entity.getId() + ""); + originalProjectIdentifier = entity.getProjectIdentifier(); + projectChooser = + new ProjectSelectionWidget(viewContext, sessionKey, originalProjectIdentifier); + FieldUtil.markAsMandatory(projectChooser); attachmentManager = new AttachmentManager(sessionKey, DEFAULT_NUMBER_OF_ATTACHMENTS, "New Attachment"); addUploadFeatures(formPanel, sessionKey); @@ -115,8 +125,22 @@ public final class GenericExperimentEditForm private void save() { final List<ExperimentProperty> properties = extractProperties(); - viewContext.getCommonService().updateExperiment(sessionKey, entity.getIdentifier(), - properties, new RegisterExperimentCallback(viewContext)); + final String newProjectIdentifierOrNull = extractIdentifier(); + viewContext.getCommonService() + .updateExperiment(sessionKey, entity.getIdentifier(), properties, + newProjectIdentifierOrNull, new RegisterExperimentCallback(viewContext)); + } + + private String extractIdentifier() + { + final String newIdentifier = projectChooser.tryGetSelectedProject().getIdentifier(); + if (originalProjectIdentifier.equals(newIdentifier)) + { + return null; + } else + { + return newIdentifier; + } } @Override @@ -149,7 +173,7 @@ public final class GenericExperimentEditForm protected PropertiesEditor<ExperimentType, ExperimentTypePropertyType, ExperimentProperty> createPropertiesEditor( List<ExperimentTypePropertyType> entityTypesPropertyTypes, List<ExperimentProperty> properties, String id, - IViewContext<ICommonClientServiceAsync> context) + IViewContext<ICommonClientServiceAsync> context) { return new ExperimentPropertyEditor(entityTypesPropertyTypes, properties, id, context); } @@ -158,6 +182,7 @@ public final class GenericExperimentEditForm protected List<Field<?>> getEntitySpecificFormFields() { List<Field<?>> fields = new ArrayList<Field<?>>(); + fields.add(projectChooser); for (FileUploadField f : attachmentManager.getFields()) { fields.add(f); @@ -176,6 +201,7 @@ public final class GenericExperimentEditForm @Override protected void updateCheckPageWidgets() { + projectChooser.updateOriginalValue(); attachmentsInfo.setHtml(getAttachmentInfoText(attachmentManager.attachmentsDefined())); } 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 b61efa711ed9bfc0c9689820e587daea0fb8602a..674440954b13443e3e5b469fc66cd9ed656f35df 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 @@ -131,11 +131,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. @@ -149,11 +147,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. @@ -188,10 +184,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}. @@ -200,9 +196,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 @@ -212,9 +208,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. @@ -290,10 +286,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. @@ -360,7 +355,9 @@ public interface ICommonServer extends IServer public void editExperiment(String sessionToken, @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties, - List<AttachmentPE> attachments); + List<AttachmentPE> attachments, + @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class) + ProjectIdentifier newProjectIdentifierOrNull); /** * Saves changed material. @@ -375,10 +372,9 @@ public interface ICommonServer extends IServer */ @Transactional @RolesAllowed(RoleSet.USER) - public void editSample( - String sessionToken, - @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) SampleIdentifier identifier, - List<SampleProperty> properties); + public void editSample(String sessionToken, + @AuthorizationGuard(guardClass = SampleOwnerIdentifierPredicate.class) + SampleIdentifier identifier, List<SampleProperty> properties); /** Lists vocabulary terms of a given vocabulary. Includes terms usage statistics. */ @Transactional