From a4e74705dcab3a5737361742dc9680856542dff7 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Thu, 9 Apr 2009 14:20:07 +0000
Subject: [PATCH] LMS-809 Communication between DSS and openBIS server changed,
 new service properties for DSS code and download URL introduced

SVN: 10662
---
 datastore_server/dist/etc/service.properties  |  6 ++
 datastore_server/etc/service.properties       |  6 ++
 .../source/java/applicationContext.xml        |  8 ++-
 .../ch/systemsx/cisd/etlserver/ETLDaemon.java |  8 ++-
 .../etlserver/TransferredDataSetHandler.java  | 13 +++--
 .../server/DataStoreServiceLogger.java        |  2 +-
 .../server/EncapsulatedOpenBISService.java    | 57 ++++++++++++++-----
 .../TransferredDataSetHandlerTest.java        | 12 ++--
 .../EncapsulatedOpenBISServiceTest.java       | 47 +++++++++++----
 9 files changed, 121 insertions(+), 38 deletions(-)

diff --git a/datastore_server/dist/etc/service.properties b/datastore_server/dist/etc/service.properties
index 3255029161d..487dfa5de25 100644
--- a/datastore_server/dist/etc/service.properties
+++ b/datastore_server/dist/etc/service.properties
@@ -1,3 +1,6 @@
+# Unique code of this Data Store Server. Not more than 40 characters.
+data-store-server-code = DSS1
+
 # The root directory of the data store
 storeroot-dir = data/store
 
@@ -45,6 +48,9 @@ username = etlserver
 # The password to use when contacting the openBIS server
 password = etlserver
 
+# The base URL for Web client access.
+download-url = https://localhost:8889
+
 # SMTP properties (must start with 'mail' to be considered). 
 # mail.smtp.host = localhost
 # mail.from = datastore_server@localhost
diff --git a/datastore_server/etc/service.properties b/datastore_server/etc/service.properties
index 3fe083d39a8..8e890e0101c 100644
--- a/datastore_server/etc/service.properties
+++ b/datastore_server/etc/service.properties
@@ -1,3 +1,6 @@
+# Unique code of this Data Store Server. Not more than 40 characters.
+data-store-server-code = my-dss
+
 # The root directory of the data store
 storeroot-dir = targets/store
 
@@ -43,6 +46,9 @@ username = etlserver
 # The password to use when contacting the openBIS server
 password = doesnotmatter
 
+# The base URL for Web client access.
+download-url = https://localhost:8889
+
 # SMTP properties (must start with 'mail' to be considered).
 # mail.smtp.host = localhost
 # mail.from = datastore_server@localhost
diff --git a/datastore_server/source/java/applicationContext.xml b/datastore_server/source/java/applicationContext.xml
index 39f4e82c0da..20b51472da4 100644
--- a/datastore_server/source/java/applicationContext.xml
+++ b/datastore_server/source/java/applicationContext.xml
@@ -22,9 +22,11 @@
     <bean id="openBIS-service" class="ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService">
         <constructor-arg ref="session-token-manager"/>
         <constructor-arg value="${server-url}"/>
-        <constructor-arg value="${port}"/>
-        <constructor-arg value="${username}"/>
-        <constructor-arg value="${password}"/>
+        <property name="username" value="${username}"/>
+        <property name="password" value="${password}"/>
+        <property name="port" value="${port}"/>
+        <property name="downloadUrl" value="${download-url}"/>
+        <property name="dataStoreCode" value="${data-store-server-code}"/>
     </bean>    
     
     <bean id="data-store-server"
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
index 23ebd9bfcb5..822547f4c8d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
@@ -75,6 +75,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 public final class ETLDaemon
 {
     static final String STOREROOT_DIR_KEY = "storeroot-dir";
+    static final String DSS_CODE_KEY = "data-store-server-code";
 
     static final String NOTIFY_SUCCESSFUL_REGISTRATION = "notify-successful-registration";
 
@@ -343,8 +344,13 @@ public final class ETLDaemon
         migrateDataStoreByRenamingObservableTypeToDataSetType(storeRootDir);
         plugin.getStorageProcessor().setStoreRootDirectory(storeRootDir);
         final Properties mailProperties = parameters.getMailProperties();
+        String dssCode = parameters.getProperties().getProperty(DSS_CODE_KEY);
+        if (dssCode == null)
+        {
+            throw new ConfigurationFailureException("Missing service property '" + DSS_CODE_KEY + "'");
+        }
         final TransferredDataSetHandler pathHandler =
-                new TransferredDataSetHandler(threadParameters.tryGetGroupCode(), plugin,
+                new TransferredDataSetHandler(threadParameters.tryGetGroupCode(), dssCode, plugin,
                         authorizedLimsService, mailProperties, highwaterMarkWatcher,
                         notifySuccessfulRegistration, threadParameters.useIsFinishedMarkerFile());
         pathHandler.setProcessorFactories(processorFactories);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java
index f0cb6579050..bf62cdf2cdf 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandler.java
@@ -119,6 +119,8 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta
 
     private final String groupCode;
 
+    private final String dssCode;
+    
     private final boolean notifySuccessfulRegistration;
 
     private final boolean useIsFinishedMarkerFile;
@@ -130,33 +132,35 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta
 
     private DatabaseInstancePE homeDatabaseInstance;
 
-    /**
+    /**
      * @param useIsFinishedMarkerFile if true, file/directory is processed when a marker file for it
      *            appears. Otherwise processing starts if the file/directory is not modified for a
      *            certain amount of time (so called "quiet period").
      */
-    public TransferredDataSetHandler(final String groupCode, final IETLServerPlugin plugin,
+    public TransferredDataSetHandler(final String groupCode, String dssCode, final IETLServerPlugin plugin,
             final IEncapsulatedOpenBISService limsService, final Properties mailProperties,
             final HighwaterMarkWatcher highwaterMarkWatcher,
             final boolean notifySuccessfulRegistration, boolean useIsFinishedMarkerFile)
 
     {
-        this(groupCode, plugin.getStorageProcessor(), plugin, limsService, new MailClient(
+        this(groupCode, dssCode, plugin.getStorageProcessor(), plugin, limsService, new MailClient(
                 mailProperties), notifySuccessfulRegistration, useIsFinishedMarkerFile);
     }
 
-    TransferredDataSetHandler(final String groupCode,
+    TransferredDataSetHandler(final String groupCode, String dssCode, 
             final IStoreRootDirectoryHolder storeRootDirectoryHolder,
             final IETLServerPlugin plugin, final IEncapsulatedOpenBISService limsService,
             final IMailClient mailClient, final boolean notifySuccessfulRegistration,
             boolean useIsFinishedMarkerFile)
 
     {
+        assert dssCode != null : "Unspecified data store code";
         assert storeRootDirectoryHolder != null : "Given store root directory holder can not be null.";
         assert plugin != null : "IETLServerPlugin implementation can not be null.";
         assert limsService != null : "IEncapsulatedLimsService implementation can not be null.";
         assert mailClient != null : "IMailClient implementation can not be null.";
 
+        this.dssCode = dssCode;
         this.groupCode = groupCode;
         this.storeRootDirectoryHolder = storeRootDirectoryHolder;
         this.dataSetInfoExtractor = plugin.getDataSetInfoExtractor();
@@ -765,6 +769,7 @@ public final class TransferredDataSetHandler implements IPathHandler, ISelfTesta
             data.setMeasured(typeExtractor.isMeasuredData(incomingDataSetFile));
             data.setStorageFormat(storageFormat);
             data.setComplete(isCompleteFlag);
+            data.setDataStoreCode(dssCode);
             return data;
         }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java
index 7d66b7886b1..10c1f70c0ff 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java
@@ -92,7 +92,7 @@ class DataStoreServiceLogger implements IDataStoreService
         {
             builder.append(' ').append(externalDataPE.getCode());
         }
-        log("upload_data_sets", "USER(%s) LOCATIONS(%s)", context.getUserID(), builder.toString().trim());
+        log("upload_data_sets", "USER(%s) DATASETS(%s)", context.getUserID(), builder.toString().trim());
     }
 
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
index d8c48f7c2f1..7b19b094a61 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServerInfo;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalData;
@@ -51,44 +52,67 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     private static final Logger operationLog =
             LogFactory.getLogger(LogCategory.OPERATION, EncapsulatedOpenBISService.class);
 
-    private final int port;
-    
-    private final String username;
-
-    private final String password;
-
     private final IETLLIMSService service;
 
     private final SessionTokenManager sessionTokenManager;
     
+    private int port;
+    
+    private String username;
+    
+    private String password;
+    
+    private String downloadUrl;
+    
+    private String dataStoreCode;
+    
     private String sessionToken; // NOTE: can be changed in parallel by different threads
 
     private Integer version;
 
     private DatabaseInstancePE homeDatabaseInstance;
 
-    public EncapsulatedOpenBISService(SessionTokenManager sessionTokenManager, String serverURL,
-            int port, String username, String password)
+    public EncapsulatedOpenBISService(SessionTokenManager sessionTokenManager, String serverURL)
     {
         this(sessionTokenManager, HttpInvokerUtils.createServiceStub(IETLLIMSService.class,
-                serverURL + "/rmi-etl", 5), port, username, password);
+                serverURL + "/rmi-etl", 5));
     }
 
     public EncapsulatedOpenBISService(SessionTokenManager sessionTokenManager,
-            IETLLIMSService service, int port, String username, String password)
+            IETLLIMSService service)
     {
         assert sessionTokenManager != null : "Unspecified session token manager.";
         assert service != null : "Given IETLLIMSService implementation can not be null.";
-        assert username != null : "Given username can not be null.";
-        assert password != null : "Given password can not be null.";
 
         this.sessionTokenManager = sessionTokenManager;
         this.service = service;
+    }
+    
+    public final void setPort(int port)
+    {
         this.port = port;
+    }
+
+    public final void setUsername(String username)
+    {
         this.username = username;
+    }
+
+    public final void setPassword(String password)
+    {
         this.password = password;
     }
-    
+
+    public final void setDownloadUrl(String downloadUrl)
+    {
+        this.downloadUrl = downloadUrl;
+    }
+
+    public final void setDataStoreCode(String dataStoreCode)
+    {
+        this.dataStoreCode = dataStoreCode;
+    }
+
     public Object getObject() throws Exception
     {
         return this;
@@ -118,7 +142,12 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
                     "Authentication failure to openBIS server. Most probable cause: user or password are invalid.";
             throw new ConfigurationFailureException(msg);
         }
-        service.registerDataStoreServer(sessionToken, port, sessionTokenManager.drawSessionToken());
+        DataStoreServerInfo dataStoreServerInfo = new DataStoreServerInfo();
+        dataStoreServerInfo.setPort(port);
+        dataStoreServerInfo.setDataStoreCode(dataStoreCode);
+        dataStoreServerInfo.setDownloadUrl(downloadUrl);
+        dataStoreServerInfo.setSessionToken(sessionTokenManager.drawSessionToken());
+        service.registerDataStoreServer(sessionToken, dataStoreServerInfo);
     }
 
     private final void checkSessionToken()
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
index f5ca427307c..0fc18e3f573 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
@@ -57,10 +57,10 @@ import ch.systemsx.cisd.common.mail.JavaMailProperties;
 import ch.systemsx.cisd.common.test.LogMonitoringAppender;
 import ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.server.SessionTokenManager;
-import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServerInfo;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalData;
@@ -267,10 +267,12 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
         final IETLServerPlugin plugin =
                 new ETLServerPlugin(new MockDataSetInfoExtractor(dataSetInfoExtractor),
                         typeExtractor, storageProcessor);
-        final IEncapsulatedOpenBISService authorizedLimsService =
-                new EncapsulatedOpenBISService(new SessionTokenManager(), limsService, 0, "u", "p");
+        final EncapsulatedOpenBISService authorizedLimsService =
+                new EncapsulatedOpenBISService(new SessionTokenManager(), limsService);
+        authorizedLimsService.setUsername("u");
+        authorizedLimsService.setPassword("p");
         handler =
-                new TransferredDataSetHandler(null, storageProcessor, plugin,
+                new TransferredDataSetHandler(null, "dss", storageProcessor, plugin,
                         authorizedLimsService, mailClient, true, true);
 
         handler.setProcessorFactories(map);
@@ -389,7 +391,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
                     will(returnValue(SESSION_TOKEN));
 
                     one(limsService).registerDataStoreServer(with(equal(SESSION_TOKEN)),
-                            with(equal(0)), with(any(String.class)));
+                            with(any(DataStoreServerInfo.class)));
 
                     atLeast(1).of(limsService).tryToGetBaseExperiment(SESSION_TOKEN,
                             dataSetInformation.getSampleIdentifier());
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java
index 08e63deba5d..bfd00bdfc25 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISServiceTest.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server;
 
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.testng.annotations.AfterMethod;
@@ -23,14 +25,11 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.exceptions.InvalidSessionException;
-import ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService;
-import ch.systemsx.cisd.openbis.dss.generic.server.SessionTokenManager;
-import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServerInfo;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.types.ProcedureTypeCode;
 
 /**
  * Test cases for corresponding {@link EncapsulatedOpenBISService} class.
@@ -39,11 +38,17 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.types.ProcedureTypeCode;
  */
 public class EncapsulatedOpenBISServiceTest
 {
+    private static final int PORT = 4711;
+
+    private static final String DOWNLOAD_URL = "download-url";
+
+    private static final String DATA_STORE_CODE = "data-store1";
+
     private Mockery context;
 
     private IETLLIMSService limsService;
 
-    private IEncapsulatedOpenBISService encapsulatedLimsService;
+    private EncapsulatedOpenBISService encapsulatedLimsService;
 
     private static final String LIMS_USER = "testuser";
 
@@ -61,7 +66,7 @@ public class EncapsulatedOpenBISServiceTest
     {
         exp.one(limsService).authenticate(LIMS_USER, LIMS_PASSWORD);
         exp.one(limsService).registerDataStoreServer(exp.with(Expectations.equal("")),
-                exp.with(Expectations.equal(0)), exp.with(Expectations.any(String.class)));
+                exp.with(Expectations.any(DataStoreServerInfo.class)));
         exp.one(limsService).tryToGetBaseExperiment("", dataSetInformation.getSampleIdentifier());
     }
 
@@ -76,12 +81,35 @@ public class EncapsulatedOpenBISServiceTest
                     one(limsService).authenticate(LIMS_USER, LIMS_PASSWORD);
                     
                     one(limsService).registerDataStoreServer(
-                            with(equal("")), with(equal(0)), with(any(String.class)));
+                            with(equal("")), with(new BaseMatcher<DataStoreServerInfo>()
+                                {
+                            
+                                    public boolean matches(Object item)
+                                    {
+                                        if (item instanceof DataStoreServerInfo)
+                                        {
+                                            DataStoreServerInfo info = (DataStoreServerInfo) item;
+                                            return DATA_STORE_CODE.equals(info.getDataStoreCode())
+                                                    && DOWNLOAD_URL.equals(info.getDownloadUrl())
+                                                    && PORT == info.getPort();
+                                        }
+                                        return false;
+                                    }
+                            
+                                    public void describeTo(Description description)
+                                    {
+                                    }
+                            
+                                }));
                 }
             });
         encapsulatedLimsService =
-                new EncapsulatedOpenBISService(new SessionTokenManager(), limsService, 0,
-                        LIMS_USER, LIMS_PASSWORD);
+                new EncapsulatedOpenBISService(new SessionTokenManager(), limsService);
+        encapsulatedLimsService.setUsername(LIMS_USER);
+        encapsulatedLimsService.setPassword(LIMS_PASSWORD);
+        encapsulatedLimsService.setDataStoreCode(DATA_STORE_CODE);
+        encapsulatedLimsService.setDownloadUrl(DOWNLOAD_URL);
+        encapsulatedLimsService.setPort(PORT);
     }
 
     @AfterMethod
@@ -126,7 +154,6 @@ public class EncapsulatedOpenBISServiceTest
     public final void testRegisterDataSet()
     {
         final DataSetInformation dataSetInfo = createDataSetInformation();
-        final ProcedureTypeCode procedureTypeCode = ProcedureTypeCode.DATA_ACQUISITION;
         final ExternalData data = new ExternalData();
         context.checking(new Expectations()
             {
-- 
GitLab