diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java index 0a24c8350ad6d8513523a256d321957636e5138b..976bf70c80f5ad07cc50579a1f22df20e604f21a 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java @@ -75,9 +75,6 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.search.ExperimentSear import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.search.ExperimentTypeSearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.update.ExperimentTypeUpdate; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.update.ExperimentUpdate; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.ExportResult; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.ExportData; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.options.ExportOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.ExternalDms; import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.create.ExternalDmsCreation; import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.delete.ExternalDmsDeletionOptions; @@ -2264,6 +2261,6 @@ public interface IApplicationServerApi extends IRpcService public void executeImport(String sessionToken, ImportData importData, ImportOptions importOptions); - public ExportResult executeExport(String sessionToken, ExportData exportData, ExportOptions exportOptions); +// public ExportResult executeExport(String sessionToken, ExportData exportData, ExportOptions exportOptions); } diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java index 71184cd8a6c7c280ab0ab64fc7e2fc5b60dbcfe0..0305a2d2690a87e3ed0abbee264cb7ca6039894f 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java @@ -17,7 +17,7 @@ package ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data; import java.io.Serializable; -import java.util.List; +import java.util.Collection; import ch.systemsx.cisd.base.annotation.JsonObject; @@ -30,9 +30,9 @@ public class UncompressedImportData implements Serializable, ImportData private final byte[] file; - private final List<ImportScript> scripts; + private final Collection<ImportScript> scripts; - public UncompressedImportData(final ImportFormat format, final byte[] file, final List<ImportScript> scripts) + public UncompressedImportData(final ImportFormat format, final byte[] file, final Collection<ImportScript> scripts) { this.format = format; this.file = file; @@ -49,7 +49,7 @@ public class UncompressedImportData implements Serializable, ImportData return file; } - public List<ImportScript> getScripts() + public Collection<ImportScript> getScripts() { return scripts; } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java index f7effd8acfe164565af9e2751300b0f432f7729d..f22e5f58378e9f56d2568ba23c249954c9eecf29 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java @@ -87,6 +87,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.update.ExternalDmsUp import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.GlobalSearchObject; import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.fetchoptions.GlobalSearchObjectFetchOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.search.GlobalSearchCriteria; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportData; import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material; import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.MaterialType; @@ -1365,9 +1366,9 @@ public class ApplicationServerApiLogger extends AbstractServerLogger implements } @Override - public void doImport(final String sessionToken, final byte[] file, final ImportOptions importOptions) + public void executeImport(final String sessionToken, final ImportData importData, final ImportOptions importOptions) { - logAccess(sessionToken, "do-import", "Path(%s) ImportOptions(%s)", file, importOptions); + logAccess(sessionToken, "execute-import", "ImportData(%s) ImportOptions(%s)", importData, importOptions); } } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java index 309d0c278e607bb3631a1f2f84b92a9848fc9f07..7b13dffafa7d49aa9ea49680df54d8ecacb9faa1 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java @@ -88,6 +88,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.update.ExternalDmsUp import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.GlobalSearchObject; import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.fetchoptions.GlobalSearchObjectFetchOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.search.GlobalSearchCriteria; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportData; import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material; import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.MaterialType; @@ -1254,7 +1255,7 @@ public class ApplicationServerApiPersonalAccessTokenInvocationHandler implements } @Override - public void doImport(final String sessionToken, final byte[] file, final ImportOptions importOptions) + public void executeImport(final String sessionToken, final ImportData importData, final ImportOptions importOptions) { invocation.proceedWithNewFirstArgument(converter.convert(sessionToken)); } diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java index 658d75337981d1e2487e05edaaad6f50cb64a90a..eb2490c96e929d54915400f22a7697368a0c65eb 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java @@ -63,12 +63,15 @@ public class ImportExecutor implements IImportExecutor { // XLS file - importXls(context, operation, Map.of(), ((UncompressedImportData) importData).getFile()); + final UncompressedImportData uncompressedImportData = (UncompressedImportData) importData; + + importXls(context, operation, Map.of(), uncompressedImportData.getFile()); } else if (importData instanceof ZipImportData) { // ZIP file - try (final ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(((ZipImportData) importData).getFile()))) + final ZipImportData zipImportData = (ZipImportData) importData; + try (final ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(zipImportData.getFile()))) { final Map<String, String> scripts = new HashMap<>(); byte[] xlsFileContent = null; diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java index 72d971a4a9cd87dbec3517d4d1cf5aca388554ab..ef4032eeaa8069acad357189f88a7ad6bd389419 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java @@ -18,12 +18,14 @@ package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.importer; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.ImportOperation; import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.ImportOperationResult; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.OperationExecutor; +@Component public class ImportOperationExecutor extends OperationExecutor<ImportOperation, ImportOperationResult> { diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java index 87b6cd191b608a2b0498b17480b82ac8cd798ca2..999b67987740760aca81c786b719edf9b3c75d00 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java @@ -76,6 +76,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms.IGetExte import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms.ISearchExternalDmsOperationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms.IUpdateExternalDmsOperationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.globalsearch.ISearchGloballyOperationExecutor; +import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.importer.ImportOperationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material.ICreateMaterialTypesOperationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material.ICreateMaterialsOperationExecutor; import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material.IDeleteMaterialTypesOperationExecutor; @@ -651,6 +652,9 @@ public class OperationsExecutor implements IOperationsExecutor @Autowired private IGetSessionInformationOperationExecutor getSessionInformationExecutor; + @Autowired + private ImportOperationExecutor importOperationExecutor; + @Override public List<IOperationResult> execute(IOperationContext context, List<? extends IOperation> operations, IOperationExecutionOptions options) { @@ -681,6 +685,7 @@ public class OperationsExecutor implements IOperationsExecutor executeCreations(operations, resultMap, context); executeUpdates(operations, resultMap, context); resultMap.putAll(internalOperationExecutor.execute(context, operations)); + resultMap.putAll(importOperationExecutor.execute(context, operations)); flushCurrentSession(); clearCurrentSession(); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ImportTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ImportTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c42172366a9ad39d29b29f3e0b3db2ca2ee73c6b --- /dev/null +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ImportTest.java @@ -0,0 +1,97 @@ +/* + * Copyright ETH 2023 Zürich, Scientific IT Services + * + * 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.ethz.sis.openbis.systemtest.asapi.v3; + +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportData; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportFormat; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportScript; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.UncompressedImportData; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportMode; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.Vocabulary; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.VocabularyTerm; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.fetchoptions.VocabularyFetchOptions; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.search.VocabularySearchCriteria; + +public class ImportTest extends AbstractTest +{ + + private final Map<String, String> IMPORT_SCRIPT_MAP = Map.of("Script 1", "Value 1", "Script 2", "Value 2"); + + private final Collection<ImportScript> IMPORT_SCRIPTS = IMPORT_SCRIPT_MAP.entrySet().stream() + .map(entry -> new ImportScript(entry.getKey(), entry.getValue())).collect(Collectors.toList()); + + private static byte[] fileContent; + + @BeforeClass + public void setupClass() + { + try (final InputStream is = ImportTest.class.getResourceAsStream("test_files/xls/import.xlsx")) + { + if (is == null) + { + throw new RuntimeException(); + } + + fileContent = is.readAllBytes(); + } catch (final IOException e) + { + throw new RuntimeException(e); + } + } + + @Test + public void testUncompressedDataImport() + { + final String sessionToken = v3api.login(TEST_USER, PASSWORD); + + final ImportData importData = new UncompressedImportData(ImportFormat.XLS, fileContent, IMPORT_SCRIPTS); + final ImportOptions importOptions = new ImportOptions(ImportMode.UPDATE_IF_EXISTS); + + v3api.executeImport(sessionToken, importData, importOptions); + + final VocabularySearchCriteria vocabularySearchCriteria = new VocabularySearchCriteria(); + vocabularySearchCriteria.withCode().thatEquals("DETECTION"); + + final VocabularyFetchOptions vocabularyFetchOptions = new VocabularyFetchOptions(); + vocabularyFetchOptions.withTerms(); + + final SearchResult<Vocabulary> vocabularySearchResult = + v3api.searchVocabularies(sessionToken, vocabularySearchCriteria, vocabularyFetchOptions); + + assertEquals(1, vocabularySearchResult.getTotalCount()); + + final List<VocabularyTerm> vocabularyTerms = vocabularySearchResult.getObjects().get(0).getTerms(); + assertEquals(2, vocabularyTerms.size()); + assertEquals(Set.of("HRP", "AAA"), vocabularyTerms.stream().map(VocabularyTerm::getCode).collect(Collectors.toSet())); + } + +} diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2ed0c7e2a6091a46bd5fa3b055a723a6a1838fd4 Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.xlsx differ