From cb4bf6118f2da1bdea459c451bb32a0003341e52 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Tue, 10 Jul 2012 06:11:13 +0000
Subject: [PATCH] SP-179, BIS-21: Adding feature vector support.

SVN: 26044
---
 .../dto/api/impl/FeatureVectorDataSet.java    | 271 ++++++++++++++++++
 .../etl/dto/api/v2/IFeatureVectorDataSet.java |  32 +++
 .../api/v2/SimpleFeatureVectorDataConfig.java |  65 +++++
 ...ImagingDataSetRegistrationTransaction.java |   9 +-
 .../etl/jython/JythonPlateDatasetFactory.java |   2 +-
 ...agingDataSetRegistrationTransactionV2.java |  12 +-
 ...aSetRegistrationTransactionV2Delegate.java |  43 +++
 .../data-set-handler.py                       |  38 +--
 .../plugin.properties                         |   2 +-
 9 files changed, 453 insertions(+), 21 deletions(-)
 create mode 100644 screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/FeatureVectorDataSet.java
 create mode 100644 screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/IFeatureVectorDataSet.java
 create mode 100644 screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/SimpleFeatureVectorDataConfig.java

diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/FeatureVectorDataSet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/FeatureVectorDataSet.java
new file mode 100644
index 00000000000..c4c8d1040b1
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/impl/FeatureVectorDataSet.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2012 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.dss.etl.dto.api.impl;
+
+import java.io.File;
+import java.util.List;
+
+import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails;
+import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.DataSet;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.v2.IFeatureVectorDataSet;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IDataSetImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExternalDataManagementSystemImmutable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class FeatureVectorDataSet implements IFeatureVectorDataSet
+{
+    private final DataSet<FeatureVectorDataSetInformation> dataSet;
+
+    public FeatureVectorDataSet(DataSet<FeatureVectorDataSetInformation> dataSet)
+    {
+        this.dataSet = dataSet;
+    }
+
+    @Override
+    public void setAnalysisProcedure(String analysisProcedure)
+    {
+        dataSet.getRegistrationDetails().getDataSetInformation().setAnalysisProcedure(analysisProcedure);
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        return dataSet.equals(obj);
+    }
+
+    public DataSetRegistrationDetails<? extends FeatureVectorDataSetInformation> getRegistrationDetails()
+    {
+        return dataSet.getRegistrationDetails();
+    }
+
+    public File getDataSetStagingFolder()
+    {
+        return dataSet.getDataSetStagingFolder();
+    }
+
+    @Override
+    public String getDataSetCode()
+    {
+        return dataSet.getDataSetCode();
+    }
+
+    @Override
+    public IExperimentImmutable getExperiment()
+    {
+        return dataSet.getExperiment();
+    }
+
+    @Override
+    public ISampleImmutable getSample()
+    {
+        return dataSet.getSample();
+    }
+
+    @Override
+    public String getFileFormatType()
+    {
+        return dataSet.getFileFormatType();
+    }
+
+    @Override
+    public int getSpeedHint()
+    {
+        return dataSet.getSpeedHint();
+    }
+
+    @Override
+    public String getDataSetType()
+    {
+        return dataSet.getDataSetType();
+    }
+
+    @Override
+    public DataSetType getDataSetTypeWithPropertyTypes()
+    {
+        return dataSet.getDataSetTypeWithPropertyTypes();
+    }
+
+    @Override
+    public String getPropertyValue(String propertyCode)
+    {
+        return dataSet.getPropertyValue(propertyCode);
+    }
+
+    @Override
+    public List<String> getAllPropertyCodes()
+    {
+        return dataSet.getAllPropertyCodes();
+    }
+
+    @Override
+    public List<String> getParentDatasets()
+    {
+        return dataSet.getParentDatasets();
+    }
+
+    @Override
+    public List<String> getContainedDataSetCodes()
+    {
+        return dataSet.getContainedDataSetCodes();
+    }
+
+    @Override
+    public List<IDataSetImmutable> getChildrenDataSets()
+    {
+        return dataSet.getChildrenDataSets();
+    }
+
+    @Override
+    public String getContainerDataSet()
+    {
+        return dataSet.getContainerDataSet();
+    }
+
+    @Override
+    public IExternalDataManagementSystemImmutable getExternalDataManagementSystem()
+    {
+        return dataSet.getExternalDataManagementSystem();
+    }
+
+    @Override
+    public String getExternalCode()
+    {
+        return dataSet.getExternalCode();
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return dataSet.hashCode();
+    }
+
+    @Override
+    public void setExperiment(IExperimentImmutable experiment)
+    {
+        dataSet.setExperiment(experiment);
+    }
+
+    @Override
+    public void setSample(ISampleImmutable sampleOrNull)
+    {
+        dataSet.setSample(sampleOrNull);
+    }
+
+    @Override
+    public void setFileFormatType(String fileFormatTypeCode)
+    {
+        dataSet.setFileFormatType(fileFormatTypeCode);
+    }
+
+    @Override
+    public boolean isMeasuredData()
+    {
+        return dataSet.isMeasuredData();
+    }
+
+    @Override
+    public void setMeasuredData(boolean measuredData)
+    {
+        dataSet.setMeasuredData(measuredData);
+    }
+
+    @Override
+    public void setSpeedHint(int speedHint)
+    {
+        dataSet.setSpeedHint(speedHint);
+    }
+
+    @Override
+    public void setDataSetType(String dataSetTypeCode)
+    {
+        dataSet.setDataSetType(dataSetTypeCode);
+    }
+
+    @Override
+    public void setPropertyValue(String propertyCode, String propertyValue)
+    {
+        dataSet.setPropertyValue(propertyCode, propertyValue);
+    }
+
+    @Override
+    public void setParentDatasets(List<String> parentDatasetCodes)
+    {
+        dataSet.setParentDatasets(parentDatasetCodes);
+    }
+
+    @Override
+    public boolean isContainerDataSet()
+    {
+        return dataSet.isContainerDataSet();
+    }
+
+    @Override
+    public void setContainedDataSetCodes(List<String> containedDataSetCodes)
+    {
+        dataSet.setContainedDataSetCodes(containedDataSetCodes);
+    }
+
+    @Override
+    public boolean isContainedDataSet()
+    {
+        return dataSet.isContainedDataSet();
+    }
+
+    @Override
+    public void setExternalDataManagementSystem(
+            IExternalDataManagementSystemImmutable externalDataManagementSystem)
+    {
+        dataSet.setExternalDataManagementSystem(externalDataManagementSystem);
+    }
+
+    @Override
+    public boolean isLinkDataSet()
+    {
+        return dataSet.isLinkDataSet();
+    }
+
+    @Override
+    public void setExternalCode(String externalCode)
+    {
+        dataSet.setExternalCode(externalCode);
+    }
+
+    @Override
+    public boolean isNoFileDataSet()
+    {
+        return dataSet.isNoFileDataSet();
+    }
+
+    @Override
+    public String toString()
+    {
+        return dataSet.toString();
+    }
+
+    public File tryDataSetContents()
+    {
+        return dataSet.tryDataSetContents();
+    }
+
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/IFeatureVectorDataSet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/IFeatureVectorDataSet.java
new file mode 100644
index 00000000000..d042b0639c7
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/IFeatureVectorDataSet.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 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.dss.etl.dto.api.v2;
+
+import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
+
+/**
+ * Extension of {@link IDataSet} specific for feature vector data sets.
+ *
+ * @author Franz-Josef Elmer
+ */
+public interface IFeatureVectorDataSet extends IDataSet
+{
+    /**
+     * Sets the analysis procedure used to create the feature vectors.
+     */
+    public void setAnalysisProcedure(String analysisProcedure);
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/SimpleFeatureVectorDataConfig.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/SimpleFeatureVectorDataConfig.java
new file mode 100644
index 00000000000..548c2765c75
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dto/api/v2/SimpleFeatureVectorDataConfig.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2012 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.dss.etl.dto.api.v2;
+
+import java.util.Properties;
+
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.FeaturesBuilder;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.IFeaturesBuilder;
+
+/**
+ * Configuration for creating a feature vector data set.
+ *
+ * @author Franz-Josef Elmer
+ */
+public class SimpleFeatureVectorDataConfig
+{
+    private Properties properties;
+    private IFeaturesBuilder featuresBuilder;
+    
+    /**
+     * Creates an instance with undefined properties assuming that the {@link FeaturesBuilder} is
+     * used to create the feature vectors.
+     */
+    public SimpleFeatureVectorDataConfig()
+    {
+    }
+
+    /**
+     * Creates an instance for the specified properties object which is used to configure parsing of
+     * a feature vector file.
+     */
+    public SimpleFeatureVectorDataConfig(Properties properties)
+    {
+        this.properties = properties;
+    }
+    
+    public IFeaturesBuilder getFeaturesBuilder()
+    {
+        if (featuresBuilder == null)
+        {
+            featuresBuilder = new FeaturesBuilder();
+        }
+        return featuresBuilder;
+    }
+
+    public Properties getProperties()
+    {
+        return properties;
+    }
+
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/ImagingDataSetRegistrationTransaction.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/ImagingDataSetRegistrationTransaction.java
index 6ca752092bd..bacdac92127 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/ImagingDataSetRegistrationTransaction.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/ImagingDataSetRegistrationTransaction.java
@@ -76,6 +76,8 @@ public class ImagingDataSetRegistrationTransaction extends DataSetRegistrationTr
 
     private final String originalDirName;
 
+    private final JythonPlateDatasetFactory factory;
+
     @SuppressWarnings("unchecked")
     public ImagingDataSetRegistrationTransaction(File rollBackStackParentFolder,
             File workingDirectory, File stagingDirectory,
@@ -89,12 +91,17 @@ public class ImagingDataSetRegistrationTransaction extends DataSetRegistrationTr
         assert registrationDetailsFactory instanceof JythonPlateDatasetFactory : "JythonPlateDatasetFactory expected, but got: "
                 + registrationDetailsFactory.getClass().getCanonicalName();
 
-        JythonPlateDatasetFactory factory = (JythonPlateDatasetFactory) registrationDetailsFactory;
+        factory = (JythonPlateDatasetFactory) registrationDetailsFactory;
         this.imageDatasetFactory = factory.imageDatasetFactory;
         this.imageContainerDatasetFactory = factory.imageContainerDatasetFactory;
         this.originalDirName = originalDirName;
     }
 
+    public JythonPlateDatasetFactory getFactory()
+    {
+        return factory;
+    }
+
     @Override
     public IImageDataSet createNewImageDataSet(SimpleImageDataConfig imageDataSet,
             File incomingFolderWithImages)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/JythonPlateDatasetFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/JythonPlateDatasetFactory.java
index 5e6a0ae29d6..5b709cd9c4e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/JythonPlateDatasetFactory.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/JythonPlateDatasetFactory.java
@@ -204,7 +204,7 @@ public class JythonPlateDatasetFactory extends JythonObjectFactory<DataSetInform
         return createFeatureVectorRegistrationDetails(featureDefinitions);
     }
 
-    private DataSetRegistrationDetails<FeatureVectorDataSetInformation> createFeatureVectorRegistrationDetails(
+    public DataSetRegistrationDetails<FeatureVectorDataSetInformation> createFeatureVectorRegistrationDetails(
             List<FeatureDefinition> featureDefinitions)
     {
         DataSetRegistrationDetails<FeatureVectorDataSetInformation> registrationDetails =
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/IImagingDataSetRegistrationTransactionV2.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/IImagingDataSetRegistrationTransactionV2.java
index df5939b0cb6..bbadbac0577 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/IImagingDataSetRegistrationTransactionV2.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/IImagingDataSetRegistrationTransactionV2.java
@@ -19,8 +19,11 @@ package ch.systemsx.cisd.openbis.dss.etl.jython.v2;
 import java.io.File;
 
 import ch.systemsx.cisd.etlserver.registrator.api.v2.IDataSetRegistrationTransactionV2;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.FeaturesBuilder;
 import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.IImageDataSet;
 import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.SimpleImageDataConfig;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.v2.IFeatureVectorDataSet;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.v2.SimpleFeatureVectorDataConfig;
 
 /**
  * 
@@ -31,9 +34,16 @@ public interface IImagingDataSetRegistrationTransactionV2 extends
  IDataSetRegistrationTransactionV2
 {
     /**
-     * Creates a new image dataset. See {@link SimpleImageDataConfig} documentation for
+     * Creates a new image data set. See {@link SimpleImageDataConfig} documentation for
      * configuration details.
      */
     IImageDataSet createNewImageDataSet(SimpleImageDataConfig imageDataSet,
             File incomingFolderWithImages);
+    
+    /**
+     * Creates a new feature vector data set based on either the {@link FeaturesBuilder} provided by
+     * the specified {@link SimpleFeatureVectorDataConfig} or the specified file.
+     */
+    IFeatureVectorDataSet createNewFeatureVectorDataSet(
+            SimpleFeatureVectorDataConfig featureDataSetConfig, File featureVectorFileOrNull);
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/ImagingDataSetRegistrationTransactionV2Delegate.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/ImagingDataSetRegistrationTransactionV2Delegate.java
index b428a1621be..1cf09f1bb3d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/ImagingDataSetRegistrationTransactionV2Delegate.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/jython/v2/ImagingDataSetRegistrationTransactionV2Delegate.java
@@ -17,11 +17,16 @@
 package ch.systemsx.cisd.openbis.dss.etl.jython.v2;
 
 import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
 
 import net.lemnik.eodsql.DynamicTransactionQuery;
 
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationContext;
+import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IExperiment;
@@ -29,8 +34,16 @@ import ch.systemsx.cisd.etlserver.registrator.api.v1.IMaterial;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IProject;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISample;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.ISpace;
+import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.DataSet;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.FeatureDefinition;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.FeatureVectorDataSet;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.FeatureVectorDataSetInformation;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.FeaturesBuilder;
 import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.IImageDataSet;
 import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.SimpleImageDataConfig;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.v2.IFeatureVectorDataSet;
+import ch.systemsx.cisd.openbis.dss.etl.dto.api.v2.SimpleFeatureVectorDataConfig;
+import ch.systemsx.cisd.openbis.dss.etl.featurevector.CsvFeatureVectorParser;
 import ch.systemsx.cisd.openbis.dss.etl.jython.ImagingDataSetRegistrationTransaction;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.authorization.IAuthorizationService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IDataSetImmutable;
@@ -63,6 +76,36 @@ public class ImagingDataSetRegistrationTransactionV2Delegate implements
         return transaction.createNewImageDataSet(imageDataSet, incomingFolderWithImages);
     }
 
+    @Override
+    public IFeatureVectorDataSet createNewFeatureVectorDataSet(
+            SimpleFeatureVectorDataConfig featureDataSetConfig, File featureVectorFileOrNull)
+    {
+        List<FeatureDefinition> featureDefinitions;
+        Properties properties = featureDataSetConfig.getProperties();
+        if (properties == null)
+        {
+            featureDefinitions =
+                    ((FeaturesBuilder) featureDataSetConfig.getFeaturesBuilder())
+                            .getFeatureDefinitionValuesList();
+        } else
+        {
+            try
+            {
+                featureDefinitions = CsvFeatureVectorParser.parse(featureVectorFileOrNull, properties);
+            } catch (IOException ex)
+            {
+                throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+            }
+        }
+        DataSetRegistrationDetails<FeatureVectorDataSetInformation> registrationDetails =
+                transaction.getFactory().createFeatureVectorRegistrationDetails(featureDefinitions);
+        @SuppressWarnings("unchecked")
+        DataSet<FeatureVectorDataSetInformation> dataSet =
+                (DataSet<FeatureVectorDataSetInformation>) transaction
+                        .createNewDataSet(registrationDetails);
+        return new FeatureVectorDataSet(dataSet);
+    }
+
     @Override
     public IDataSet createNewDataSet()
     {
diff --git a/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/data-set-handler.py b/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/data-set-handler.py
index 2c76f4d32d3..dee6dbe3c12 100644
--- a/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/data-set-handler.py
+++ b/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/data-set-handler.py
@@ -1,3 +1,5 @@
+from ch.systemsx.cisd.openbis.dss.etl.dto.api.v2 import SimpleFeatureVectorDataConfig 
+
 PLATE_GEOMETRY_PROPERTY_CODE = "$PLATE_GEOMETRY"
 PLATE_GEOMETRY = "384_WELLS_16X24"
 
@@ -32,16 +34,16 @@ def create_plate(tr, experiment, plateCode, gene):
     return plate
 
 
-def create_analysis_data_set(tr, plate, builder, analysis_procedure, ds_file):    
-    analysis_registration_details = factory.createFeatureVectorDatasetDetails(builder)    
-    analysis_data_set = tr.createNewDataSet(analysis_registration_details)
+def create_analysis_data_set(tr, plate, config, analysis_procedure, ds_file):    
+    analysis_data_set = tr.createNewFeatureVectorDataSet(config, None)
     analysis_data_set.setSample(plate)
     analysis_data_set.setPropertyValue("$ANALYSIS_PROCEDURE", analysis_procedure)
-    analysis_data_set_file = tr.moveFile(incoming.getPath() + "/" + ds_file, analysis_data_set)
+    analysis_data_set_file = tr.moveFile(tr.incoming.getPath() + "/" + ds_file, analysis_data_set)
 
 def create_dataset_with_features1(tr, experiment, gene):
     plate1 = create_plate(tr, experiment, "PLATE1", gene)
-    builder = factory.createFeaturesBuilder()
+    config = SimpleFeatureVectorDataConfig()
+    builder = config.featuresBuilder
     
     featureX = builder.defineFeature("X")
     featureX.addValue(1, 1, "1")
@@ -51,11 +53,12 @@ def create_dataset_with_features1(tr, experiment, gene):
     featureY.addValue(1, 1, "3")
     featureY.addValue(1, 2, "2")
 
-    create_analysis_data_set(tr, plate1, builder, "p1", "data-set-1.csv")    
+    create_analysis_data_set(tr, plate1, config, "p1", "data-set-1.csv")    
 
 def create_dataset_with_features2(tr, experiment, gene):
     plate2 = create_plate(tr, experiment, "PLATE2", gene)
-    builder = factory.createFeaturesBuilder()
+    config = SimpleFeatureVectorDataConfig()
+    builder = config.featuresBuilder
     
     featureA = builder.defineFeature("A")
     featureA.addValue(1, 1, "10")
@@ -69,18 +72,19 @@ def create_dataset_with_features2(tr, experiment, gene):
     featureX.addValue(1, 1, "5")
     featureX.addValue(1, 2, "6")
 
-    create_analysis_data_set(tr, plate2, builder, "p2", "data-set-2.file")    
+    create_analysis_data_set(tr, plate2, config, "p2", "data-set-2.file")    
 
 
-tr = service.transaction()
-experiment = create_experiment(tr)
+def process(transaction): 
+    incoming = transaction.incoming
+    experiment = create_experiment(transaction)
 
-geneCode = "G"
-geneG = tr.createNewMaterial(geneCode, "GENE") 
+    geneCode = "G"
+    geneG = transaction.createNewMaterial(geneCode, "GENE") 
 
-create_dataset_with_features1(tr, experiment, geneG)
-create_dataset_with_features2(tr, experiment, geneG)
+    create_dataset_with_features1(transaction, experiment, geneG)
+    create_dataset_with_features2(transaction, experiment, geneG)
 
-# delete the empty incoming, its 
-# contents have been moved to the data sets 
-incoming.delete()
\ No newline at end of file
+    # delete the empty incoming, its 
+    # contents have been moved to the data sets 
+    incoming.delete()
\ No newline at end of file
diff --git a/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/plugin.properties b/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/plugin.properties
index 2af97cd0ad7..c4cbfdd9875 100644
--- a/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/plugin.properties
+++ b/screening/sourceTest/core-plugins/AggregatedFeatureVectorsTest/1/dss/drop-boxes/AggregatedFeatureVectorsTest-drop-box/plugin.properties
@@ -1,7 +1,7 @@
 incoming-dir = ${root-dir}/incoming-AggregatedFeatureVectorsTest
 incoming-dir-create = true
 incoming-data-completeness-condition = auto-detection
-top-level-data-set-handler = ch.systemsx.cisd.openbis.dss.etl.jython.JythonPlateDataSetHandler
+top-level-data-set-handler = ch.systemsx.cisd.openbis.dss.etl.jython.v2.JythonPlateDataSetHandlerV2
 script-path = data-set-handler.py
 storage-processor = ch.systemsx.cisd.openbis.dss.etl.featurevector.FeatureVectorStorageProcessor
 storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor
-- 
GitLab