From 776984f04581abd77707ec54e227ab09a891fdd0 Mon Sep 17 00:00:00 2001
From: felmer <franz-josef.elmer@id.ethz.ch>
Date: Tue, 12 Mar 2019 08:40:57 +0100
Subject: [PATCH] SSDM-7493: Refactoring by introducing parameter classes
 WritingContext and DeliveryExecutionContext

---
 .../datasource/AbstractEntityDeliverer.java   |  20 ++-
 .../sync/datasource/DataSetDeliverer.java     |   9 +-
 .../datasource/DataSourceRequestHandler.java  | 129 ++++++++++++++++--
 .../plugins/sync/datasource/Deliverers.java   |   9 +-
 .../datasource/DeliveryExecutionContext.java  |  90 ++++++++++++
 .../sync/datasource/ExperimentDeliverer.java  |  10 +-
 .../plugins/sync/datasource/IDeliverer.java   |   9 +-
 .../sync/datasource/MasterDataDeliverer.java  |  10 +-
 .../sync/datasource/MaterialDeliverer.java    |   9 +-
 .../sync/datasource/ProjectDeliverer.java     |   9 +-
 .../sync/datasource/SampleDeliverer.java      |   9 +-
 .../sync/datasource/SpaceDeliverer.java       |   9 +-
 12 files changed, 269 insertions(+), 53 deletions(-)
 create mode 100644 datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DeliveryExecutionContext.java

diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/AbstractEntityDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/AbstractEntityDeliverer.java
index dea4b97a31b..75e9f98eb09 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/AbstractEntityDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/AbstractEntityDeliverer.java
@@ -29,6 +29,7 @@ import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.log4j.Logger;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.attachment.Attachment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.ICodeHolder;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IModificationDateHolder;
@@ -72,21 +73,26 @@ abstract class AbstractEntityDeliverer<T> implements IDeliverer
     }
 
     @Override
-    public void deliverEntities(XMLStreamWriter writer, IDataSourceQueryService queryService, String sessionToken, Set<String> spaces, Date requestTimestamp) throws XMLStreamException
+    public void deliverEntities(DeliveryExecutionContext context) throws XMLStreamException
     {
+        IDataSourceQueryService queryService = context.getQueryService();
+        String sessionToken = context.getSessionToken();
         List<T> allEntities = getAllEntities(queryService, sessionToken);
-        executeInBatches(allEntities, entities -> deliverEntities(writer, sessionToken, spaces, entities));
+        executeInBatches(allEntities, entities -> deliverEntities(context, entities));
     }
-
+    
     protected List<T> getAllEntities(IDataSourceQueryService queryService, String sessionToken)
     {
         return Collections.emptyList();
     }
 
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<T> entities)
-            throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<T> entities) throws XMLStreamException
     {
+    }
 
+    protected IApplicationServerApi getV3Api()
+    {
+        return context.getV3api();
     }
 
     protected void addProperties(XMLStreamWriter writer, Map<String, String> properties) throws XMLStreamException
@@ -188,12 +194,12 @@ abstract class AbstractEntityDeliverer<T> implements IDeliverer
             addAttribute(writer, attributeName, value);
         }
     }
-    
+
     protected void addAttribute(XMLStreamWriter writer, String attributeName, Boolean value) throws XMLStreamException
     {
         addAttribute(writer, attributeName, value, v -> String.valueOf(v));
     }
-    
+
     protected <O> void addAttribute(XMLStreamWriter writer, String attributeName, O object, Function<O, String> mapper) throws XMLStreamException
     {
         if (object != null)
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSetDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSetDeliverer.java
index 034c6509423..47c5c04ce20 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSetDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSetDeliverer.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.ContentCopy;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.LinkedData;
@@ -46,10 +47,14 @@ public class DataSetDeliverer extends AbstractEntityWithPermIdDeliverer
     }
 
     @Override
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<String> dataSets) throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<String> dataSets) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
+        String sessionToken = context.getSessionToken();
+        Set<String> spaces = context.getSpaces();
+        IApplicationServerApi v3api = getV3Api();
         List<DataSetPermId> permIds = dataSets.stream().map(DataSetPermId::new).collect(Collectors.toList());
-        Collection<DataSet> fullDataSets = context.getV3api().getDataSets(sessionToken, permIds, createDataSetFetchOptions()).values();
+        Collection<DataSet> fullDataSets = v3api.getDataSets(sessionToken, permIds, createDataSetFetchOptions()).values();
         int count = 0;
         for (DataSet dataSet : fullDataSets)
         {
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSourceRequestHandler.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSourceRequestHandler.java
index 127e50469fe..f48f43849d6 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSourceRequestHandler.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DataSourceRequestHandler.java
@@ -57,16 +57,26 @@ public class DataSourceRequestHandler implements IRequestHandler
         RESOURCE_LIST("resourcelist", CAPABILITY_LIST, true)
         {
             @Override
-            void writeUrls(XMLStreamWriter writer, DeliveryContext context, IDataSourceQueryService queryService, IDeliverer deliverer,
-                    Map<String, List<String>> parameterMap, String sessionToken, Date requestTimestamp) throws XMLStreamException
+            void writeUrls(WritingContext context) throws XMLStreamException
             {
                 SpaceSearchCriteria searchCriteria = new SpaceSearchCriteria();
                 SpaceFetchOptions fetchOptions = new SpaceFetchOptions();
-                List<Space> spaces = context.getV3api().searchSpaces(sessionToken, searchCriteria, fetchOptions).getObjects();
+                DeliveryContext deliveryContext = context.getDeliveryContext();
+                String sessionToken = context.getSessionToken();
+                List<Space> spaces = deliveryContext.getV3api().searchSpaces(sessionToken, searchCriteria, fetchOptions).getObjects();
                 List<String> spaceCodes = spaces.stream().map(Space::getCode).collect(Collectors.toList());
+                Map<String, List<String>> parameterMap = context.getParameterMap();
                 Set<String> requestedSpaces = DataSourceUtils.getRequestedAndAllowedSubSet(spaceCodes,
                         parameterMap.get("white_list"), parameterMap.get("black_list"));
-                deliverer.deliverEntities(writer, queryService, sessionToken, requestedSpaces, requestTimestamp);
+                IDeliverer deliverer = context.getDeliverer();
+                IDataSourceQueryService queryService = context.getQueryService();
+                DeliveryExecutionContext executionContext = new DeliveryExecutionContext();
+                executionContext.setQueryService(queryService);
+                executionContext.setRequestTimestamp(context.getRequestTimestamp());
+                executionContext.setSessionToken(sessionToken);
+                executionContext.setSpaces(requestedSpaces);
+                executionContext.setWriter(context.getWriter());
+                deliverer.deliverEntities(executionContext);
             }
         };
 
@@ -109,30 +119,31 @@ public class DataSourceRequestHandler implements IRequestHandler
             return name + ".xml";
         }
 
-        void write(XMLStreamWriter writer, DeliveryContext context, IDataSourceQueryService queryService, IDeliverer deliverer,
-                Map<String, List<String>> parameterMap, String sessionToken, Date requestTimestamp) throws XMLStreamException
+        void write(WritingContext context) throws XMLStreamException
         {
+            XMLStreamWriter writer = context.getWriter();
             writer.writeStartElement("rs:ln");
             String verb = up == null ? asVerb() : up.asVerb();
-            writer.writeAttribute("href", createDownloadUrl(context, verb));
+            writer.writeAttribute("href", createDownloadUrl(context.getDeliveryContext(), verb));
             writer.writeAttribute("rel", up == null ? "describedby" : "up");
             writer.writeEndElement();
             writer.writeStartElement("rs:md");
             if (withAt)
             {
+                Date requestTimestamp = context.getRequestTimestamp();
                 writer.writeAttribute("at", DataSourceUtils.convertToW3CDate(requestTimestamp));
             }
             writer.writeAttribute("capability", capabilityAttribute);
             writer.writeEndElement();
-            writeUrls(writer, context, queryService, deliverer, parameterMap, sessionToken, requestTimestamp);
+            writeUrls(context);
         }
 
-        void writeUrls(XMLStreamWriter writer, DeliveryContext context, IDataSourceQueryService queryService, IDeliverer deliverer,
-                Map<String, List<String>> parameterMap, String sessionToken, Date requestTimestamp) throws XMLStreamException
+        void writeUrls(WritingContext context) throws XMLStreamException
         {
+            XMLStreamWriter writer = context.getWriter();
             writer.writeStartElement("url");
             writer.writeStartElement("loc");
-            writer.writeCharacters(createDownloadUrl(context, down.asVerb()));
+            writer.writeCharacters(createDownloadUrl(context.getDeliveryContext(), down.asVerb()));
             writer.writeEndElement();
             writer.writeStartElement("rs:md");
             writer.writeAttribute("capability", down.name);
@@ -193,7 +204,15 @@ public class DataSourceRequestHandler implements IRequestHandler
             Date requestTimestamp = getRequestTimestamp(queryService);
             Set<String> verbs = new HashSet<>(parameterMap.get("verb"));
             Capability capability = findMatchingCapability(verbs);
-            capability.write(writer, deliveryContext, queryService, deliverer, parameterMap, sessionToken, requestTimestamp);
+            WritingContext writingContext = new WritingContext();
+            writingContext.setWriter(writer);
+            writingContext.setDeliveryContext(deliveryContext);
+            writingContext.setQueryService(queryService);
+            writingContext.setDeliverer(deliverer);
+            writingContext.setParameterMap(parameterMap);
+            writingContext.setSessionToken(sessionToken);
+            writingContext.setRequestTimestamp(requestTimestamp);
+            capability.write(writingContext);
             writer.writeEndElement();
             writer.writeEndDocument();
         } catch (Exception e)
@@ -243,4 +262,90 @@ public class DataSourceRequestHandler implements IRequestHandler
         return parameterMap;
     }
 
+    private static final class WritingContext
+    {
+        private XMLStreamWriter writer;
+
+        private DeliveryContext context;
+
+        private IDataSourceQueryService queryService;
+
+        private IDeliverer deliverer;
+
+        private Map<String, List<String>> parameterMap;
+
+        private String sessionToken;
+
+        private Date requestTimestamp;
+
+        public XMLStreamWriter getWriter()
+        {
+            return writer;
+        }
+
+        public void setWriter(XMLStreamWriter writer)
+        {
+            this.writer = writer;
+        }
+
+        public DeliveryContext getDeliveryContext()
+        {
+            return context;
+        }
+
+        public void setDeliveryContext(DeliveryContext context)
+        {
+            this.context = context;
+        }
+
+        public IDataSourceQueryService getQueryService()
+        {
+            return queryService;
+        }
+
+        public void setQueryService(IDataSourceQueryService queryService)
+        {
+            this.queryService = queryService;
+        }
+
+        public IDeliverer getDeliverer()
+        {
+            return deliverer;
+        }
+
+        public void setDeliverer(IDeliverer deliverer)
+        {
+            this.deliverer = deliverer;
+        }
+
+        public Map<String, List<String>> getParameterMap()
+        {
+            return parameterMap;
+        }
+
+        public void setParameterMap(Map<String, List<String>> parameterMap)
+        {
+            this.parameterMap = parameterMap;
+        }
+
+        public String getSessionToken()
+        {
+            return sessionToken;
+        }
+
+        public void setSessionToken(String sessionToken)
+        {
+            this.sessionToken = sessionToken;
+        }
+
+        public Date getRequestTimestamp()
+        {
+            return requestTimestamp;
+        }
+
+        public void setRequestTimestamp(Date requestTimestamp)
+        {
+            this.requestTimestamp = requestTimestamp;
+        }
+    }
 }
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/Deliverers.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/Deliverers.java
index 580c0ac7c8e..56fe763d63e 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/Deliverers.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/Deliverers.java
@@ -17,14 +17,9 @@
 package ch.ethz.sis.openbis.generic.server.dss.plugins.sync.datasource;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
-import java.util.Set;
 
 import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
-import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.IDataSourceQueryService;
 
 /**
  * @author Franz-Josef Elmer
@@ -39,11 +34,11 @@ public class Deliverers implements IDeliverer
     }
 
     @Override
-    public void deliverEntities(XMLStreamWriter writer, IDataSourceQueryService queryService, String sessionToken, Set<String> spaces, Date requestTimestamp) throws XMLStreamException
+    public void deliverEntities(DeliveryExecutionContext context) throws XMLStreamException
     {
         for (IDeliverer deliverer : deliverers)
         {
-            deliverer.deliverEntities(writer, queryService, sessionToken, spaces, requestTimestamp);
+            deliverer.deliverEntities(context);
         }
     }
 
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DeliveryExecutionContext.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DeliveryExecutionContext.java
new file mode 100644
index 00000000000..8f40605510b
--- /dev/null
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/DeliveryExecutionContext.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2019 ETH Zuerich, SIS
+ *
+ * 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.ethz.sis.openbis.generic.server.dss.plugins.sync.datasource;
+
+import java.util.Date;
+import java.util.Set;
+
+import javax.xml.stream.XMLStreamWriter;
+
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.IDataSourceQueryService;
+
+/**
+ * @author Franz-Josef Elmer
+ */
+class DeliveryExecutionContext
+{
+    private XMLStreamWriter writer;
+
+    private IDataSourceQueryService queryService;
+
+    private String sessionToken;
+
+    private Set<String> spaces;
+
+    private Date requestTimestamp;
+
+    public XMLStreamWriter getWriter()
+    {
+        return writer;
+    }
+
+    public void setWriter(XMLStreamWriter writer)
+    {
+        this.writer = writer;
+    }
+
+    public IDataSourceQueryService getQueryService()
+    {
+        return queryService;
+    }
+
+    public void setQueryService(IDataSourceQueryService queryService)
+    {
+        this.queryService = queryService;
+    }
+
+    public String getSessionToken()
+    {
+        return sessionToken;
+    }
+
+    public void setSessionToken(String sessionToken)
+    {
+        this.sessionToken = sessionToken;
+    }
+
+    public Set<String> getSpaces()
+    {
+        return spaces;
+    }
+
+    public void setSpaces(Set<String> spaces)
+    {
+        this.spaces = spaces;
+    }
+
+    public Date getRequestTimestamp()
+    {
+        return requestTimestamp;
+    }
+
+    public void setRequestTimestamp(Date requestTimestamp)
+    {
+        this.requestTimestamp = requestTimestamp;
+    }
+}
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ExperimentDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ExperimentDeliverer.java
index 3001f89d6bd..ad20d53b45c 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ExperimentDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ExperimentDeliverer.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.ExperimentFetchOptions;
@@ -42,11 +43,14 @@ public class ExperimentDeliverer extends AbstractEntityWithPermIdDeliverer
     }
 
     @Override
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<String> experiments)
-            throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<String> experiments) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
+        String sessionToken = context.getSessionToken();
+        Set<String> spaces = context.getSpaces();
+        IApplicationServerApi v3api = getV3Api();
         List<ExperimentPermId> permIds = experiments.stream().map(ExperimentPermId::new).collect(Collectors.toList());
-        Collection<Experiment> fullExperiments = context.getV3api().getExperiments(sessionToken, permIds, createFullFetchOptions()).values();
+        Collection<Experiment> fullExperiments = v3api.getExperiments(sessionToken, permIds, createFullFetchOptions()).values();
         int count = 0;
         for (Experiment experiment : fullExperiments)
         {
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/IDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/IDeliverer.java
index aca57a8ea1b..3ffa75cacaa 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/IDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/IDeliverer.java
@@ -16,13 +16,7 @@
 
 package ch.ethz.sis.openbis.generic.server.dss.plugins.sync.datasource;
 
-import java.util.Date;
-import java.util.Set;
-
 import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
-import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.IDataSourceQueryService;
 
 /**
  * @author Franz-Josef Elmer
@@ -32,7 +26,6 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.IDataSourceQuery
 interface IDeliverer
 {
 
-    void deliverEntities(XMLStreamWriter writer, IDataSourceQueryService queryService, String sessionToken, 
-            Set<String> spaces, Date requestTimestamp) throws XMLStreamException;
+    void deliverEntities(DeliveryExecutionContext context) throws XMLStreamException;
 
 }
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MasterDataDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MasterDataDeliverer.java
index d7e2421df9d..c4c3824b814 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MasterDataDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MasterDataDeliverer.java
@@ -18,7 +18,6 @@ package ch.ethz.sis.openbis.generic.server.dss.plugins.sync.datasource;
 
 import static ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant.INTERNAL_NAMESPACE_PREFIX;
 
-import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
@@ -90,14 +89,15 @@ public class MasterDataDeliverer extends AbstractEntityDeliverer<Object>
     }
 
     @Override
-    public void deliverEntities(XMLStreamWriter writer, IDataSourceQueryService queryService, 
-            String sessionToken, Set<String> spaces, Date requestTimestamp) throws XMLStreamException
+    public void deliverEntities(DeliveryExecutionContext context) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
         startUrlElement(writer);
         addLocation(writer, "MASTER_DATA", "MASTER_DATA");
-        addLastModificationDate(writer, requestTimestamp);
+        addLastModificationDate(writer, context.getRequestTimestamp());
         writer.writeStartElement("xmd:masterData");
-        addFileFormatTypes(writer, queryService, sessionToken);
+        String sessionToken = context.getSessionToken();
+        addFileFormatTypes(writer, context.getQueryService(), sessionToken);
         addValidationPlugins(writer, sessionToken);
         addVocabularies(writer, sessionToken);
         addPropertyTypes(writer, sessionToken);
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MaterialDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MaterialDeliverer.java
index 8529d6b0ee5..a6896053db0 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MaterialDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/MaterialDeliverer.java
@@ -27,6 +27,7 @@ import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.fetchoptions.MaterialFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.MaterialPermId;
@@ -55,11 +56,13 @@ public class MaterialDeliverer extends AbstractEntityDeliverer<Material>
     }
 
     @Override
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<Material> materials)
-            throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<Material> materials) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
+        String sessionToken = context.getSessionToken();
+        IApplicationServerApi v3api = getV3Api();
         List<MaterialPermId> permIds = materials.stream().map(Material::getPermId).collect(Collectors.toList());
-        Collection<Material> fullMaterials = context.getV3api().getMaterials(sessionToken, permIds, createFullFetchOptions()).values();
+        Collection<Material> fullMaterials = v3api.getMaterials(sessionToken, permIds, createFullFetchOptions()).values();
         for (Material material : fullMaterials)
         {
             startUrlElement(writer);
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ProjectDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ProjectDeliverer.java
index 69b3f75a533..b7d37ab9cb4 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ProjectDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/ProjectDeliverer.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions.ProjectFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
@@ -41,10 +42,14 @@ public class ProjectDeliverer extends AbstractEntityWithPermIdDeliverer
     }
 
     @Override
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<String> projectPermIds) throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<String> projectPermIds) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
+        String sessionToken = context.getSessionToken();
+        Set<String> spaces = context.getSpaces();
+        IApplicationServerApi v3api = getV3Api();
         List<ProjectPermId> permIds = projectPermIds.stream().map(ProjectPermId::new).collect(Collectors.toList());
-        Collection<Project> fullProjects = context.getV3api().getProjects(sessionToken, permIds, createFullFetchOptions()).values();
+        Collection<Project> fullProjects = v3api.getProjects(sessionToken, permIds, createFullFetchOptions()).values();
         int count = 0;
         for (Project project : fullProjects)
         {
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SampleDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SampleDeliverer.java
index 14ce682aa71..f8e52aa2390 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SampleDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SampleDeliverer.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
@@ -42,10 +43,14 @@ public class SampleDeliverer extends AbstractEntityWithPermIdDeliverer
     }
 
     @Override
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<String> samplePermIds) throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<String> samplePermIds) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
+        String sessionToken = context.getSessionToken();
+        Set<String> spaces = context.getSpaces();
+        IApplicationServerApi v3api = getV3Api();
         List<SamplePermId> permIds = samplePermIds.stream().map(SamplePermId::new).collect(Collectors.toList());
-        Collection<Sample> fullSamples = context.getV3api().getSamples(sessionToken, permIds, createFullFetchOptions()).values();
+        Collection<Sample> fullSamples = v3api.getSamples(sessionToken, permIds, createFullFetchOptions()).values();
         int count = 0;
         for (Sample sample : fullSamples)
         {
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SpaceDeliverer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SpaceDeliverer.java
index fa41473da13..767a792dc62 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SpaceDeliverer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/datasource/SpaceDeliverer.java
@@ -24,6 +24,7 @@ import java.util.stream.Collectors;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.fetchoptions.SpaceFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
@@ -41,10 +42,14 @@ public class SpaceDeliverer extends AbstractEntityWithPermIdDeliverer
     }
 
     @Override
-    protected void deliverEntities(XMLStreamWriter writer, String sessionToken, Set<String> spaces, List<String> allSpaces) throws XMLStreamException
+    protected void deliverEntities(DeliveryExecutionContext context, List<String> allSpaces) throws XMLStreamException
     {
+        XMLStreamWriter writer = context.getWriter();
+        String sessionToken = context.getSessionToken();
+        Set<String> spaces = context.getSpaces();
+        IApplicationServerApi v3api = getV3Api();
         List<SpacePermId> permIds = allSpaces.stream().map(SpacePermId::new).collect(Collectors.toList());
-        Collection<Space> fullSpaces = context.getV3api().getSpaces(sessionToken, permIds, createSpaceFetchOptions()).values();
+        Collection<Space> fullSpaces = v3api.getSpaces(sessionToken, permIds, createSpaceFetchOptions()).values();
         int count = 0;
         for (Space space : fullSpaces)
         {
-- 
GitLab