From 06dc66559b7f792431620d7d334c7f19f9a5742d Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 13 Aug 2012 12:44:54 +0000
Subject: [PATCH] BIS-146 SP-232 : Added support for regex in applicible types
 of reporting and processing plugins.

SVN: 26354
---
 .../openbis/generic/server/ETLService.java    |  26 ++--
 .../shared/dto/DataStoreServicePE.java        |   2 +-
 .../generic/server/ETLServiceTest.java        | 126 ++++++++++++++++--
 3 files changed, 130 insertions(+), 24 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index 1eaf9fd04e9..6e8c0859189 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -424,29 +424,31 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     /**
      * Find the data set type objects specified by the dataSetTypeCodes.
      * 
-     * @return A set of DataSetTypePE objects or null if all data set types are explicitly
-     *         specified.
+     * @return A set of DataSetTypePE objects.
      */
     private Set<DataSetTypePE> extractDatasetTypes(String[] dataSetTypeCodes,
             DatastoreServiceDescription serviceDescription)
     {
-        // "*" means accept all data set types
-        if (dataSetTypeCodes.length == 1 && "*".equals(dataSetTypeCodes[0]))
-        {
-            return null;
-        }
         Set<DataSetTypePE> dataSetTypes = new HashSet<DataSetTypePE>();
         Set<String> missingCodes = new HashSet<String>();
         IDataSetTypeDAO dataSetTypeDAO = daoFactory.getDataSetTypeDAO();
+        List<DataSetTypePE> allDataSetTypes = dataSetTypeDAO.listAllEntities();
+
         for (String dataSetTypeCode : dataSetTypeCodes)
         {
-            DataSetTypePE datasetType = dataSetTypeDAO.tryToFindDataSetTypeByCode(dataSetTypeCode);
-            if (datasetType == null)
+            boolean found = false;
+            // Try to find the specified data set type
+            for (DataSetTypePE dataSetType : allDataSetTypes)
             {
-                missingCodes.add(dataSetTypeCode);
-            } else
+                if (dataSetType.getCode().matches(dataSetTypeCode))
+                {
+                    dataSetTypes.add(dataSetType);
+                    found = true;
+                }
+            }
+            if (false == found)
             {
-                dataSetTypes.add(datasetType);
+                missingCodes.add(dataSetTypeCode);
             }
         }
         if (missingCodes.size() > 0)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java
index d37a9db635c..8f3e2a3e7d2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataStoreServicePE.java
@@ -71,7 +71,7 @@ public class DataStoreServicePE implements Serializable
 
     private DataStorePE dataStore;
 
-    // which types of datasets can be processed by this plugin? If null, all types are appropriate.
+    // which types of datasets can be processed by this plugin?
     private Set<DataSetTypePE> datasetTypes;
 
     @SuppressWarnings("unused")
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
index 69e03816c38..374b9bcbfbc 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceTest.java
@@ -80,6 +80,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetShareId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServerInfo;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
@@ -298,15 +299,37 @@ public class ETLServiceTest extends AbstractServerTestCase
 
     private void prepareFindDatasetTypes(Expectations exp)
     {
-        exp.allowing(dataSetTypeDAO).tryToFindDataSetTypeByCode(DATA_SET_TYPE_CODE);
-        exp.will(Expectations.returnValue(new DataSetTypePE()));
-        exp.allowing(dataSetTypeDAO).tryToFindDataSetTypeByCode(UNKNOWN_DATA_SET_TYPE_CODE);
-        exp.will(Expectations.returnValue(null));
+        ArrayList<DataSetTypePE> allDataSetTypes = getAllDataSetTypes();
+
+        exp.allowing(dataSetTypeDAO).listAllEntities();
+        exp.will(Expectations.returnValue(allDataSetTypes));
+    }
+
+    protected ArrayList<DataSetTypePE> getAllDataSetTypes()
+    {
+        // Prepare the collection of data set types
+        DataSetTypePE dataSetType;
+        ArrayList<DataSetTypePE> allDataSetTypes = new ArrayList<DataSetTypePE>();
+
+        dataSetType = new DataSetTypePE();
+        dataSetType.setCode(DATA_SET_TYPE_CODE);
+        allDataSetTypes.add(dataSetType);
+
+        dataSetType = new DataSetTypePE();
+        dataSetType.setCode("dataSetTypeCode2");
+        allDataSetTypes.add(dataSetType);
+
+        dataSetType = new DataSetTypePE();
+        dataSetType.setCode("differentPrefix");
+        allDataSetTypes.add(dataSetType);
+        return allDataSetTypes;
     }
 
     @Test
     public void testRegisterDataStoreServerAgain()
     {
+        final String reportingPluginTypes = ".*";
+        final String processingPluginTypes = "dataSet.*";
         prepareGetSession();
         prepareGetVersion();
         context.checking(new Expectations()
@@ -334,20 +357,72 @@ public class ETLServiceTest extends AbstractServerTestCase
                                         if (item instanceof DataStorePE)
                                         {
                                             DataStorePE store = (DataStorePE) item;
-                                            return DSS_CODE.equals(store.getCode())
-                                                    && URL.equals(store.getRemoteUrl())
-                                                    && DOWNLOAD_URL.equals(store.getDownloadUrl())
-                                                    && DSS_SESSION_TOKEN.equals(store
-                                                            .getSessionToken());
+                                            boolean basicMatch =
+                                                    DSS_CODE.equals(store.getCode())
+                                                            && URL.equals(store.getRemoteUrl())
+                                                            && DOWNLOAD_URL.equals(store
+                                                                    .getDownloadUrl())
+                                                            && DSS_SESSION_TOKEN.equals(store
+                                                                    .getSessionToken());
+                                            // To workaround a hibernate bug, data stores are once
+                                            // registered with no services
+                                            if (false == basicMatch
+                                                    || store.getServices().isEmpty())
+                                            {
+                                                return basicMatch;
+                                            }
+
+                                            for (DataStoreServicePE service : store.getServices())
+                                            {
+                                                // Check that the types found match those specified
+                                                if (service.getKind() == DataStoreServiceKind.PROCESSING)
+                                                {
+                                                    // expect 2 matches
+                                                    if (false == isDataSetTypeMatch(service,
+                                                            processingPluginTypes, 2))
+                                                    {
+                                                        return false;
+                                                    }
+                                                }
+                                                if (service.getKind() == DataStoreServiceKind.QUERIES)
+                                                {
+                                                    // expect 3 matches
+                                                    if (false == isDataSetTypeMatch(service,
+                                                            reportingPluginTypes, 3))
+                                                    {
+                                                        return false;
+                                                    }
+                                                }
+                                            }
+
+                                            return true;
                                         }
                                         return false;
                                     }
 
+                                    private boolean isDataSetTypeMatch(DataStoreServicePE service,
+                                            String typeRegex, int numberExpected)
+                                    {
+                                        Set<DataSetTypePE> datasetTypes = service.getDatasetTypes();
+                                        if (datasetTypes.isEmpty())
+                                        {
+                                            return false;
+                                        }
+                                        for (DataSetTypePE types : datasetTypes)
+                                        {
+                                            if (false == types.getCode().matches(typeRegex))
+                                            {
+                                                return false;
+                                            }
+                                        }
+                                        return datasetTypes.size() == numberExpected;
+                                    }
+
                                 }));
                 }
             });
-
-        createService().registerDataStoreServer(SESSION_TOKEN, createDSSInfo());
+        createService().registerDataStoreServer(SESSION_TOKEN,
+                createDSSInfoWithWildcards(reportingPluginTypes, processingPluginTypes));
 
         context.assertIsSatisfied();
     }
@@ -1366,6 +1441,26 @@ public class ETLServiceTest extends AbstractServerTestCase
         return info;
     }
 
+    private DataStoreServerInfo createDSSInfoWithWildcards(String reportingPluginTypes,
+            String processingPluginTypes)
+    {
+        DataStoreServerInfo info = new DataStoreServerInfo();
+        info.setPort(PORT);
+        info.setSessionToken(DSS_SESSION_TOKEN);
+        info.setDataStoreCode(DSS_CODE);
+        info.setDownloadUrl(DOWNLOAD_URL);
+        List<DatastoreServiceDescription> reporting =
+                Arrays.asList(createDataStoreServiceForWildcardTypes(DataStoreServiceKind.QUERIES,
+                        "reporting", reportingPluginTypes));
+        List<DatastoreServiceDescription> processing =
+                Arrays.asList(createDataStoreServiceForWildcardTypes(
+                        DataStoreServiceKind.PROCESSING, "processing", processingPluginTypes));
+        DatastoreServiceDescriptions services =
+                new DatastoreServiceDescriptions(reporting, processing);
+        info.setServicesDescriptions(services);
+        return info;
+    }
+
     @SuppressWarnings("deprecation")
     private static DatastoreServiceDescription createDataStoreService(
             DataStoreServiceKind serviceKind, String key)
@@ -1375,6 +1470,15 @@ public class ETLServiceTest extends AbstractServerTestCase
             { DATA_SET_TYPE_CODE, UNKNOWN_DATA_SET_TYPE_CODE }, key, serviceKind);
     }
 
+    @SuppressWarnings("deprecation")
+    private static DatastoreServiceDescription createDataStoreServiceForWildcardTypes(
+            DataStoreServiceKind serviceKind, String key, String regex)
+    {
+        // wildcards should be handled correctly
+        return new DatastoreServiceDescription(key, key, new String[]
+            { regex }, key, serviceKind);
+    }
+
     private void assignRoles(PersonPE person)
     {
         final Set<RoleAssignmentPE> list = new HashSet<RoleAssignmentPE>();
-- 
GitLab