From d04e374de31b1db689215cda7d211b6373287db1 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 9 Aug 2010 13:04:47 +0000
Subject: [PATCH] [LMS-1676] changes in new sample (only for single sample
 registration and update)

SVN: 17370
---
 .../client/web/client/dto/SampleUpdates.java  |  7 +--
 .../openbis/generic/server/ETLService.java    |  7 +--
 .../bo/AbstractSampleBusinessObject.java      | 29 ++++++++++--
 .../shared/basic/dto/BasicSampleUpdates.java  |  5 ++-
 .../generic/shared/basic/dto/NewSample.java   | 44 ++++++++++++++++---
 .../shared/basic/dto/UpdatedSample.java       |  7 ++-
 .../shared/dto/SampleBatchUpdatesDTO.java     |  2 +-
 .../generic/shared/dto/SampleUpdatesDTO.java  |  7 +--
 ...AbstractGenericSampleRegisterEditForm.java |  2 +-
 .../sample/GenericSampleEditForm.java         |  8 ++--
 .../sample/GenericSampleRegistrationForm.java | 19 ++++++--
 .../web/server/GenericClientService.java      |  3 +-
 .../server/business/bo/SampleBOTest.java      | 20 ++++-----
 .../predicate/NewSamplePredicateTest.java     | 15 ++++---
 .../NewSamplesWithTypePredicateTest.java      | 15 ++++---
 .../generic/server/GenericServerTest.java     |  2 +-
 .../dss/bundle/BundleDataSetHelperRpc.java    |  4 +-
 .../DataSetInfoExtractorForMSInjection.java   | 21 ++++++---
 18 files changed, 153 insertions(+), 64 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleUpdates.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleUpdates.java
index de8b59062b2..eb92858099f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleUpdates.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/SampleUpdates.java
@@ -56,10 +56,11 @@ public class SampleUpdates extends BasicSampleUpdates
 
     public SampleUpdates(String sessionKey, TechId sampleId, List<IEntityProperty> properties,
             List<NewAttachment> attachments, ExperimentIdentifier experimentIdentifierOrNull,
-            Date version, String sampleIdentifier, String parentIdentifierOrNull,
-            String containerIdentifierOrNull)
+            Date version, String sampleIdentifier, String containerIdentifierOrNull,
+            String parentIdentifierOrNull, String[] parents)
     {
-        super(sampleId, properties, version, parentIdentifierOrNull, containerIdentifierOrNull);
+        super(sampleId, properties, version, containerIdentifierOrNull, parentIdentifierOrNull,
+                parents);
         this.sessionKey = sessionKey;
         this.attachments = attachments;
         this.experimentIdentifierOrNull = experimentIdentifierOrNull;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index e88a045cd55..3ca33f98281 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -601,7 +601,8 @@ public class ETLService extends AbstractCommonServer<IETLService> implements IET
     {
         Session session = getSession(sessionToken);
         IExternalDataDAO externalDataDAO = getDAOFactory().getExternalDataDAO();
-        ExternalDataPE dataSet = externalDataDAO.tryToFindFullDataSetByCode(dataSetCode, false, false);
+        ExternalDataPE dataSet =
+                externalDataDAO.tryToFindFullDataSetByCode(dataSetCode, false, false);
         if (dataSet != null)
         {
             DataSetTypePE dataSetType = dataSet.getDataSetType();
@@ -768,8 +769,8 @@ public class ETLService extends AbstractCommonServer<IETLService> implements IET
             String groupPrefix =
                     container.getGroup() != null ? ("/" + container.getGroup().getCode() + "/")
                             : "/";
-            newSamples.add(new NewSample(groupPrefix + code, SampleTypeTranslator.translate(
-                    sampleTypePE, null), null, container.getIdentifier()));
+            newSamples.add(NewSample.createWithParent(groupPrefix + code, SampleTypeTranslator
+                    .translate(sampleTypePE, null), null, container.getIdentifier()));
         }
         getSampleTypeSlaveServerPlugin(sampleTypePE).registerSamples(session, newSamples);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
index f7f40c9d9d7..d2797f354d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -45,6 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 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.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
@@ -130,7 +132,23 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
         samplePE.setDatabaseInstance(sampleOwner.tryGetDatabaseInstance());
         defineSampleProperties(samplePE, newSample.getProperties());
         String parentIdentifier = newSample.getParentIdentifier();
-        setGeneratedFrom(sampleIdentifier, samplePE, parentIdentifier);
+        if (parentIdentifier != null)
+        {
+            setGeneratedFrom(sampleIdentifier, samplePE, parentIdentifier);
+        } else if (newSample.getParents() != null)
+        {
+            final String[] parents = newSample.getParents();
+            final List<SampleIdentifier> parentIdentifiers =
+                    IdentifierHelper.extractSampleIdentifiers(parents);
+            if (sampleIdentifier.isSpaceLevel())
+            {
+                final String spaceCode = sampleIdentifier.getSpaceLevel().getSpaceCode();
+                for (SampleIdentifier si : parentIdentifiers)
+                {
+                    IdentifierHelper.fillAndCheckGroup(si, spaceCode);
+                }
+            }
+        }
         String containerIdentifier = newSample.getContainerIdentifier();
         setContainer(sampleIdentifier, samplePE, containerIdentifier);
         samplePE.setPermId(getPermIdDAO().createPermId());
@@ -214,14 +232,19 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
 
     private void removeParents(SamplePE child)
     {
+        List<SampleRelationshipPE> parents = new ArrayList<SampleRelationshipPE>();
         for (SampleRelationshipPE r : child.getParentRelationships())
         {
             if (r.getRelationship().getCode().equals(
                     BasicConstant.PARENT_CHILD_INTERNAL_RELATIONSHIP))
             {
-                child.removeParentRelationship(r);
+                parents.add(r);
             }
         }
+        for (SampleRelationshipPE r : parents)
+        {
+            child.removeParentRelationship(r);
+        }
     }
 
     // ineffective for adding a collection of parents
@@ -244,7 +267,7 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi
             RelationshipTypePE relationshipType)
     {
         final SampleRelationshipPE relationship =
-                new SampleRelationshipPE(child, parent, relationshipType);
+                new SampleRelationshipPE(parent, child, relationshipType);
         child.addParentRelationship(relationship);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicSampleUpdates.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicSampleUpdates.java
index 84552fab3aa..4fff987b9ab 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicSampleUpdates.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/BasicSampleUpdates.java
@@ -76,13 +76,14 @@ public class BasicSampleUpdates implements IsSerializable, Serializable
     }
 
     public BasicSampleUpdates(TechId sampleId, List<IEntityProperty> properties, Date version,
-            String parentIdentifierOrNull, String containerIdentifierOrNull)
+            String containerIdentifierOrNull, String parentIdentifierOrNull, String[] parents)
     {
         this.sampleIdOrNull = sampleId;
         this.properties = properties;
         this.version = version;
-        this.parentIdentifierOrNull = parentIdentifierOrNull;
         this.containerIdentifierOrNull = containerIdentifierOrNull;
+        this.parentIdentifierOrNull = parentIdentifierOrNull;
+        this.modifiedParentCodesOrNull = parents;
     }
 
     public TechId getSampleIdOrNull()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java
index 12d7cabf22c..4fd95b58100 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/NewSample.java
@@ -46,8 +46,14 @@ public class NewSample extends Identifier<NewSample> implements Comparable<NewSa
     /**
      * The parent identifier.
      */
+    // TODO 2010-08-09, Piotr Buczek: remove
     private String parentIdentifier;
 
+    // Set of parent sample codes or identifiers. It will be assumed that
+    // all the samples belong to the same group as the child sample.
+    // If equals to null then parentIdentifier should be used.
+    private String[] parentsOrNull;
+
     /**
      * The container identifier.
      */
@@ -66,20 +72,36 @@ public class NewSample extends Identifier<NewSample> implements Comparable<NewSa
     {
     }
 
-    public NewSample(final String identifier, final SampleType sampleType,
-            final String parentIdentifier, final String containerIdentifier)
+    private NewSample(final String identifier, final SampleType sampleType,
+            final String containerIdentifier)
     {
         setIdentifier(identifier);
         setSampleType(sampleType);
-        setParentIdentifier(parentIdentifier);
         setContainerIdentifier(containerIdentifier);
     }
 
-    public NewSample(final String identifier, SampleType sampleType, String parentIdentifier,
-            String containerIdentifier, String experimentIdentifier, IEntityProperty[] properties,
+    public static NewSample createWithParent(final String identifier, final SampleType sampleType,
+            final String containerIdentifier, final String parentIdentifier)
+    {
+        NewSample result = new NewSample(identifier, sampleType, containerIdentifier);
+        result.setParentIdentifier(parentIdentifier);
+        return result;
+    }
+
+    public static NewSample createWithParents(final String identifier, final SampleType sampleType,
+            final String containerIdentifier, final String[] parents)
+    {
+        NewSample result = new NewSample(identifier, sampleType, containerIdentifier);
+        result.setParents(parents);
+        return result;
+    }
+
+    public NewSample(final String identifier, SampleType sampleType, String containerIdentifier,
+            String parentIdentifier, String experimentIdentifier, IEntityProperty[] properties,
             List<NewAttachment> attachments)
     {
-        this(identifier, sampleType, parentIdentifier, containerIdentifier);
+        this(identifier, sampleType, containerIdentifier);
+        this.parentIdentifier = parentIdentifier;
         this.experimentIdentifier = experimentIdentifier;
         this.properties = properties;
         this.attachments = attachments;
@@ -105,6 +127,16 @@ public class NewSample extends Identifier<NewSample> implements Comparable<NewSa
         this.sampleType = sampleType;
     }
 
+    public String[] getParents()
+    {
+        return parentsOrNull;
+    }
+
+    public void setParents(String[] parents)
+    {
+        this.parentsOrNull = parents;
+    }
+
     public final String getParentIdentifier()
     {
         return parentIdentifier;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UpdatedSample.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UpdatedSample.java
index 7a2686fda1c..e1cfb3838d2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UpdatedSample.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/UpdatedSample.java
@@ -39,10 +39,9 @@ public final class UpdatedSample extends NewSample
 
     public UpdatedSample(NewSample newSample, SampleBatchUpdateDetails batchUpdateDetails)
     {
-        super(newSample.getIdentifier(), newSample.getSampleType(),
-                newSample.getParentIdentifier(), newSample.getContainerIdentifier(), newSample
-                        .getExperimentIdentifier(), newSample.getProperties(), newSample
-                        .getAttachments());
+        super(newSample.getIdentifier(), newSample.getSampleType(), newSample
+                .getContainerIdentifier(), newSample.getParentIdentifier(), newSample
+                .getExperimentIdentifier(), newSample.getProperties(), newSample.getAttachments());
         this.batchUpdateDetails = batchUpdateDetails;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleBatchUpdatesDTO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleBatchUpdatesDTO.java
index 33e78a97898..f366c194ba2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleBatchUpdatesDTO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleBatchUpdatesDTO.java
@@ -41,7 +41,7 @@ public class SampleBatchUpdatesDTO extends SampleUpdatesDTO
             String containerIdentifierOrNull, SampleBatchUpdateDetails details)
     {
         super(null, properties, experimentIdentifierOrNull, null, null, sampleIdentifier,
-                parentIdentifierOrNull, containerIdentifierOrNull);
+                containerIdentifierOrNull, parentIdentifierOrNull, null);
         this.oldSampleIdentifierOrNull = oldSampleIdentifier;
         this.details = details;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleUpdatesDTO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleUpdatesDTO.java
index 0a82f0e2d99..1c0d740fe4b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleUpdatesDTO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleUpdatesDTO.java
@@ -43,10 +43,11 @@ public class SampleUpdatesDTO extends BasicSampleUpdates
 
     public SampleUpdatesDTO(TechId sampleId, List<IEntityProperty> properties,
             ExperimentIdentifier experimentIdentifierOrNull, Collection<NewAttachment> attachments,
-            Date version, SampleIdentifier sampleIdentifier, String parentIdentifierOrNull,
-            String containerIdentifierOrNull)
+            Date version, SampleIdentifier sampleIdentifier, String containerIdentifierOrNull,
+            String parentIdentifierOrNull, String[] parentsOrNull)
     {
-        super(sampleId, properties, version, parentIdentifierOrNull, containerIdentifierOrNull);
+        super(sampleId, properties, version, containerIdentifierOrNull, parentIdentifierOrNull,
+                parentsOrNull);
         this.experimentIdentifierOrNull = experimentIdentifierOrNull;
         this.attachments = attachments;
         this.sampleIdentifier = sampleIdentifier;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
index 3a1504a4ad5..e7ab575cc8e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
@@ -270,7 +270,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
         return sampleType.getCode();
     }
 
-    protected String[] getSamples()
+    protected String[] getParents()
     {
         return parentsArea.tryGetSampleCodes();
     }
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 dc62f5740f3..11cf3cf3143 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
@@ -64,13 +64,15 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
     {
         final List<IEntityProperty> properties = extractProperties();
         final List<NewAttachment> attachments = attachmentsManager.extractAttachments();
-        ExperimentIdentifier experimentIdent =
+        final ExperimentIdentifier experimentIdent =
                 experimentField != null ? experimentField.tryToGetValue() : null;
+        final String containerOrNull = StringUtils.trimToNull(container.getValue());
+        final String parentOrNull = StringUtils.trimToNull(parent.getValue());
+        final String[] parents = getParents();
         viewContext.getService().updateSample(
                 new SampleUpdates(attachmentsSessionKey, techIdOrNull, properties, attachments,
                         experimentIdent, originalSample.getModificationDate(),
-                        createSampleIdentifier(), StringUtils.trimToNull(parent.getValue()),
-                        StringUtils.trimToNull(container.getValue())),
+                        createSampleIdentifier(), containerOrNull, parentOrNull, parents),
                 new UpdateSampleCallback(viewContext));
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
index 97d9f97694e..29549e423d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationForm.java
@@ -97,9 +97,22 @@ public final class GenericSampleRegistrationForm extends AbstractGenericSampleRe
                 (experimentField != null && experimentField.tryToGetValue() != null) ? experimentField
                         .tryToGetValue().getIdentifier()
                         : null;
-        final NewSample newSample =
-                new NewSample(createSampleIdentifier(), sampleType, StringUtils.trimToNull(parent
-                        .getValue()), StringUtils.trimToNull(container.getValue()));
+
+        final String containerOrNull = StringUtils.trimToNull(container.getValue());
+        final String parentOrNull = StringUtils.trimToNull(parent.getValue());
+        final NewSample newSample;
+        if (parentOrNull == null)
+        {
+            final String[] parents = getParents();
+            newSample =
+                    NewSample.createWithParents(createSampleIdentifier(), sampleType,
+                            containerOrNull, parents);
+        } else
+        {
+            newSample =
+                    NewSample.createWithParent(createSampleIdentifier(), sampleType,
+                            containerOrNull, parentOrNull);
+        }
         final List<IEntityProperty> properties = extractProperties();
         newSample.setProperties(properties.toArray(IEntityProperty.EMPTY_ARRAY));
         newSample.setAttachments(attachmentsManager.extractAttachments());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index 7ccdaa4edc3..5ac80ef2c05 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -350,8 +350,9 @@ public class GenericClientService extends AbstractClientService implements IGene
                                     .getSampleIdOrNull(), updates.getProperties(),
                                     convExperimentIdentifierOrNull, attachments, updates
                                             .getVersion(), sampleOwner, updates
+                                            .getContainerIdentifierOrNull(), updates
                                             .getParentIdentifierOrNull(), updates
-                                            .getContainerIdentifierOrNull()));
+                                            .getModifiedParentCodesOrNull()));
                     result.copyFrom(updateResult);
                 }
             }.process(updates.getSessionKey(), getHttpSession(), updates.getAttachments());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
index 5590b9218f5..9561416b7bf 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBOTest.java
@@ -409,7 +409,7 @@ public final class SampleBOTest extends AbstractBOTest
             });
         createSampleBO().update(
                 new SampleUpdatesDTO(SAMPLE_TECH_ID, null, experimentIdentifier, Collections
-                        .<NewAttachment> emptyList(), now, null, null, null));
+                        .<NewAttachment> emptyList(), now, null, null, null, null));
 
         assertEquals(experimentToAttach, sample.getExperiment());
         context.assertIsSatisfied();
@@ -445,7 +445,7 @@ public final class SampleBOTest extends AbstractBOTest
         createSampleBO().update(
                 new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections
                         .<NewAttachment> emptyList(), now, SampleIdentifierFactory
-                        .parse(newSampleIdentifierWithoutDb), null, null));
+                        .parse(newSampleIdentifierWithoutDb), null, null, null));
         String newSampleIdentWithDb =
                 EXAMPLE_DATABASE_INSTANCE.getCode() + ":" + newSampleIdentifierWithoutDb;
         assertEquals(newSampleIdentWithDb, sample.getSampleIdentifier().toString());
@@ -505,7 +505,7 @@ public final class SampleBOTest extends AbstractBOTest
         assertNull(sample.getGeneratedFrom());
         createSampleBO().update(
                 new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections
-                        .<NewAttachment> emptyList(), now, null, parent.getSampleIdentifier()
+                        .<NewAttachment> emptyList(), now, null, null, parent.getSampleIdentifier()
                         .toString(), null));
         SamplePE newParent = sample.getGeneratedFrom();
         assertNotNull(newParent);
@@ -557,8 +557,8 @@ public final class SampleBOTest extends AbstractBOTest
         assertNull(sample.getContainer());
         createSampleBO().update(
                 new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections
-                        .<NewAttachment> emptyList(), now, null, null, container
-                        .getSampleIdentifier().toString()));
+                        .<NewAttachment> emptyList(), now, null, container.getSampleIdentifier()
+                        .toString(), null, null));
         assertNotNull(sample.getContainer());
         assertEquals(container, sample.getContainer());
         context.assertIsSatisfied();
@@ -611,8 +611,8 @@ public final class SampleBOTest extends AbstractBOTest
         assertNull(sample.getContainer());
         SampleBO bo = createSampleBO();
         bo.update(new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections
-                .<NewAttachment> emptyList(), now, null, null, container.getSampleIdentifier()
-                .toString()));
+                .<NewAttachment> emptyList(), now, null,
+                container.getSampleIdentifier().toString(), null, null));
         bo.save();
         context.assertIsSatisfied();
     }
@@ -643,7 +643,7 @@ public final class SampleBOTest extends AbstractBOTest
         {
             createSampleBO().update(
                     new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections
-                            .<NewAttachment> emptyList(), now, null, null, null));
+                            .<NewAttachment> emptyList(), now, null, null, null, null));
         } catch (UserFailureException ex)
         {
             exceptionThrown = true;
@@ -671,7 +671,7 @@ public final class SampleBOTest extends AbstractBOTest
         {
             SampleUpdatesDTO updates =
                     new SampleUpdatesDTO(SAMPLE_TECH_ID, null, null, Collections
-                            .<NewAttachment> emptyList(), now, null, null, null);
+                            .<NewAttachment> emptyList(), now, null, null, null, null);
             createSampleBO().update(updates);
         } catch (UserFailureException e)
         {
@@ -993,6 +993,6 @@ public final class SampleBOTest extends AbstractBOTest
         createSampleBO().update(
                 new SampleUpdatesDTO(sampleId, null, experimentIdentifier, Collections
                         .<NewAttachment> emptyList(), sample.getModificationDate(), null, null,
-                        null));
+                        null, null));
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplePredicateTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplePredicateTest.java
index eca0a008ca2..808855c9bf1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplePredicateTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplePredicateTest.java
@@ -43,7 +43,8 @@ public class NewSamplePredicateTest extends AuthorizationTestCase
         SampleIdentifier sampleIdentifier =
                 new SampleIdentifier(new DatabaseInstanceIdentifier(ANOTHER_INSTANCE_CODE), "s1");
         NewSample sample =
-                new NewSample(sampleIdentifier.toString(), sampleType, "parent", "container");
+                NewSample.createWithParent(sampleIdentifier.toString(), sampleType, "parent",
+                        "container");
         prepareProvider(ANOTHER_INSTANCE_CODE, createAnotherDatabaseInstance(), createGroups());
         predicate.init(provider);
 
@@ -61,7 +62,8 @@ public class NewSamplePredicateTest extends AuthorizationTestCase
         SampleIdentifier sampleIdentifier =
                 new SampleIdentifier(new DatabaseInstanceIdentifier(INSTANCE_CODE), "s1");
         NewSample sample =
-                new NewSample(sampleIdentifier.toString(), sampleType, "parent", "container");
+                NewSample.createWithParent(sampleIdentifier.toString(), sampleType, "parent",
+                        "container");
         prepareProvider(INSTANCE_CODE, createDatabaseInstance(), createGroups());
         predicate.init(provider);
 
@@ -81,7 +83,8 @@ public class NewSamplePredicateTest extends AuthorizationTestCase
         SampleIdentifier sampleIdentifier =
                 new SampleIdentifier(new GroupIdentifier(INSTANCE_CODE, SPACE_CODE), "s1");
         NewSample sample =
-                new NewSample(sampleIdentifier.toString(), sampleType, "parent", "container");
+                NewSample.createWithParent(sampleIdentifier.toString(), sampleType, "parent",
+                        "container");
         prepareProvider(INSTANCE_CODE, createDatabaseInstance(), createGroups());
         predicate.init(provider);
 
@@ -99,7 +102,8 @@ public class NewSamplePredicateTest extends AuthorizationTestCase
         GroupIdentifier groupIdentifier = new GroupIdentifier(INSTANCE_CODE, ANOTHER_GROUP_CODE);
         SampleIdentifier sampleIdentifier = new SampleIdentifier(groupIdentifier, "s1");
         NewSample sample =
-                new NewSample(sampleIdentifier.toString(), sampleType, "parent", "container");
+                NewSample.createWithParent(sampleIdentifier.toString(), sampleType, "parent",
+                        "container");
         List<GroupPE> groups = Arrays.asList(createGroup(groupIdentifier));
         prepareProvider(INSTANCE_CODE, createDatabaseInstance(), groups);
         predicate.init(provider);
@@ -107,7 +111,8 @@ public class NewSamplePredicateTest extends AuthorizationTestCase
         Status status = predicate.evaluate(createPerson(), createRoles(false), sample);
 
         assertEquals(true, status.isError());
-        assertEquals("User 'megapixel' does not have enough privileges.", status.tryGetErrorMessage());
+        assertEquals("User 'megapixel' does not have enough privileges.", status
+                .tryGetErrorMessage());
         context.assertIsSatisfied();
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplesWithTypePredicateTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplesWithTypePredicateTest.java
index 18d60a6fb3b..55c47a9d3b7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplesWithTypePredicateTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/predicate/NewSamplesWithTypePredicateTest.java
@@ -88,8 +88,9 @@ public class NewSamplesWithTypePredicateTest extends AuthorizationTestCase
         predicate.init(provider);
         Status status =
                 predicate.evaluate(person, roles, new NewSamplesWithTypes(new SampleType(), Arrays
-                        .asList(new NewSample(sampleIdentifier1.toString(), null, null, null),
-                                new NewSample(sampleIdentifier2.toString(), null, null, null))));
+                        .asList(NewSample.createWithParent(sampleIdentifier1.toString(), null,
+                                null, null), NewSample.createWithParent(sampleIdentifier2
+                                .toString(), null, null, null))));
         assertEquals(false, status.isError());
         context.assertIsSatisfied();
     }
@@ -116,8 +117,9 @@ public class NewSamplesWithTypePredicateTest extends AuthorizationTestCase
         predicate.init(provider);
         Status status =
                 predicate.evaluate(person, roles, new NewSamplesWithTypes(new SampleType(), Arrays
-                        .asList(new NewSample(sampleIdentifier1.toString(), null, null, null),
-                                new NewSample(sampleIdentifier2.toString(), null, null, null))));
+                        .asList(NewSample.createWithParent(sampleIdentifier1.toString(), null,
+                                null, null), NewSample.createWithParent(sampleIdentifier2
+                                .toString(), null, null, null))));
         assertEquals(true, status.isError());
         context.assertIsSatisfied();
     }
@@ -146,8 +148,9 @@ public class NewSamplesWithTypePredicateTest extends AuthorizationTestCase
         predicate.init(provider);
         Status status =
                 predicate.evaluate(person, roles, new NewSamplesWithTypes(new SampleType(), Arrays
-                        .asList(new NewSample(sampleIdentifier1.toString(), null, null, null),
-                                new NewSample(sampleIdentifier2.toString(), null, null, null))));
+                        .asList(NewSample.createWithParent(sampleIdentifier1.toString(), null,
+                                null, null), NewSample.createWithParent(sampleIdentifier2
+                                .toString(), null, null, null))));
         assertEquals(true, status.isError());
         context.assertIsSatisfied();
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
index dc0ffee8f85..6e11b24efa1 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
@@ -437,7 +437,7 @@ public final class GenericServerTest extends AbstractServerTestCase
         sample.setModificationDate(newModificationDate);
         final SampleUpdatesDTO updates =
                 new SampleUpdatesDTO(sampleId, properties, null, attachments, version, null, null,
-                        null);
+                        null, null);
         context.checking(new Expectations()
             {
                 {
diff --git a/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/BundleDataSetHelperRpc.java b/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/BundleDataSetHelperRpc.java
index 67a81ba60c3..9223893e704 100644
--- a/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/BundleDataSetHelperRpc.java
+++ b/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/BundleDataSetHelperRpc.java
@@ -130,7 +130,7 @@ class BundleDataSetHelperRpc extends BundleDataSetHelper
             Sample parentSample = getOpenbisService().tryGetSampleWithExperiment(parentIdOrNull);
             sampleId = new SampleIdentifier(parentIdOrNull.getSpaceLevel(), sampleCode);
             sample =
-                    new NewSample(sampleId.toString(), replicaSampleType,
+                    NewSample.createWithParent(sampleId.toString(), replicaSampleType,
                             parentIdOrNull.toString(), null);
             sample.setExperimentIdentifier(parentSample.getExperiment().getIdentifier());
         } else if (experimentIdOrNull != null)
@@ -140,7 +140,7 @@ class BundleDataSetHelperRpc extends BundleDataSetHelper
                     new SpaceIdentifier(experimentIdOrNull.getDatabaseInstanceCode(),
                             experimentIdOrNull.getSpaceCode());
             sampleId = new SampleIdentifier(spaceId, sampleCode);
-            sample = new NewSample(sampleId.toString(), replicaSampleType, null, null);
+            sample = NewSample.createWithParent(sampleId.toString(), replicaSampleType, null, null);
             sample.setExperimentIdentifier(experimentIdOrNull.toString());
         }
 
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java
index 873097a3060..9200822ad05 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java
@@ -56,22 +56,27 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 public class DataSetInfoExtractorForMSInjection extends AbstractDataSetInfoExtractorWithService
 {
     static final String MS_INJECTION_PROPERTIES_FILE = "ms-injection.properties";
+
     static final String DATA_SET_PROPERTIES_FILE = "data-set.properties";
 
     static final String PROJECT_CODE_KEY = "PROJECT_CODE";
+
     static final String EXPERIMENT_CODE_KEY = "EXPERIMENT_CODE";
+
     static final String SAMPLE_CODE_KEY = "SAMPLE_CODE";
+
     static final String USER_KEY = "USER";
-    
+
     static final String DATA_SET_TYPE_KEY = "DATA_SET_TYPE";
+
     static final String FILE_TYPE_KEY = "FILE_TYPE";
+
     static final String PARENT_TYPE_KEY = "PARENT_TYPE";
-    
+
     static final String EXPERIMENT_TYPE_CODE = "MS_INJECT";
 
     static final String SAMPLE_TYPE_CODE = "MS_INJECTION";
 
-
     public DataSetInfoExtractorForMSInjection(Properties properties)
     {
         this(ServiceProvider.getOpenBISService());
@@ -95,11 +100,13 @@ public class DataSetInfoExtractorForMSInjection extends AbstractDataSetInfoExtra
         ExperimentIdentifier experimentIdentifier = getExperimentIdentifier(sampleProperties);
         getOrCreateExperiment(experimentIdentifier);
         info.setExperimentIdentifier(experimentIdentifier);
-        long sampleID = registerOrUpdateSample(sampleIdentifier, experimentIdentifier, sampleProperties);
-        
+        long sampleID =
+                registerOrUpdateSample(sampleIdentifier, experimentIdentifier, sampleProperties);
+
         Properties dataSetProperties =
                 Util.loadPropertiesFile(incomingDataSetPath, DATA_SET_PROPERTIES_FILE);
-        String dataSetTypeCode = PropertyUtils.getMandatoryProperty(dataSetProperties, DATA_SET_TYPE_KEY);
+        String dataSetTypeCode =
+                PropertyUtils.getMandatoryProperty(dataSetProperties, DATA_SET_TYPE_KEY);
         String parentTypeOrNull = dataSetProperties.getProperty(PARENT_TYPE_KEY);
         dataSetProperties.remove(DATA_SET_TYPE_KEY);
         dataSetProperties.remove(FILE_TYPE_KEY);
@@ -150,7 +157,7 @@ public class DataSetInfoExtractorForMSInjection extends AbstractDataSetInfoExtra
             Set<NewAttachment> emptySet = Collections.<NewAttachment> emptySet();
             Date version = sample.getModificationDate();
             service.updateSample(new SampleUpdatesDTO(sampleID, propertiesList,
-                    experimentIdentifier, emptySet, version, sampleIdentifier, null, null));
+                    experimentIdentifier, emptySet, version, sampleIdentifier, null, null, null));
             return sample.getId();
         }
     }
-- 
GitLab