diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServiceProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServiceProvider.java index 42035264f9e5a7fe5a14df8b3fb9159319f10d2f..73b3aecf9f2d60e9969e79a93e15442ea019fce7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServiceProvider.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServiceProvider.java @@ -64,6 +64,11 @@ public class CommonServiceProvider return new MailClient(mailClientParameters); } + public static Object tryToGetBean(String beanName) + { + return applicationContext.getBean(beanName); + } + private CommonServiceProvider() { } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistrator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistrator.java index 3a0bd90e0b3ee0e66a016f2f86e9215a198c2a03..ea34f52d9a9a286a18de61868a3737013a4a4f37 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistrator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistrator.java @@ -41,6 +41,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServicePE; import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions; /** + * Implementation of {@link IDataStoreServiceRegistrator}. + * * @author Franz-Josef Elmer */ public class DataStoreServiceRegistrator implements IDataStoreServiceRegistrator @@ -90,22 +92,25 @@ public class DataStoreServiceRegistrator implements IDataStoreServiceRegistrator DatastoreServiceDescriptions serviceDescriptions) { Set<DataStoreServicePE> services = new HashSet<DataStoreServicePE>(); + IDataSetTypeDAO dataSetTypeDAO = daoFactory.getDataSetTypeDAO(); + List<DataSetTypePE> allDataSetTypes = dataSetTypeDAO.listAllEntities(); Set<DataStoreServicePE> processing = createDataStoreServices(serviceDescriptions.getProcessingServiceDescriptions(), - DataStoreServiceKind.PROCESSING); + DataStoreServiceKind.PROCESSING, allDataSetTypes); services.addAll(processing); Set<DataStoreServicePE> queries = createDataStoreServices(serviceDescriptions.getReportingServiceDescriptions(), - DataStoreServiceKind.QUERIES); + DataStoreServiceKind.QUERIES, allDataSetTypes); services.addAll(queries); return services; } private Set<DataStoreServicePE> createDataStoreServices( - List<DatastoreServiceDescription> serviceDescriptions, DataStoreServiceKind serviceKind) + List<DatastoreServiceDescription> serviceDescriptions, + DataStoreServiceKind serviceKind, List<DataSetTypePE> allDataSetTypes) { Set<DataStoreServicePE> services = new HashSet<DataStoreServicePE>(); for (DatastoreServiceDescription desc : serviceDescriptions) @@ -114,7 +119,8 @@ public class DataStoreServiceRegistrator implements IDataStoreServiceRegistrator service.setKey(desc.getKey()); service.setLabel(desc.getLabel()); service.setKind(serviceKind); - Set<DataSetTypePE> datasetTypes = extractDatasetTypes(desc.getDatasetTypeCodes(), desc); + Set<DataSetTypePE> datasetTypes = + extractDataSetTypes(desc.getDatasetTypeCodes(), desc, allDataSetTypes); service.setDatasetTypes(datasetTypes); service.setReportingPluginTypeOrNull(desc.tryReportingPluginType()); services.add(service); @@ -122,26 +128,19 @@ public class DataStoreServiceRegistrator implements IDataStoreServiceRegistrator return services; } - /** - * Find the data set type objects specified by the dataSetTypeCodes. - * - * @return A set of DataSetTypePE objects. - */ - private Set<DataSetTypePE> extractDatasetTypes(String[] dataSetTypeCodes, - DatastoreServiceDescription serviceDescription) + private Set<DataSetTypePE> extractDataSetTypes(String[] dataSetTypeCodePatterns, + DatastoreServiceDescription serviceDescription, List<DataSetTypePE> allDataSetTypes) { 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) + for (String pattern : dataSetTypeCodePatterns) { boolean found = false; // Try to find the specified data set type for (DataSetTypePE dataSetType : allDataSetTypes) { - if (dataSetType.getCode().matches(dataSetTypeCode)) + if (dataSetType.getCode().matches(pattern)) { dataSetTypes.add(dataSetType); found = true; @@ -149,7 +148,7 @@ public class DataStoreServiceRegistrator implements IDataStoreServiceRegistrator } if (false == found) { - missingCodes.add(dataSetTypeCode); + missingCodes.add(pattern); } } if (missingCodes.size() > 0) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IDataStoreServiceRegistrator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IDataStoreServiceRegistrator.java index 5067e2f34d333602b6e11cd7dc5460c403695791..809d2671031e09ba155d0309d30cee4cce6c8fb7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IDataStoreServiceRegistrator.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/IDataStoreServiceRegistrator.java @@ -21,10 +21,16 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE; import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions; /** + * Interface of the bean which handles registration of data store services. + * * @author Franz-Josef Elmer */ public interface IDataStoreServiceRegistrator { + /** + * Registers for the specified data store all reporting/processing plugins specified in the + * service descriptions. + */ public void setServiceDescriptions(DataStorePE dataStore, DatastoreServiceDescriptions serviceDescriptions); diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistratorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistratorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bb4ba2daf336ac4a3eea916429d17f9989c57452 --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/DataStoreServiceRegistratorTest.java @@ -0,0 +1,222 @@ +/* + * Copyright 2012 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.generic.server; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Set; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.testng.AssertJUnit; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.common.logging.BufferedAppender; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataSetTypeDAO; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDataStoreDAO; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ReportingPluginType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetTypeBuilder; +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.DataStoreServicePE; +import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions; + +/** + * @author Franz-Josef Elmer + */ +public class DataStoreServiceRegistratorTest extends AssertJUnit +{ + private static final String DATASTORE_CODE = "DSS"; + + private static final Comparator<DataStoreServicePE> SERVICE_COMPARATOR = + new Comparator<DataStoreServicePE>() + { + @Override + public int compare(DataStoreServicePE s1, DataStoreServicePE s2) + { + return s1.getKey().compareTo(s2.getKey()); + } + }; + + private BufferedAppender logRecorder; + + private Mockery context; + + private IDAOFactory daoFactory; + + private IDataStoreDAO dataStoreDAO; + + private IDataSetTypeDAO dataSetTypeDAO; + + private DataStoreServiceRegistrator dataStoreServiceRegistrator; + + @BeforeMethod + public void setUp() + { + logRecorder = new BufferedAppender(); + context = new Mockery(); + daoFactory = context.mock(IDAOFactory.class); + dataStoreDAO = context.mock(IDataStoreDAO.class); + dataSetTypeDAO = context.mock(IDataSetTypeDAO.class); + context.checking(new Expectations() + { + { + allowing(daoFactory).getDataStoreDAO(); + will(returnValue(dataStoreDAO)); + + allowing(daoFactory).getDataSetTypeDAO(); + will(returnValue(dataSetTypeDAO)); + } + }); + dataStoreServiceRegistrator = new DataStoreServiceRegistrator(daoFactory); + } + + @AfterMethod + public void tearDown() + { + logRecorder.reset(); + context.assertIsSatisfied(); + } + + @Test + public void testSetServiceDescriptions() + { + final DataStorePE dataStore = new DataStorePE(); + dataStore.setCode(DATASTORE_CODE); + DatastoreServiceDescription r1 = + DatastoreServiceDescription.reporting("R1", "r1", new String[] + { "A.*", "B" }, DATASTORE_CODE, ReportingPluginType.TABLE_MODEL); + DatastoreServiceDescription p1 = + DatastoreServiceDescription.processing("P1", "p1", new String[] + { "A.*", "C.*", "D" }, DATASTORE_CODE); + context.checking(new Expectations() + { + { + one(dataSetTypeDAO).listAllEntities(); + will(returnValue(Arrays.asList(dataSetType("A1"), dataSetType("B1"), + dataSetType("C1"), dataSetType("D"), dataSetType("D1")))); + + one(dataStoreDAO).createOrUpdateDataStore(dataStore); + } + }); + + dataStoreServiceRegistrator.setServiceDescriptions(dataStore, + new DatastoreServiceDescriptions(Arrays.asList(r1), Arrays.asList(p1))); + + List<DataStoreServicePE> services = + new ArrayList<DataStoreServicePE>(dataStore.getServices()); + Collections.sort(services, SERVICE_COMPARATOR); + assertEquals("P1", services.get(0).getKey()); + assertEquals("p1", services.get(0).getLabel()); + assertEquals(DataStoreServiceKind.PROCESSING, services.get(0).getKind()); + assertEquals(null, services.get(0).getReportingPluginTypeOrNull()); + assertEquals("[A1, C1, D]", extractedDataSetTypes(services.get(0)).toString()); + assertEquals("R1", services.get(1).getKey()); + assertEquals("r1", services.get(1).getLabel()); + assertEquals(DataStoreServiceKind.QUERIES, services.get(1).getKind()); + assertEquals(ReportingPluginType.TABLE_MODEL, services.get(1) + .getReportingPluginTypeOrNull()); + assertEquals("[A1]", extractedDataSetTypes(services.get(1)).toString()); + assertEquals(2, services.size()); + assertEquals("The Datastore Server Plugin '[QUERIES; R1; DSS; r1; A.* B ; TABLE_MODEL]' " + + "is misconfigured. It refers to the dataset types " + + "which do not exist in openBIS: [B]", logRecorder.getLogContent()); + context.assertIsSatisfied(); + } + + @Test + public void testRegister() + { + final DataStorePE dataStore = new DataStorePE(); + dataStore.setCode(DATASTORE_CODE); + DatastoreServiceDescription r1 = + DatastoreServiceDescription.reporting("R1", "r1", new String[] + { "A.*", "B" }, DATASTORE_CODE, ReportingPluginType.TABLE_MODEL); + DatastoreServiceDescription p1 = + DatastoreServiceDescription.processing("P1", "p1", new String[] + { "A.*", "C.*", "D" }, DATASTORE_CODE); + context.checking(new Expectations() + { + { + one(dataSetTypeDAO).listAllEntities(); + will(returnValue(Arrays.asList(dataSetType("A1"), dataSetType("B1"), + dataSetType("C1"), dataSetType("D"), dataSetType("D1")))); + + exactly(3).of(dataStoreDAO).createOrUpdateDataStore(dataStore); + + exactly(2).of(dataStoreDAO).tryToFindDataStoreByCode(DATASTORE_CODE); + will(returnValue(dataStore)); + + exactly(2).of(dataSetTypeDAO).tryToFindDataSetTypeByCode("A3"); + will(returnValue(dataSetType("A3"))); + + one(dataSetTypeDAO).tryToFindDataSetTypeByCode("B"); + will(returnValue(dataSetType("B"))); + } + }); + dataStoreServiceRegistrator.setServiceDescriptions(dataStore, + new DatastoreServiceDescriptions(Arrays.asList(r1), Arrays.asList(p1))); + + dataStoreServiceRegistrator.register(new DataSetTypeBuilder().code("A3").getDataSetType()); + dataStoreServiceRegistrator.register(new DataSetTypeBuilder().code("B").getDataSetType()); + + List<DataStoreServicePE> services = + new ArrayList<DataStoreServicePE>(dataStore.getServices()); + Collections.sort(services, SERVICE_COMPARATOR); + assertEquals("P1", services.get(0).getKey()); + assertEquals("p1", services.get(0).getLabel()); + assertEquals(DataStoreServiceKind.PROCESSING, services.get(0).getKind()); + assertEquals(null, services.get(0).getReportingPluginTypeOrNull()); + assertEquals("[A1, A3, C1, D]", extractedDataSetTypes(services.get(0)).toString()); + assertEquals("R1", services.get(1).getKey()); + assertEquals("r1", services.get(1).getLabel()); + assertEquals(DataStoreServiceKind.QUERIES, services.get(1).getKind()); + assertEquals(ReportingPluginType.TABLE_MODEL, services.get(1) + .getReportingPluginTypeOrNull()); + assertEquals("[A1, A3, B]", extractedDataSetTypes(services.get(1)).toString()); + assertEquals(2, services.size()); + context.assertIsSatisfied(); + } + + private DataSetTypePE dataSetType(String code) + { + DataSetTypePE type = new DataSetTypePE(); + type.setCode(code); + return type; + } + + private List<String> extractedDataSetTypes(DataStoreServicePE service) + { + Set<DataSetTypePE> datasetTypes = service.getDatasetTypes(); + List<String> list = new ArrayList<String>(); + for (DataSetTypePE type : datasetTypes) + { + list.add(type.getCode()); + } + Collections.sort(list); + return list; + } + +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetTypeBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetTypeBuilder.java index 16fe1881d8d2ad8558d1229e10b456b647e5203c..d5053d31724ec90c65814125a4239620b895e244 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetTypeBuilder.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/DataSetTypeBuilder.java @@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders; import java.util.ArrayList; import java.util.List; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; @@ -48,6 +49,12 @@ public class DataSetTypeBuilder extends AbstractEntityTypeBuilder<DataSetType> return this; } + public DataSetTypeBuilder kind(DataSetKind dataSetKind) + { + dataSetType.setDataSetKind(dataSetKind); + return this; + } + public DataSetTypeBuilder propertyType(String code, String label, DataTypeCode dataType) { DataSetTypePropertyType entityTypePropertyType = new DataSetTypePropertyType(); diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataStoreServiceRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataStoreServiceRegistrationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2aa2ebd930cd5e4e07d9739078c202f464c459c3 --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataStoreServiceRegistrationTest.java @@ -0,0 +1,165 @@ +/* + * Copyright 2012 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.systemtest; + +import static org.testng.AssertJUnit.assertEquals; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.openbis.generic.server.CommonServiceProvider; +import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ReportingPluginType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetTypeBuilder; +import ch.systemsx.cisd.openbis.generic.shared.dto.DataStoreServerInfo; +import ch.systemsx.cisd.openbis.generic.shared.dto.DatastoreServiceDescriptions; + +/** + * @author Franz-Josef Elmer + */ +public class DataStoreServiceRegistrationTest extends SystemTestCase +{ + private static final String DOWNLOAD_URL = "blabla"; + + private static final String SESSION_TOKEN = "123"; + + private static final String DATASTORE_CODE = "ABC"; + + private Mockery context; + + @BeforeMethod + public void addMockDataStoreService() throws Exception + { + context = new Mockery(); + final IDataStoreService dataStoreService = context.mock(IDataStoreService.class); + Object bean = CommonServiceProvider.tryToGetBean("dss-factory"); + getDataStoreServices(bean).put("http://localhost:0", dataStoreService); + context.checking(new Expectations() + { + { + allowing(dataStoreService).getVersion(SESSION_TOKEN); + will(returnValue(IDataStoreService.VERSION)); + } + }); + } + + @SuppressWarnings("unchecked") + private Map<String, IDataStoreService> getDataStoreServices(Object bean) throws Exception + { + Field[] fields = bean.getClass().getDeclaredFields(); + for (Field field : fields) + { + if (field.getType().getName().equals(Map.class.getName())) + { + field.setAccessible(true); + return (Map<String, IDataStoreService>) field.get(bean); + } + } + throw new IllegalArgumentException("Has no services map: " + bean); + } + + @Test + public void test() + { + DataStoreServerInfo dataStoreServerInfo = new DataStoreServerInfo(); + dataStoreServerInfo.setDataStoreCode(DATASTORE_CODE); + dataStoreServerInfo.setSessionToken(SESSION_TOKEN); + dataStoreServerInfo.setDownloadUrl(DOWNLOAD_URL); + DatastoreServiceDescription r1 = + DatastoreServiceDescription.reporting("R1", "r1", new String[] + { "H.*", "UNKNOWN" }, DATASTORE_CODE, ReportingPluginType.TABLE_MODEL); + DatastoreServiceDescription p1 = + DatastoreServiceDescription.processing("P1", "p1", new String[] + { "H.*", "C.*" }, DATASTORE_CODE); + dataStoreServerInfo.setServicesDescriptions(new DatastoreServiceDescriptions(Arrays + .asList(r1), Arrays.asList(p1))); + + // 1. register DSS + etlService.registerDataStoreServer(systemSessionToken, dataStoreServerInfo); + + checkDataSetTypes("[HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA, UNKNOWN]", + "[CONTAINER_TYPE, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA]"); + + // 2. register a new data set type + DataSetType dataSetType = + new DataSetTypeBuilder().code("H").kind(DataSetKind.PHYSICAL).getDataSetType(); + commonServer.registerDataSetType(systemSessionToken, dataSetType); + + checkDataSetTypes("[H, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA, UNKNOWN]", + "[CONTAINER_TYPE, H, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA]"); + + // 3. re-register DSS + etlService.registerDataStoreServer(systemSessionToken, dataStoreServerInfo); + + checkDataSetTypes("[H, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA, UNKNOWN]", + "[CONTAINER_TYPE, H, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA]"); + + // 4. delete the new data set type and register it again + commonServer.deleteDataSetTypes(systemSessionToken, Arrays.asList("H")); + commonServer.registerDataSetType(systemSessionToken, dataSetType); + + checkDataSetTypes("[H, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA, UNKNOWN]", + "[CONTAINER_TYPE, H, HCS_IMAGE, HCS_IMAGE_ANALYSIS_DATA]"); + } + + private void checkDataSetTypes(String expectedReportingDataSetTypes, + String expectedProcessingDataSetTypes) + { + List<DatastoreServiceDescription> services = + commonServer + .listDataStoreServices(systemSessionToken, DataStoreServiceKind.QUERIES); + assertEquals("R1", services.get(0).getKey()); + assertEquals("r1", services.get(0).getLabel()); + assertEquals(DOWNLOAD_URL, services.get(0).getDownloadURL()); + assertEquals(DataStoreServiceKind.QUERIES, services.get(0).getServiceKind()); + assertEquals(DATASTORE_CODE, services.get(0).getDatastoreCode()); + assertEquals(expectedReportingDataSetTypes, getDataSetTypeCodes(services.get(0)).toString()); + assertEquals(1, services.size()); + services = + commonServer.listDataStoreServices(systemSessionToken, + DataStoreServiceKind.PROCESSING); + assertEquals("P1", services.get(0).getKey()); + assertEquals("p1", services.get(0).getLabel()); + assertEquals(DOWNLOAD_URL, services.get(0).getDownloadURL()); + assertEquals(DataStoreServiceKind.PROCESSING, services.get(0).getServiceKind()); + assertEquals(DATASTORE_CODE, services.get(0).getDatastoreCode()); + assertEquals(expectedProcessingDataSetTypes, getDataSetTypeCodes(services.get(0)) + .toString()); + assertEquals(1, services.size()); + } + + private List<String> getDataSetTypeCodes(DatastoreServiceDescription description) + { + List<String> result = + new ArrayList<String>(Arrays.asList(description.getDatasetTypeCodes())); + Collections.sort(result); + return result; + } +}