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 1eaf9fd04e9b9d02c3e2bc62614ef98c75f0794a..6e8c085918908b96777eabb884ba08778e7065cf 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 d37a9db635c380f0c1e49e738162a5ea6d78ce23..8f3e2a3e7d29e2b368b3d1a82df1d3c8f7ed485f 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 69e03816c387110e7fac3b7644a575d160c05133..374b9bcbfbc5ce1094b0c54875dc5338e9b038a5 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>();