diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java index cbb24e6421d5fdad0d886d8978ca90f0af4fb437..7fc1af56e8eae09378c55dbe5e99f6293e6efcd1 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java @@ -73,7 +73,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOptions; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreForDataSets; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreURLForDataSets; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Material; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.MaterialIdentifier; @@ -588,26 +588,26 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio checkSession(sessionToken); final IDataSetLister lister = new DataSetLister(getDAOFactory()); - final List<DataStoreForDataSets> dataStores = - lister.getDataStoreBaseURLs(Collections.singletonList(dataSetCode)); + final List<DataStoreURLForDataSets> dataStores = + lister.getDataStoreDownloadURLs(Collections.singletonList(dataSetCode)); if (dataStores.isEmpty()) { return null; } - return dataStores.get(0).getDataStoreDownloadURL(); + return dataStores.get(0).getDataStoreURL(); } @Override @Transactional(readOnly = true) @RolesAllowed(value = { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER }) - public List<DataStoreForDataSets> getDataStoreBaseURLs(String sessionToken, + public List<DataStoreURLForDataSets> getDataStoreBaseURLs(String sessionToken, List<String> dataSetCodes) { checkSession(sessionToken); final IDataSetLister lister = new DataSetLister(getDAOFactory()); - return lister.getDataStoreBaseURLs(dataSetCodes); + return lister.getDataStoreDownloadURLs(dataSetCodes); } @Override diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java index 575c32799815cbded3124ea8a398d3b2e87ebbf4..ad517432705edd1c9ed913a0859ce3ec7ebc5119 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java @@ -31,7 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreForDataSets; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreURLForDataSets; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Material; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.MaterialIdentifier; @@ -205,7 +205,7 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements } @Override - public List<DataStoreForDataSets> getDataStoreBaseURLs(String sessionToken, + public List<DataStoreURLForDataSets> getDataStoreBaseURLs(String sessionToken, List<String> dataSetCodes) { logAccess(sessionToken, "get-data-store-base-urls", "DATA_SETS(%s)", diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetDownloadRecord.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetDownloadRecord.java index ec71b786a1bd2b75252c14c02f821192eecfe749..2014d64712dc483e49ae385db21cc3a21231cffd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetDownloadRecord.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetDownloadRecord.java @@ -17,7 +17,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo.fetchoptions.datasetlister; /** - * Type for storing the download ULR for a set of data sets; + * Type for storing the download and remote ULR for a set of data sets; * * @author Bernd Rinn */ @@ -25,5 +25,7 @@ class DataSetDownloadRecord { String download_url; + String remote_url; + String data_set_codes; } \ No newline at end of file diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java index 523c1aa289dd098a726d7ebfdedc336e87f6015d..b8c778d2ce2ac36f245d7b74e36ebf40f84b498e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetLister.java @@ -29,12 +29,12 @@ import org.apache.commons.lang.StringUtils; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.server.business.bo.common.DatabaseContextUtils; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory; +import ch.systemsx.cisd.openbis.generic.server.dataaccess.IAuthorizationDAOFactory; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.DataSetInitializer; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOptions; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreForDataSets; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreURLForDataSets; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDetails; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDetails.EntityRegistrationDetailsInitializer; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind; @@ -55,7 +55,7 @@ public class DataSetLister implements IDataSetLister private IDataSetListingQuery query; - public DataSetLister(IDAOFactory daoFactory) + public DataSetLister(IAuthorizationDAOFactory daoFactory) { this(QueryTool.getQuery(DatabaseContextUtils.getConnection(daoFactory), IDataSetListingQuery.class)); @@ -316,18 +316,35 @@ public class DataSetLister implements IDataSetLister } @Override - public List<DataStoreForDataSets> getDataStoreBaseURLs(List<String> dataSetCodes) + public List<DataStoreURLForDataSets> getDataStoreDownloadURLs(List<String> dataSetCodes) { final String[] dataSetCodesArray = dataSetCodes.toArray(new String[dataSetCodes.size()]); - final List<DataSetDownloadRecord> records = query.getDownloadInfos(dataSetCodesArray); - final List<DataStoreForDataSets> result = - new ArrayList<DataStoreForDataSets>(records.size()); + final List<DataSetDownloadRecord> records = query.getDownloadURLs(dataSetCodesArray); + final List<DataStoreURLForDataSets> result = + new ArrayList<DataStoreURLForDataSets>(records.size()); for (DataSetDownloadRecord r : records) { final String[] dataSetCodeArray = StringUtils.split(r.data_set_codes.substring(1, r.data_set_codes.length() - 1), ','); - result.add(new DataStoreForDataSets(r.download_url, dataSetCodeArray)); + result.add(new DataStoreURLForDataSets(r.download_url, dataSetCodeArray)); + } + return result; + } + + @Override + public List<DataStoreURLForDataSets> getDataStoreRemoteURLs(List<String> dataSetCodes) + { + final String[] dataSetCodesArray = dataSetCodes.toArray(new String[dataSetCodes.size()]); + final List<DataSetDownloadRecord> records = query.getRemoteURLs(dataSetCodesArray); + final List<DataStoreURLForDataSets> result = + new ArrayList<DataStoreURLForDataSets>(records.size()); + for (DataSetDownloadRecord r : records) + { + final String[] dataSetCodeArray = + StringUtils.split(r.data_set_codes.substring(1, r.data_set_codes.length() - 1), + ','); + result.add(new DataStoreURLForDataSets(r.remote_url, dataSetCodeArray)); } return result; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetLister.java index d24f99e3ff080cc9173d878c8e6c7805ac130d8b..9857dd37a771da4511badaf329bc7b1d4d918191 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetLister.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetLister.java @@ -20,7 +20,7 @@ import java.util.List; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOptions; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreForDataSets; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreURLForDataSets; /** * @author pkupczyk @@ -38,10 +38,18 @@ public interface IDataSetLister DataSetFetchOptions dataSetFetchOptions); /** - * Returns the base URLs (download URLs) for a set of <var>dataSetCodes</var>. + * Returns the download URLs for a set of <var>dataSetCodes</var>. * - * @return The list of data stores, each with the list of data set codes it has stored. + * @return The list of data store download URLs, each with the list of data set codes it has + * stored. */ - public List<DataStoreForDataSets> getDataStoreBaseURLs(List<String> dataSetCodes); + public List<DataStoreURLForDataSets> getDataStoreDownloadURLs(List<String> dataSetCodes); + /** + * Returns the remote URLs for a set of <var>dataSetCodes</var>. + * + * @return The list of data store remote URLs, each with the list of data set codes it has + * stored. + */ + public List<DataStoreURLForDataSets> getDataStoreRemoteURLs(List<String> dataSetCodes); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java index fae3a6d9d9240d2e310cf230d2d7b767dc2605b0..a83a31a6c2eac166790ba43142d9e5e5692b3aa6 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/IDataSetListingQuery.java @@ -70,9 +70,15 @@ public interface IDataSetListingQuery extends BaseQuery public List<DataSetRelationRecord> getDataSetChildrenCodes(String[] dataSetCodes); @Select(sql = " select ds.download_url, array_agg(d.code::text) as data_set_codes" - + " from data d left join data_stores ds on ds.id=d.dast_id" - + " where d.code = any(?{1}) group by download_url", parameterBindings = + + " from data d left join data_stores ds on ds.id = d.dast_id" + + " where d.code = any(?{1}) group by ds.download_url", parameterBindings = { StringArrayMapper.class }) - public List<DataSetDownloadRecord> getDownloadInfos(String[] dataSetCodes); + public List<DataSetDownloadRecord> getDownloadURLs(String[] dataSetCodes); + + @Select(sql = " select ds.remote_url, array_agg(d.code::text) as data_set_codes" + + " from data d left join data_stores ds on ds.id = d.dast_id" + + " where d.code = any(?{1}) group by ds.remote_url", parameterBindings = + { StringArrayMapper.class }) + public List<DataSetDownloadRecord> getRemoteURLs(String[] dataSetCodes); } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java index cd969721383c28afdd6090aa88aeb1baed8f354b..d8f126d248311181a6a2963a89ff80a5d269b8d3 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/datasetlister/DataSetListerTest.java @@ -20,6 +20,7 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; +import static junit.framework.Assert.fail; import java.sql.SQLException; import java.util.ArrayList; @@ -47,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOptions; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreForDataSets; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreURLForDataSets; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDetails; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem; @@ -115,17 +116,18 @@ public class DataSetListerTest extends AbstractDAOTest } @Test - public void testGetDataStoreBaseURLs() + public void testGetDataStoreURLs() { DatabaseConfigurationContext context = DatabaseContextUtils.getDatabaseContext(daoFactory); QueryTool .update(context.getDataSource(), - "update data_stores set download_url='http://download_1' where code='STANDARD'"); + "update data_stores set download_url='http://download_1',remote_url='http://remote_1'" + + " where code='STANDARD'"); final long newDataStoreId = (Long) QueryTool .select(context.getDataSource(), "insert into data_stores (id,dbin_id,code,download_url,remote_url,session_token)" - + " values (nextval('data_store_id_seq'),1,'DSS2','http://download_2','','') returning id") + + " values (nextval('data_store_id_seq'),1,'DSS2','http://download_2','http://remote_2','') returning id") .get(0).get("id"); QueryTool.update(context.getDataSource(), "update data set dast_id = ?{1} where code = ?{2}", newDataStoreId, @@ -140,15 +142,45 @@ public class DataSetListerTest extends AbstractDAOTest codes.add("20081105092259000-19"); codes.add("20081105092259000-20"); codes.add("20081105092259000-21"); - List<DataStoreForDataSets> result = lister.getDataStoreBaseURLs(codes); + List<DataStoreURLForDataSets> result = lister.getDataStoreDownloadURLs(codes); assertEquals(2, result.size()); - assertEquals("http://download_1", result.get(0).getDataStoreDownloadURL()); - assertEquals( - Arrays.asList("20081105092159188-3", "20081105092159111-1", "20081105092259000-19"), - result.get(0).getDataSetCodes()); - assertEquals("http://download_2", result.get(1).getDataStoreDownloadURL()); - assertEquals(Arrays.asList("20081105092259000-20", "20081105092259000-21"), result.get(1) - .getDataSetCodes()); + for (DataStoreURLForDataSets url : result) + { + if (url.getDataStoreURL().equals("http://download_1")) + { + assertEquals( + Arrays.asList("20081105092159188-3", "20081105092159111-1", + "20081105092259000-19"), + url.getDataSetCodes()); + } else if (url.getDataStoreURL().equals("http://download_2")) + { + assertEquals(Arrays.asList("20081105092259000-20", "20081105092259000-21"), url + .getDataSetCodes()); + } else + { + fail("URL " + url + " not expected."); + } + } + + result = lister.getDataStoreRemoteURLs(codes); + assertEquals(2, result.size()); + for (DataStoreURLForDataSets url : result) + { + if (url.getDataStoreURL().equals("http://remote_1")) + { + assertEquals( + Arrays.asList("20081105092159188-3", "20081105092159111-1", + "20081105092259000-19"), + url.getDataSetCodes()); + } else if (url.getDataStoreURL().equals("http://remote_2")) + { + assertEquals(Arrays.asList("20081105092259000-20", "20081105092259000-21"), url + .getDataSetCodes()); + } else + { + fail("URL " + url + " not expected."); + } + } } @Test diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java index 53f6c4db500af04575447642e5be83597496fd92..721500012e0b3f8cc7b85a7edf49b13c17d5c156 100644 --- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java +++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java @@ -28,7 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreForDataSets; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataStoreURLForDataSets; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Material; import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.MaterialIdentifier; @@ -296,7 +296,7 @@ public interface IGeneralInformationService extends IRpcService * together with the data set codes that are in this data store. * @since 1.19 */ - public List<DataStoreForDataSets> getDataStoreBaseURLs(String sessionToken, + public List<DataStoreURLForDataSets> getDataStoreBaseURLs(String sessionToken, List<String> dataSetCodes); /** diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataStoreForDataSets.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataStoreURLForDataSets.java similarity index 67% rename from openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataStoreForDataSets.java rename to openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataStoreURLForDataSets.java index bc1c4a2df705e860d2914ebb4dbda0cac26600da..9d79a1645cb4bfd92539a55e107e5afb6baf1d80 100644 --- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataStoreForDataSets.java +++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataStoreURLForDataSets.java @@ -23,36 +23,36 @@ import java.util.List; import ch.systemsx.cisd.base.annotation.JsonObject; /** - * The data store URL for a list of data sets. + * The data store URL for a set of data sets. * * @since 1.19 * @author Bernd Rinn */ -@JsonObject("DataStoreForDataSets") -public class DataStoreForDataSets implements Serializable +@JsonObject("DataStoreURLForDataSets") +public class DataStoreURLForDataSets implements Serializable { private static final long serialVersionUID = 1L; - private final String dataStoreDownloadURL; + private final String dataStoreURL; private final String[] dataSetCodes; - public DataStoreForDataSets(String dataStoreBaseURL, String[] dataSetCodes) + public DataStoreURLForDataSets(String dataStoreBaseURL, String[] dataSetCodes) { - this.dataStoreDownloadURL = dataStoreBaseURL; + this.dataStoreURL = dataStoreBaseURL; this.dataSetCodes = dataSetCodes; } /** - * The base URL of the data store (can be used for download from a client). + * The base URL of the data store. */ - public String getDataStoreDownloadURL() + public String getDataStoreURL() { - return dataStoreDownloadURL; + return dataStoreURL; } /** - * The list of data sets that can be found in this data store. + * A set of data sets that can be found in this data store. */ public List<String> getDataSetCodes() {