From 5975ddc70d5bc1ccf0ff6e292cea4f731d275b99 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Wed, 12 Dec 2012 15:41:11 +0000
Subject: [PATCH] SP-435 / BIS-219: Make entity retrieval API for validation
 complete - without parents and children yet as they are not in the Lucene
 index

SVN: 27924
---
 .../calculator/AbstractEntityAdaptor.java     |   2 +
 .../calculator/ExperimentAdaptor.java         |   4 +-
 .../calculator/ExternalDataAdaptor.java       |  53 +++--
 .../calculator/SampleAdaptor.java             |  58 ++++--
 .../calculator/api/IDataAdaptor.java          |  30 ++-
 .../calculator/api/ISampleAdaptor.java        |  37 +++-
 .../systemtest/server/CommonServerTest.java   | 196 ++++++++++++++++++
 .../common_adaptor_test.py                    |  25 +++
 .../dataset_adaptor_test.py                   |   9 +
 .../dataset_adaptor_test__children.py         |   5 +
 .../dataset_adaptor_test__contained.py        |   7 +
 .../dataset_adaptor_test__container.py        |   5 +
 .../dataset_adaptor_test__experiment.py       |   5 +
 .../dataset_adaptor_test__parents.py          |   5 +
 .../dataset_adaptor_test__sample.py           |   5 +
 .../experiment_adaptor_test.py                |   7 +
 .../experiment_adaptor_test__datasets.py      |   6 +
 .../experiment_adaptor_test__samples.py       |   7 +
 .../material_adaptor_test.py                  |   8 +
 .../sample_adaptor_test.py                    |   9 +
 .../sample_adaptor_test__children.py          |   5 +
 .../sample_adaptor_test__contained.py         |   7 +
 .../sample_adaptor_test__container.py         |   5 +
 .../sample_adaptor_test__datasets.py          |   7 +
 .../sample_adaptor_test__experiment.py        |   5 +
 .../sample_adaptor_test__parents.py           |   5 +
 26 files changed, 468 insertions(+), 49 deletions(-)
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/common_adaptor_test.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__children.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__contained.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__container.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__experiment.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__parents.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__sample.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__datasets.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__samples.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/material_adaptor_test.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__children.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__contained.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__container.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__datasets.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__experiment.py
 create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__parents.py

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java
index 7c8c5e4df7b..3003430cc7f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java
@@ -62,6 +62,8 @@ public class AbstractEntityAdaptor implements IEntityAdaptor
     protected static String ENTITY_TYPE_CODE_FIELD = SearchFieldConstants.PREFIX_ENTITY_TYPE
             + SearchFieldConstants.CODE;
 
+    protected static String ENTITY_TYPE_ANY_CODE_REGEXP = ".*";
+
     public AbstractEntityAdaptor(String code, Collection<IEntityPropertyAdaptor> properties)
     {
         this.code = code;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java
index 72e245d1c18..87a0286eb24 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java
@@ -64,7 +64,7 @@ public class ExperimentAdaptor extends AbstractEntityAdaptor implements IExperim
     @Override
     public Iterable<ISampleAdaptor> samples()
     {
-        return samplesOfType(".*");
+        return samplesOfType(ENTITY_TYPE_ANY_CODE_REGEXP);
     }
 
     @Override
@@ -82,7 +82,7 @@ public class ExperimentAdaptor extends AbstractEntityAdaptor implements IExperim
     @Override
     public Iterable<IDataAdaptor> dataSets()
     {
-        return dataSetsOfType(".*");
+        return dataSetsOfType(ENTITY_TYPE_ANY_CODE_REGEXP);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java
index d7fecae3714..f88804affb5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java
@@ -19,15 +19,20 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calc
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.lucene.search.Query;
+import org.hibernate.ScrollableResults;
 import org.hibernate.Session;
 
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyEvaluator;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IDataAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IExperimentAdaptor;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.ISampleAdaptor;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetRelationshipPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 
 /**
  * {@link IEntityAdaptor} implementation for {@link ExternalDataPE}.
@@ -67,36 +72,38 @@ public class ExternalDataAdaptor extends AbstractEntityAdaptor implements IDataA
     }
 
     @Override
-    public List<IDataAdaptor> parents()
+    public ISampleAdaptor sample()
     {
-        List<IDataAdaptor> list = new ArrayList<IDataAdaptor>();
-        for (DataSetRelationshipPE relationship : externalDataPE.getParentRelationships())
+        SamplePE sample = externalDataPE.tryGetSample();
+        if (sample != null)
         {
-            DataPE parent = relationship.getParentDataSet();
-            list.add(EntityAdaptorFactory.create(parent, evaluator, session));
+            return EntityAdaptorFactory.create(sample, evaluator, session);
+        } else
+        {
+            return null;
         }
-        return list;
     }
 
     @Override
-    public List<IDataAdaptor> children()
+    public Iterable<IDataAdaptor> parents()
     {
         List<IDataAdaptor> list = new ArrayList<IDataAdaptor>();
-        for (DataSetRelationshipPE relationship : externalDataPE.getChildRelationships())
+        for (DataSetRelationshipPE relationship : externalDataPE.getParentRelationships())
         {
-            DataPE child = relationship.getChildDataSet();
-            list.add(EntityAdaptorFactory.create(child, evaluator, session));
+            DataPE parent = relationship.getParentDataSet();
+            list.add(EntityAdaptorFactory.create(parent, evaluator, session));
         }
         return list;
     }
 
     @Override
-    public List<IDataAdaptor> contained()
+    public Iterable<IDataAdaptor> children()
     {
         List<IDataAdaptor> list = new ArrayList<IDataAdaptor>();
-        for (DataPE contained : externalDataPE.getContainedDataSets())
+        for (DataSetRelationshipPE relationship : externalDataPE.getChildRelationships())
         {
-            list.add(EntityAdaptorFactory.create(contained, evaluator, session));
+            DataPE child = relationship.getChildDataSet();
+            list.add(EntityAdaptorFactory.create(child, evaluator, session));
         }
         return list;
     }
@@ -113,4 +120,24 @@ public class ExternalDataAdaptor extends AbstractEntityAdaptor implements IDataA
             return null;
         }
     }
+
+    @Override
+    public Iterable<IDataAdaptor> contained()
+    {
+        return containedOfType(ENTITY_TYPE_ANY_CODE_REGEXP);
+    }
+
+    @Override
+    public Iterable<IDataAdaptor> containedOfType(String typeCodeRegexp)
+    {
+        Query typeConstraint =
+                regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeCodeRegexp.toLowerCase());
+        Query containerConstraint =
+                constraint(SearchFieldConstants.CONTAINER_ID, Long.toString(externalDataPE.getId()));
+        Query query = and(typeConstraint, containerConstraint);
+
+        ScrollableResults results = execute(query, DataPE.class, session);
+        return new EntityAdaptorIterator<IDataAdaptor>(results, evaluator, session);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java
index 37e2bb720b7..5eecd5e0dfa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java
@@ -19,14 +19,19 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calc
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.lucene.search.Query;
+import org.hibernate.ScrollableResults;
 import org.hibernate.Session;
 
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.IDynamicPropertyEvaluator;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IDataAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IExperimentAdaptor;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.ISampleAdaptor;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleRelationshipPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 
 /**
  * {@link IEntityAdaptor} implementation for {@link SamplePE}.
@@ -65,7 +70,7 @@ public class SampleAdaptor extends AbstractEntityAdaptor implements ISampleAdapt
     }
 
     @Override
-    public List<ISampleAdaptor> parents()
+    public Iterable<ISampleAdaptor> parents()
     {
         List<ISampleAdaptor> list = new ArrayList<ISampleAdaptor>();
         for (SamplePE parent : samplePE.getParents())
@@ -76,7 +81,7 @@ public class SampleAdaptor extends AbstractEntityAdaptor implements ISampleAdapt
     }
 
     @Override
-    public List<ISampleAdaptor> children()
+    public Iterable<ISampleAdaptor> children()
     {
         List<ISampleAdaptor> list = new ArrayList<ISampleAdaptor>();
         for (SampleRelationshipPE relationship : samplePE.getChildRelationships())
@@ -87,17 +92,6 @@ public class SampleAdaptor extends AbstractEntityAdaptor implements ISampleAdapt
         return list;
     }
 
-    @Override
-    public List<ISampleAdaptor> contained()
-    {
-        List<ISampleAdaptor> list = new ArrayList<ISampleAdaptor>();
-        for (SamplePE contained : samplePE.getContained())
-        {
-            list.add(EntityAdaptorFactory.create(contained, evaluator, session));
-        }
-        return list;
-    }
-
     @Override
     public ISampleAdaptor container()
     {
@@ -111,4 +105,42 @@ public class SampleAdaptor extends AbstractEntityAdaptor implements ISampleAdapt
         }
     }
 
+    @Override
+    public Iterable<ISampleAdaptor> contained()
+    {
+        return containedOfType(ENTITY_TYPE_ANY_CODE_REGEXP);
+    }
+
+    @Override
+    public Iterable<ISampleAdaptor> containedOfType(String typeCodeRegexp)
+    {
+        Query typeConstraint =
+                regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeCodeRegexp.toLowerCase());
+        Query containerConstraint =
+                constraint(SearchFieldConstants.CONTAINER_ID, Long.toString(samplePE.getId()));
+        Query query = and(typeConstraint, containerConstraint);
+
+        ScrollableResults results = execute(query, SamplePE.class, session);
+        return new EntityAdaptorIterator<ISampleAdaptor>(results, evaluator, session);
+    }
+
+    @Override
+    public Iterable<IDataAdaptor> dataSets()
+    {
+        return dataSetsOfType(ENTITY_TYPE_ANY_CODE_REGEXP);
+    }
+
+    @Override
+    public Iterable<IDataAdaptor> dataSetsOfType(String typeCodeRegexp)
+    {
+        Query typeConstraint =
+                regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeCodeRegexp.toLowerCase());
+        Query sampleConstraint =
+                constraint(SearchFieldConstants.SAMPLE_ID, Long.toString(samplePE.getId()));
+        Query query = and(typeConstraint, sampleConstraint);
+
+        ScrollableResults results = execute(query, DataPE.class, session);
+        return new EntityAdaptorIterator<IDataAdaptor>(results, evaluator, session);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/IDataAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/IDataAdaptor.java
index afa771005de..a242641a0db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/IDataAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/IDataAdaptor.java
@@ -16,8 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api;
 
-import java.util.List;
-
 /**
  * @author Jakub Straszewski
  */
@@ -26,25 +24,37 @@ public interface IDataAdaptor
     /**
      * Returns the experiment of this data set, or null if not exists.
      */
-    IExperimentAdaptor experiment();
+    public IExperimentAdaptor experiment();
 
     /**
-     * Returns the list of all parent data sets.
+     * Returns the sample of this data set, or null if not exists.
      */
-    public List<IDataAdaptor> parents();
+    public ISampleAdaptor sample();
 
     /**
-     * Returns the list of all child data sets.
+     * Returns all parent data sets.
      */
-    public List<IDataAdaptor> children();
+    public Iterable<IDataAdaptor> parents();
 
     /**
-     * Returns the list of contained data sets.
+     * Returns all child data sets.
      */
-    public List<IDataAdaptor> contained();
+    public Iterable<IDataAdaptor> children();
 
     /**
-     * Returs the container data set, or null if not exists.
+     * Returns the container data set, or null if not exists.
      */
     public IDataAdaptor container();
+
+    /**
+     * Returns contained data sets of this data set.
+     */
+    public Iterable<IDataAdaptor> contained();
+
+    /**
+     * Returns contained data sets of this data set. Types of the returned contained data sets must
+     * match the specified regular expression.
+     */
+    public Iterable<IDataAdaptor> containedOfType(String typeCodeRegexp);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/ISampleAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/ISampleAdaptor.java
index ed64afe8b13..c1439cc7d21 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/ISampleAdaptor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/api/ISampleAdaptor.java
@@ -16,8 +16,6 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api;
 
-import java.util.List;
-
 /**
  * @author Jakub Straszewski
  */
@@ -26,26 +24,43 @@ public interface ISampleAdaptor extends IEntityAdaptor
     /**
      * Returns the experiment of this sample, or null if not exists.
      */
-    IExperimentAdaptor experiment();
+    public IExperimentAdaptor experiment();
 
     /**
-     * Returns the list of all parent samples.
+     * Returns all parent samples.
      */
-    public List<ISampleAdaptor> parents();
+    public Iterable<ISampleAdaptor> parents();
 
     /**
-     * Returns the list of all child samples.
+     * Returns all child samples.
      */
-    public List<ISampleAdaptor> children();
+    public Iterable<ISampleAdaptor> children();
 
     /**
-     * Returns the list of contained samples.
+     * Returns the container sample, or null if not exists.
      */
-    public List<ISampleAdaptor> contained();
+    public ISampleAdaptor container();
 
     /**
-     * Returs the container sample, or null if not exists.
+     * Returns contained samples of this sample.
      */
-    public ISampleAdaptor container();
+    public Iterable<ISampleAdaptor> contained();
+
+    /**
+     * Returns contained samples of this sample. Types of the returned contained samples must match
+     * the specified regular expression.
+     */
+    public Iterable<ISampleAdaptor> containedOfType(String typeCodeRegexp);
+
+    /**
+     * Returns data sets of this sample.
+     */
+    public Iterable<IDataAdaptor> dataSets();
+
+    /**
+     * Returns data sets of this sample. Types of the returned data sets must match the specified
+     * regular expression.
+     */
+    public Iterable<IDataAdaptor> dataSetsOfType(String typeCodeRegexp);
 
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java
new file mode 100644
index 00000000000..7734ff3160a
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTest.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2011 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.systemtest.server;
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.Assert;
+
+import org.apache.commons.io.IOUtils;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluationInfo;
+import ch.systemsx.cisd.openbis.systemtest.SystemTestCase;
+
+/**
+ * @author pkupczyk
+ */
+@Test(groups = "system test")
+public class CommonServerTest extends SystemTestCase
+{
+
+    private String sessionToken;
+
+    @BeforeMethod
+    public void beforeMethod()
+    {
+        sessionToken = commonServer.tryAuthenticate("test", "a").getSessionToken();
+    }
+
+    @AfterMethod
+    public void afterMethod()
+    {
+        commonServer.logout(sessionToken);
+    }
+
+    @Test
+    public void testExperimentAdaptor()
+    {
+        testAdaptorCommon(EntityKind.EXPERIMENT, "/CISD/DEFAULT/EXP-REUSE",
+                "experiment_adaptor_test.py");
+    }
+
+    @Test
+    public void testExperimentAdaptorSamples()
+    {
+        testAdaptorCommon(EntityKind.EXPERIMENT, "/CISD/DEFAULT/EXP-REUSE",
+                "experiment_adaptor_test__samples.py");
+    }
+
+    @Test
+    public void testExperimentAdaptorDataSets()
+    {
+        testAdaptorCommon(EntityKind.EXPERIMENT, "/CISD/DEFAULT/EXP-REUSE",
+                "experiment_adaptor_test__datasets.py");
+    }
+
+    @Test
+    public void testSampleAdaptor()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/CP-TEST-1", "sample_adaptor_test.py");
+    }
+
+    @Test
+    public void testSampleAdaptorExperiment()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/3VCP6", "sample_adaptor_test__experiment.py");
+    }
+
+    @Test
+    public void testSampleAdaptorParents()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/3VCP6", "sample_adaptor_test__parents.py");
+    }
+
+    @Test
+    public void testSampleAdaptorChildren()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/DP1-A", "sample_adaptor_test__children.py");
+    }
+
+    @Test
+    public void testSampleAdaptorDataSets()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/CP-TEST-3", "sample_adaptor_test__datasets.py");
+    }
+
+    @Test
+    public void testSampleAdaptorContainer()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/CL1:A01", "sample_adaptor_test__container.py");
+    }
+
+    @Test
+    public void testSampleAdaptorContained()
+    {
+        testAdaptorCommon(EntityKind.SAMPLE, "/CISD/CL1", "sample_adaptor_test__contained.py");
+    }
+
+    @Test
+    public void testDataSetAdaptor()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20081105092159111-1", "dataset_adaptor_test.py");
+    }
+
+    @Test
+    public void testDataSetAdaptorExperiment()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20081105092159188-3",
+                "dataset_adaptor_test__experiment.py");
+    }
+
+    @Test
+    public void testDataSetAdaptorSample()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20081105092159222-2",
+                "dataset_adaptor_test__sample.py");
+    }
+
+    @Test
+    public void testDataSetAdaptorParents()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20081105092259000-9",
+                "dataset_adaptor_test__parents.py");
+    }
+
+    @Test
+    public void testDataSetAdaptorChildren()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20081105092259000-9",
+                "dataset_adaptor_test__children.py");
+    }
+
+    @Test
+    public void testDataSetAdaptorContainer()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20110509092359990-11",
+                "dataset_adaptor_test__container.py");
+    }
+
+    @Test
+    public void testDataSetAdaptorContained()
+    {
+        testAdaptorCommon(EntityKind.DATA_SET, "20110509092359990-10",
+                "dataset_adaptor_test__contained.py");
+    }
+
+    @Test
+    public void testMaterialAdaptor()
+    {
+        testAdaptorCommon(EntityKind.MATERIAL, "C-NO-TIME (CONTROL)", "material_adaptor_test.py");
+    }
+
+    private void testAdaptorCommon(EntityKind entityKind, String entityIdentifier, String scriptName)
+    {
+        String script =
+                getResourceAsString("common_adaptor_test.py") + "\n"
+                        + getResourceAsString(scriptName);
+
+        EntityValidationEvaluationInfo info =
+                new EntityValidationEvaluationInfo(entityKind, entityIdentifier, false, script);
+
+        String result = commonServer.evaluate(sessionToken, info);
+        Assert.assertEquals("Validation OK", result);
+    }
+
+    private String getResourceAsString(String fileName)
+    {
+        try
+        {
+            return IOUtils.toString(getClass().getResourceAsStream(
+                    "CommonServerTestResources" + File.separator + fileName));
+        } catch (IOException ex)
+        {
+            throw new RuntimeException(ex);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/common_adaptor_test.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/common_adaptor_test.py
new file mode 100644
index 00000000000..45f8f2497f8
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/common_adaptor_test.py
@@ -0,0 +1,25 @@
+def assertEqual(actual, expected, fieldName):
+    if(actual != expected):
+        raise Exception('Expected ' + str(fieldName) + ': "' + str(expected) + '" but was: "' + str(actual) + '"')
+
+def assertEntity(entity, expectedEntityCode, fieldName):
+    if(entity.code() != expectedEntityCode):
+        raise Exception('Expected ' + str(fieldName) + ': "' + str(expectedEntityCode) + '" but was: "' + str(entity.code()) + '"')
+
+def assertEntities(iterable, expectedEntityCodes, fieldName):
+    actualEntityCodes = []
+    
+    for entity in iterable:
+        actualEntityCodes.append(entity.code())
+    
+    if(set(actualEntityCodes) != set(expectedEntityCodes)):
+        raise Exception('Expected ' + str(fieldName) + ': "' + str(expectedEntityCodes) + '" but were: "' + str(actualEntityCodes) + '"')
+    
+def assertEntitiesCount(iterable, expectedEntityCount, fieldName):
+    actualEntityCount = 0
+    
+    for entity in iterable:
+        actualEntityCount += 1
+    
+    if(actualEntityCount != expectedEntityCount):
+        raise Exception('Expected ' + str(fieldName) + ': "' + str(expectedEntityCount) + '" but were: "' + str(actualEntityCount) + '"')
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test.py
new file mode 100644
index 00000000000..d712ba7d80a
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test.py
@@ -0,0 +1,9 @@
+def validate(dataset, isNew):
+    try:
+        assertEqual(dataset.code(), '20081105092159111-1', 'code')
+        assertEqual(len(dataset.properties()), 4, 'number of properties')
+        assertEqual(dataset.propertyValue('COMMENT'), 'no comment', 'comment property')
+        assertEqual(dataset.propertyValue('GENDER'), 'FEMALE', 'gender property')
+        assertEqual(dataset.propertyValue('BACTERIUM'), 'BACTERIUM1 (BACTERIUM)', 'bacterium property')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__children.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__children.py
new file mode 100644
index 00000000000..c34f34f777a
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__children.py
@@ -0,0 +1,5 @@
+def validate(dataset, isNew):
+    try:
+        assertEntities(dataset.children(), ["20081105092259900-0", "20081105092259900-1"], 'children')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__contained.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__contained.py
new file mode 100644
index 00000000000..30c5cb98ed7
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__contained.py
@@ -0,0 +1,7 @@
+def validate(dataset, isNew):
+    try:
+        assertEntities(dataset.contained(), ["20110509092359990-11", "20110509092359990-12"], 'contained')
+        assertEntities(dataset.containedOfType("HCS_IMAGE"), ["20110509092359990-11", "20110509092359990-12"], 'contained of type HCS_IMAGE')
+        assertEntities(dataset.containedOfType('NOT_EXISTING_TYPE'), [], 'contained of type NOT_EXISTING_TYPE')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__container.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__container.py
new file mode 100644
index 00000000000..8f4fb1abe56
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__container.py
@@ -0,0 +1,5 @@
+def validate(dataset, isNew):
+    try:
+        assertEntity(dataset.container(), '20110509092359990-10', 'container')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__experiment.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__experiment.py
new file mode 100644
index 00000000000..d8cd47ba337
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__experiment.py
@@ -0,0 +1,5 @@
+def validate(dataset, isNew):
+    try:
+        assertEntity(dataset.experiment(), 'EXP1', 'experiment')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__parents.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__parents.py
new file mode 100644
index 00000000000..1b9f22276c8
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__parents.py
@@ -0,0 +1,5 @@
+def validate(dataset, isNew):
+    try:
+        assertEntities(dataset.parents(), ["20081105092159111-1", "20081105092159222-2", "20081105092159333-3"], 'parents')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__sample.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__sample.py
new file mode 100644
index 00000000000..e7c8005e2b9
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/dataset_adaptor_test__sample.py
@@ -0,0 +1,5 @@
+def validate(dataset, isNew):
+    try:
+        assertEntity(dataset.sample(), 'CP-TEST-2', 'sample')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test.py
new file mode 100644
index 00000000000..1fbc4632a47
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test.py
@@ -0,0 +1,7 @@
+def validate(experiment, isNew):
+    try:
+        assertEqual(experiment.code(), 'EXP-REUSE', 'code')
+        assertEqual(len(experiment.properties()), 1, 'number of properties')
+        assertEqual(experiment.propertyValue('DESCRIPTION'), 'Test of sample reusage from invalidated experiments', 'description property')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__datasets.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__datasets.py
new file mode 100644
index 00000000000..4d23d2b4914
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__datasets.py
@@ -0,0 +1,6 @@
+def validate(experiment, isNew):
+    try:
+        assertEntitiesCount(experiment.dataSets(), 18, 'data sets')
+        assertEntities(experiment.dataSetsOfType('CONTAINER_TYPE'), ['CONTAINER_1', 'CONTAINER_2', 'ROOT_CONTAINER', '20081105092259000-19', '20110509092359990-10'], 'data sets of type CONTAINER_TYPE')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__samples.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__samples.py
new file mode 100644
index 00000000000..aea17450034
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/experiment_adaptor_test__samples.py
@@ -0,0 +1,7 @@
+def validate(experiment, isNew):
+    try:
+        assertEntitiesCount(experiment.samples(), 7, 'samples')
+        assertEntities(experiment.samplesOfType('CELL_PLATE'), ['CP1-A1','CP1-A2','CP1-B1','CP2-A1'], 'samples of type CELL_PLATE')
+        assertEntities(experiment.samplesOfType('REINFECT_PLATE'), ['RP1-A2X','RP1-B1X','RP2-A1X'], 'samples of type REINFECT_PLATE')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/material_adaptor_test.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/material_adaptor_test.py
new file mode 100644
index 00000000000..d5bc83705b1
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/material_adaptor_test.py
@@ -0,0 +1,8 @@
+def validate(material, isNew):
+    try:
+        assertEqual(material.code(), 'C-NO-TIME', 'code')
+        assertEqual(len(material.properties()), 4, 'number of properties')
+        assertEqual(material.propertyValue('DESCRIPTION'), 'neutral control', 'description property')
+        assertEqual(material.propertyValue('IS_VALID'), 'true', 'is_valid property')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test.py
new file mode 100644
index 00000000000..3d22be358a1
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test.py
@@ -0,0 +1,9 @@
+def validate(sample, isNew):
+    try:
+        assertEqual(sample.code(), 'CP-TEST-1', 'code')
+        assertEqual(len(sample.properties()), 5, 'number of properties')
+        assertEqual(sample.propertyValue('SIZE'), '123', 'size property')
+        assertEqual(sample.propertyValue('ORGANISM'), 'HUMAN', 'organism property')
+        assertEqual(sample.propertyValue('BACTERIUM'), 'BACTERIUM-X (BACTERIUM)', 'bacterium property')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__children.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__children.py
new file mode 100644
index 00000000000..cd5c79e558f
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__children.py
@@ -0,0 +1,5 @@
+def validate(sample, isNew):
+    try:
+        assertEntities(sample.children(), ['CP1-A1','CP1-A2'], 'children')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__contained.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__contained.py
new file mode 100644
index 00000000000..1558a8d65e6
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__contained.py
@@ -0,0 +1,7 @@
+def validate(sample, isNew):
+    try:
+        assertEntities(sample.contained(), ['A01','A03'], 'contained')
+        assertEntities(sample.containedOfType('WELL'), ['A01','A03'], 'contained of type WELL')
+        assertEntities(sample.containedOfType('NOT_EXISTING_TYPE'), [], 'contained of type NOT_EXISTING_TYPE')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__container.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__container.py
new file mode 100644
index 00000000000..f4321f02ed6
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__container.py
@@ -0,0 +1,5 @@
+def validate(sample, isNew):
+    try:
+        assertEntity(sample.container(), 'CL1', 'container')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__datasets.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__datasets.py
new file mode 100644
index 00000000000..4298dd2f10e
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__datasets.py
@@ -0,0 +1,7 @@
+def validate(sample, isNew):
+    try:
+        assertEntities(sample.dataSets(), ["20081105092159333-3", "20110805092359990-17"], 'data sets')
+        assertEntities(sample.dataSetsOfType('HCS_IMAGE'), ["20081105092159333-3", "20110805092359990-17"], 'data sets of type HCS_IMAGE')
+        assertEntities(sample.dataSetsOfType('NOT_EXISTING_TYPE'), [], 'data sets of type NOT_EXISTING_TYPE')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__experiment.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__experiment.py
new file mode 100644
index 00000000000..6e63d962883
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__experiment.py
@@ -0,0 +1,5 @@
+def validate(sample, isNew):
+    try:
+        assertEntity(sample.experiment(), 'EXP11', 'experiment')
+    except Exception, ex:
+        return ex.args[0]
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__parents.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__parents.py
new file mode 100644
index 00000000000..bf5b4c81a4f
--- /dev/null
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/server/CommonServerTestResources/sample_adaptor_test__parents.py
@@ -0,0 +1,5 @@
+def validate(sample, isNew):
+    try:
+        assertEntities(sample.parents(), ['A02','3V-125'], 'parents')
+    except Exception, ex:
+        return ex.args[0]
-- 
GitLab