From f2ad3c1a97a763c6593b9f37ffc2f1e1d5c86ed0 Mon Sep 17 00:00:00 2001
From: izabel <izabel>
Date: Tue, 17 Mar 2009 19:02:33 +0000
Subject: [PATCH] [LMS-780] allow to change project (2)

SVN: 10269
---
 .../web/client/ICommonClientService.java      |  2 +-
 .../ui/experiment/ExperimentBrowserGrid.java  |  3 ++-
 .../web/server/CommonClientService.java       |  3 +--
 .../openbis/generic/server/CommonServer.java  | 15 ++++++++++--
 .../server/business/bo/ExperimentBO.java      | 24 +++++++------------
 .../openbis/generic/shared/ICommonServer.java |  2 +-
 .../predicate/GroupIdentifierPredicate.java   |  4 ++--
 .../shared/basic/dto/EditableEntity.java      |  2 +-
 .../shared/basic/dto/EditableExperiment.java  | 15 +++++++++++-
 .../experiment/GenericExperimentEditForm.java | 18 +++++---------
 .../shared/ICommonServer.java.expected        |  2 +-
 11 files changed, 51 insertions(+), 39 deletions(-)

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 e8e8fb81878..4c1724d67c8 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
@@ -349,7 +349,7 @@ public interface ICommonClientService extends IClientService
      * Updates experiment.
      */
     public void updateExperiment(String attachmentSessionKey, final String experimentIdentifier,
-            List<ExperimentProperty> properties, String newProjectIdentifierOrNull)
+            List<ExperimentProperty> properties, String newProjectIdentifier)
             throws UserFailureException;
 
     /**
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 6b8d03f0331..54872c1bbad 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,8 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment,
     {
         return new EditableExperiment(selectedType.getExperimentTypePropertyTypes(), experiment
                 .getProperties(), selectedType, experiment.getIdentifier(), experiment.getId(),
-                experiment.getModificationDate(), experiment.getProject().getIdentifier());
+                experiment.getModificationDate(), experiment.getProject().getIdentifier(),
+                experiment.getCode());
     }
 
     @Override
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 55d9da4cddb..cd36cec780f 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
@@ -998,8 +998,7 @@ public final class CommonClientService extends AbstractClientService implements
             final ExperimentIdentifier identifier =
                     new ExperimentIdentifierFactory(experimentIdentifier).createIdentifier();
             final ProjectIdentifier project =
-                    newProjectIdentifier == null ? null : new ProjectIdentifierFactory(
-                            newProjectIdentifier).createIdentifier();
+                    new ProjectIdentifierFactory(newProjectIdentifier).createIdentifier();
             commonServer.editExperiment(sessionToken, identifier, properties, attachments, project);
         } catch (final UserFailureException 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 520b9e258a2..8fbfc5f9d77 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
@@ -643,11 +643,22 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
 
     public void editExperiment(String sessionToken, ExperimentIdentifier identifier,
             List<ExperimentProperty> properties, List<AttachmentPE> attachments,
-            ProjectIdentifier newProjectIdentifierOrNull)
+            ProjectIdentifier newProjectIdentifier)
     {
         final Session session = getSessionManager().getSession(sessionToken);
+        if (newProjectIdentifier.equals(identifier) == false)
+        {
+            final IExternalDataTable externalDataTable =
+                    businessObjectFactory.createExternalDataTable(session);
+            externalDataTable.loadByExperimentIdentifier(identifier);
+            if (externalDataTable.getExternalData().size() > 0)
+            {
+                throw new UserFailureException(
+                        "Changing the project of experiment containing data sets is not allowed.");
+            }
+        }
         final IExperimentBO experimentBO = businessObjectFactory.createExperimentBO(session);
-        experimentBO.edit(identifier, properties, attachments, newProjectIdentifierOrNull);
+        experimentBO.edit(identifier, properties, attachments, newProjectIdentifier);
         experimentBO.save();
     }
 
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 e61ff86b096..6a131248e6d 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
@@ -292,11 +292,11 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
     }
 
     public void edit(ExperimentIdentifier identifier, List<ExperimentProperty> properties,
-            List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifierOrNull)
+            List<AttachmentPE> newAttachments, ProjectIdentifier newProjectIdentifier)
     {
         loadByExperimentIdentifier(identifier);
         updateProperties(properties);
-        updateProject(newProjectIdentifierOrNull);
+        updateProject(newProjectIdentifier);
         for (AttachmentPE a : newAttachments)
         {
             addAttachment(a);
@@ -304,22 +304,16 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
         dataChanged = true;
     }
 
-    private void updateProject(ProjectIdentifier newProjectIdentifierOrNull)
+    private void updateProject(ProjectIdentifier newProjectIdentifier)
     {
-        if (newProjectIdentifierOrNull != null)
+        ProjectPE project =
+                getProjectDAO().tryFindProject(newProjectIdentifier.getDatabaseInstanceCode(),
+                        newProjectIdentifier.getGroupCode(), newProjectIdentifier.getProjectCode());
+        if (project == 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);
+            throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, newProjectIdentifier);
         }
+        experiment.setProject(project);
     }
 
     private void updateProperties(List<ExperimentProperty> properties)
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 f98a3546fee..ed44d92b581 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
@@ -357,7 +357,7 @@ public interface ICommonServer extends IServer
             ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties,
             List<AttachmentPE> attachments,
             @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
-            ProjectIdentifier newProjectIdentifierOrNull);
+            ProjectIdentifier newProjectIdentifier);
 
     /**
      * Saves changed material.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/GroupIdentifierPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/GroupIdentifierPredicate.java
index 6ac21c6c110..89b88646fd6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/GroupIdentifierPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/GroupIdentifierPredicate.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.GroupCodeHelper;
  * 
  * @author Christian Ribeaud
  */
-public final class GroupIdentifierPredicate extends AbstractGroupPredicate<GroupIdentifier>
+public class GroupIdentifierPredicate extends AbstractGroupPredicate<GroupIdentifier>
 {
     public GroupIdentifierPredicate()
     {
@@ -47,7 +47,7 @@ public final class GroupIdentifierPredicate extends AbstractGroupPredicate<Group
     }
 
     @Override
-    final Status doEvaluation(final PersonPE person, final List<RoleWithIdentifier> allowedRoles,
+    Status doEvaluation(final PersonPE person, final List<RoleWithIdentifier> allowedRoles,
             final GroupIdentifier groupIdentifier)
     {
         assert inited : "Predicate has not been initialized";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableEntity.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableEntity.java
index 64b1bf6a329..c72b1ad356e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableEntity.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/EditableEntity.java
@@ -34,7 +34,7 @@ public class EditableEntity<T extends EntityType, S extends EntityTypePropertyTy
 
     private final T type;
 
-    private final String identifier;
+    protected String identifier;
 
     private final Long id;
 
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 64232ca2861..5e258c5ae43 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
@@ -28,12 +28,15 @@ public class EditableExperiment extends
 
     private final String project;
 
+    private String code;
+
     public EditableExperiment(List<ExperimentTypePropertyType> etpts,
             List<ExperimentProperty> properties, ExperimentType type, String identifier, Long id,
-            Date modificationDate, String project)
+            Date modificationDate, String project, String code)
     {
         super(EntityKind.EXPERIMENT, etpts, properties, type, identifier, id, modificationDate);
         this.project = project;
+        this.code = code;
     }
 
     public String getProjectIdentifier()
@@ -41,4 +44,14 @@ public class EditableExperiment extends
         return project;
     }
 
+    public void setIdentifier(String identifier)
+    {
+        this.identifier = identifier;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
 }
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 1ac2ea4d5e4..e97ddcbef32 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
@@ -125,22 +125,14 @@ public final class GenericExperimentEditForm
     private void save()
     {
         final List<ExperimentProperty> properties = extractProperties();
-        final String newProjectIdentifierOrNull = extractIdentifier();
-        viewContext.getCommonService()
-                .updateExperiment(sessionKey, entity.getIdentifier(), properties,
-                        newProjectIdentifierOrNull, new RegisterExperimentCallback(viewContext));
+        final String newProjectIdentifier = extractIdentifier();
+        viewContext.getCommonService().updateExperiment(sessionKey, entity.getIdentifier(),
+                properties, newProjectIdentifier, new RegisterExperimentCallback(viewContext));
     }
 
     private String extractIdentifier()
     {
-        final String newIdentifier = projectChooser.tryGetSelectedProject().getIdentifier();
-        if (originalProjectIdentifier.equals(newIdentifier))
-        {
-            return null;
-        } else
-        {
-            return newIdentifier;
-        }
+        return projectChooser.tryGetSelectedProject().getIdentifier();
     }
 
     @Override
@@ -202,6 +194,8 @@ public final class GenericExperimentEditForm
     protected void updateCheckPageWidgets()
     {
         projectChooser.updateOriginalValue();
+        originalProjectIdentifier = projectChooser.tryGetSelectedProject().getIdentifier();
+        entity.setIdentifier(originalProjectIdentifier + "/" + entity.getCode());
         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 674440954b1..01ec154a004 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
@@ -357,7 +357,7 @@ public interface ICommonServer extends IServer
             ExperimentIdentifier experimentIdentifier, List<ExperimentProperty> properties,
             List<AttachmentPE> attachments,
             @AuthorizationGuard(guardClass = GroupIdentifierPredicate.class)
-            ProjectIdentifier newProjectIdentifierOrNull);
+            ProjectIdentifier newProjectIdentifier);
 
     /**
      * Saves changed material.
-- 
GitLab