From e6b2a5fcc4f4e126e2f8e94bcdac375cff23f429 Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 31 May 2010 15:43:54 +0000
Subject: [PATCH] LMS-1503 Refactoring put implementation.

SVN: 16225
---
 .../server/api/v1/DssServiceRpcGeneric.java   |  38 +-----
 .../server/api/v1/PutDataSetExecutor.java     |  17 ++-
 .../server/api/v1/PutDataSetService.java      | 126 ++++++++++++++++++
 3 files changed, 141 insertions(+), 40 deletions(-)
 create mode 100644 datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetService.java

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java
index 1db8e4373f7..f9fed56c914 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java
@@ -25,7 +25,6 @@ import java.util.ArrayList;
 import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.dss.generic.server.AbstractDssServiceRpc;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.DataSetFileDTO;
@@ -41,26 +40,18 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
  */
 public class DssServiceRpcGeneric extends AbstractDssServiceRpc implements IDssServiceRpcGeneric
 {
-    private final File incomingDir;
-
     static Logger getOperationLog()
     {
         return operationLog;
     }
 
+    private final PutDataSetService putService;
+
     public DssServiceRpcGeneric(IEncapsulatedOpenBISService openBISService)
     {
         super(openBISService);
-        incomingDir = new File(System.getProperty("java.io.tmpdir"), "dss_rpc_incoming");
-        incomingDir.mkdir();
+        putService = new PutDataSetService(openBISService);
         operationLog.info("[rpc] Started DSS API V1 service.");
-        intializeFromProperties();
-    }
-
-    private void intializeFromProperties()
-    {
-        // ExtendedProperties props = DssPropertyParametersUtil.loadServiceProperties();
-        // Parameters.createThreadParameters(props);
     }
 
     public FileInfoDssDTO[] listFilesForDataSet(String sessionToken, String dataSetCode,
@@ -109,28 +100,7 @@ public class DssServiceRpcGeneric extends AbstractDssServiceRpc implements IDssS
     public void putDataSet(String sessionToken, NewDataSetDTO newDataSet, InputStream inputStream)
             throws IOExceptionUnchecked, IllegalArgumentException
     {
-        try
-        {
-            new PutDataSetExecutor(getOpenBISService(), incomingDir, sessionToken, newDataSet,
-                    inputStream).execute();
-
-        } catch (UserFailureException e)
-        {
-            throw new IllegalArgumentException(e);
-        } catch (IOException e)
-        {
-            throw new IOExceptionUnchecked(e);
-        } finally
-        {
-            // Close the input stream now that we are done with it
-            try
-            {
-                inputStream.close();
-            } catch (IOException ex)
-            {
-
-            }
-        }
+        putService.putDataSet(sessionToken, newDataSet, inputStream);
     }
 
     public int getMajorVersion()
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetExecutor.java
index c555b9e3331..bf6ef417205 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetExecutor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetExecutor.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 class PutDataSetExecutor
 {
     // General State
-    private final IEncapsulatedOpenBISService openBisService;
+    private final PutDataSetService service;
 
     // Command Context State
     private final String sessionToken;
@@ -59,14 +59,14 @@ class PutDataSetExecutor
 
     private final File dataSetDir;
 
-    PutDataSetExecutor(IEncapsulatedOpenBISService openBisService, File incomingDir,
-            String sessionToken, NewDataSetDTO newDataSet, InputStream inputStream)
+    PutDataSetExecutor(PutDataSetService service, String sessionToken, NewDataSetDTO newDataSet,
+            InputStream inputStream)
     {
-        this.openBisService = openBisService;
+        this.service = service;
         this.sessionToken = sessionToken;
         this.newDataSet = newDataSet;
         this.inputStream = inputStream;
-        this.dataSetDir = new File(incomingDir, newDataSet.getDataSetFolderName());
+        this.dataSetDir = new File(service.getIncomingDir(), newDataSet.getDataSetFolderName());
         if (false == this.dataSetDir.mkdir())
         {
             throw new EnvironmentFailureException("Could not create directory for data set "
@@ -85,7 +85,7 @@ class PutDataSetExecutor
         // Check that the session owner has at least user access to the space the new data
         // set should belongs to
         SpaceIdentifier spaceId = getSpaceIdentifierForNewDataSet();
-        openBisService.checkSpaceAccess(sessionToken, spaceId);
+        getOpenBisService().checkSpaceAccess(sessionToken, spaceId);
 
         writeDataSetToTempDirectory();
 
@@ -157,4 +157,9 @@ class PutDataSetExecutor
         }
         return spaceId;
     }
+
+    private IEncapsulatedOpenBISService getOpenBisService()
+    {
+        return service.getOpenBisService();
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetService.java
new file mode 100644
index 00000000000..813abd78258
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/PutDataSetService.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2010 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.generic.server.api.v1;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.common.mail.MailClient;
+import ch.systemsx.cisd.etlserver.IETLServerPlugin;
+import ch.systemsx.cisd.etlserver.Parameters;
+import ch.systemsx.cisd.etlserver.ThreadParameters;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
+
+/**
+ * Helper class that maintains the state for handling put requests. The requests themselves are
+ * serviced by the {@link PutDataSetExecutor}.
+ * 
+ * @author Chandrasekhar Ramakrishnan
+ */
+class PutDataSetService
+{
+    private final IEncapsulatedOpenBISService openBisService;
+
+    private final MailClient mailClient;
+
+    private final File incomingDir;
+
+    PutDataSetService(IEncapsulatedOpenBISService openBisService)
+    {
+        this.openBisService = openBisService;
+
+        PutDataSetServiceInitializer initializer = new PutDataSetServiceInitializer();
+
+        incomingDir = initializer.getIncomingDir();
+        incomingDir.mkdir();
+
+        mailClient = new MailClient(initializer.getMailProperties());
+    }
+
+    void putDataSet(String sessionToken, NewDataSetDTO newDataSet, InputStream inputStream)
+            throws IOExceptionUnchecked, IllegalArgumentException
+    {
+        try
+        {
+            new PutDataSetExecutor(this, sessionToken, newDataSet, inputStream).execute();
+
+        } catch (UserFailureException e)
+        {
+            throw new IllegalArgumentException(e);
+        } catch (IOException e)
+        {
+            throw new IOExceptionUnchecked(e);
+        } finally
+        {
+            // Close the input stream now that we are done with it
+            try
+            {
+                inputStream.close();
+            } catch (IOException ex)
+            {
+
+            }
+        }
+    }
+
+    IEncapsulatedOpenBISService getOpenBisService()
+    {
+        return openBisService;
+    }
+
+    MailClient getMailClient()
+    {
+        return mailClient;
+    }
+
+    File getIncomingDir()
+    {
+        return incomingDir;
+    }
+}
+
+/**
+ * Helper class to simplify initializing the final fields of the {@link PutDataSetService}.
+ * 
+ * @author Chandrasekhar Ramakrishnan
+ */
+class PutDataSetServiceInitializer
+{
+    private final Parameters params = new Parameters();
+
+    File getIncomingDir()
+    {
+        return new File(System.getProperty("java.io.tmpdir"), "dss_rpc_incoming");
+    }
+
+    Properties getMailProperties()
+    {
+        return Parameters.createMailProperties(params.getProperties());
+    }
+
+    IETLServerPlugin getPlugin()
+    {
+        ThreadParameters[] threadParams = params.getThreads();
+        return threadParams[0].getPlugin();
+    }
+
+}
-- 
GitLab