diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/imagingapi/v3/dto/ImagingDataSetMultiExport.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/imagingapi/v3/dto/ImagingDataSetMultiExport.java index 029277b37145d51853fd0138b8c674d0736c2053..ee3b037c778943898dfa57a26d458f1b8f6b9418 100644 --- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/imagingapi/v3/dto/ImagingDataSetMultiExport.java +++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/imagingapi/v3/dto/ImagingDataSetMultiExport.java @@ -35,7 +35,9 @@ public class ImagingDataSetMultiExport implements Serializable @JsonProperty private String permId; @JsonProperty - private int index; + private int imageIndex; + @JsonProperty + private int previewIndex; @JsonProperty @JsonDeserialize(contentUsing = PropertiesDeserializer.class) @@ -56,13 +58,24 @@ public class ImagingDataSetMultiExport implements Serializable } @JsonIgnore - public int getIndex() + public int getImageIndex() + { + return imageIndex; + } + + public void setImageIndex(int imageIndex) { + this.imageIndex = imageIndex; + } + + @JsonIgnore + public int getPreviewIndex() { - return index; + return previewIndex; } - public void setIndex(int index) { - this.index = index; + public void setPreviewIndex(int previewIndex) + { + this.previewIndex = previewIndex; } @JsonIgnore diff --git a/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java b/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java index b2e5a806db99dcc0f87269a876edb0b8820ecebc..8d96390a2cfdb26e916fddc0b1f9d8c74d8a5fad 100644 --- a/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java +++ b/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java @@ -172,7 +172,7 @@ public class ToStringCheck TableModel o = new TableModel(columns, rows); - assertEquals(o.toString(), "TableModel[columns={col1,col2},rowCount=1]"); + assertEquals(o.toString(), "TableModel[columns=[col1, col2],rowCount=1]"); } @Test @@ -228,7 +228,7 @@ public class ToStringCheck o.add(new SamplePermId("p1"), new SampleIdentifier("i1")); o.remove(new SamplePermId("p2"), new SampleIdentifier("i2")); o.set(new SamplePermId("p3"), new SampleIdentifier("i3")); - assertEquals(o.toString(), "IdListUpdateValue[added={P1,I1},removed={P2,I2},set={P3,I3}]"); + assertEquals(o.toString(), "IdListUpdateValue[added=[P1, I1],removed=[P2, I2],set=[P3, I3]]"); } @Test @@ -360,7 +360,7 @@ public class ToStringCheck SynchronousOperationExecutionResults o = new SynchronousOperationExecutionResults(Arrays.asList(result1, result2)); assertEquals(o.toString(), - "SynchronousOperationExecutionResults[results={CreateSamplesOperationResult[TEST-PERM-ID-1],CreateExperimentsOperationResult[TEST-PERM-ID-2]}]"); + "SynchronousOperationExecutionResults[results=[CreateSamplesOperationResult[TEST-PERM-ID-1], CreateExperimentsOperationResult[TEST-PERM-ID-2]]]"); } @Test @@ -437,7 +437,7 @@ public class ToStringCheck o.setFileMetadata(Arrays.asList(f)); assertEquals(o.toString(), - "FullDataSetCreation[metadataCreation=DataSetCreation[experimentId=TEST-EXPERIMENT-ID,sampleId=<null>,code=test-code],fileMetadata={DataSetFileCreation[path=test-path]}]"); + "FullDataSetCreation[metadataCreation=DataSetCreation[experimentId=TEST-EXPERIMENT-ID,sampleId=<null>,code=test-code],fileMetadata=[DataSetFileCreation[path=test-path]]]"); } @Test diff --git a/api-openbis-python3-pybis/src/python/tests/jenkinstest/test.py b/api-openbis-python3-pybis/src/python/tests/jenkinstest/test.py index f1700ac09ccd83dc62c0033822df4c78daa4073c..c74312a59f6df2ce36a3db189fb471b141c1e34d 100644 --- a/api-openbis-python3-pybis/src/python/tests/jenkinstest/test.py +++ b/api-openbis-python3-pybis/src/python/tests/jenkinstest/test.py @@ -22,7 +22,7 @@ import util as util class TestCase(testcase.TestCase): def execute(self): - self.installOpenbis(technologies=['eln-lims', 'eln-lims-life-sciences', 'flow']) + self.installOpenbis(technologies=['eln-lims', 'eln-lims-template-types', 'flow']) # pybis should be installed on the jenkins job configuration level self.openbisController = self.createOpenbisController() self.openbisController.allUp() diff --git a/app-openbis-installer/resource/installer/userInputSpec.xml b/app-openbis-installer/resource/installer/userInputSpec.xml index 385befa03f9c50f294d21cab87664e68e298510c..ccd5cfeee4848f22458c3e29761d095443de7a36 100644 --- a/app-openbis-installer/resource/installer/userInputSpec.xml +++ b/app-openbis-installer/resource/installer/userInputSpec.xml @@ -56,6 +56,9 @@ <field type="check" variable="ELN-LIMS"> <spec txt="ELN/LIMS" true="true" false="false"/> </field> + <field type="check" variable="ELN-LIMS-TEMPLATE-TYPES"> + <spec txt="ELN/LIMS Template Types" true="true" false="false"/> + </field> <field type="check" variable="MICROSCOPY"> <spec txt="Microscopy" true="true" false="false"/> </field> diff --git a/app-openbis-installer/resource/tarball/console.properties b/app-openbis-installer/resource/tarball/console.properties index f7cc9912a066ecce9b55d2d89cca68191e0f0176..1376d869be9accd283468dfbceed6fa3629a5d1f 100644 --- a/app-openbis-installer/resource/tarball/console.properties +++ b/app-openbis-installer/resource/tarball/console.properties @@ -41,6 +41,9 @@ KEY_PASSWORD = changeit # Standard technology ELN-LIMS is disabled by default #ELN-LIMS = true +# Standard technology ELN-LIMS-TEMPLATE-TYPES is disabled by default +#ELN-LIMS-TEMPLATE-TYPES = true + # Standard technology MICROSCOPY is disabled by default #MICROSCOPY = true diff --git a/app-openbis-installer/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java b/app-openbis-installer/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java index debb2aca8f64aa1c6c01e8a26e652488bc1da45d..67715f300714504d03a2620506b0ad7c822d5e9e 100644 --- a/app-openbis-installer/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java +++ b/app-openbis-installer/source/java/ch/systemsx/cisd/openbis/installer/izpack/GlobalInstallationContext.java @@ -47,6 +47,8 @@ public class GlobalInstallationContext public static final String TECHNOLOGY_ELN_LIMS = "ELN-LIMS"; + public static final String TECHNOLOGY_ELN_LIMS_TEMPLATE_TYPES = "ELN-LIMS-TEMPLATE-TYPES"; + public static final String TECHNOLOGY_MICROSCOPY = "MICROSCOPY"; public static final String TECHNOLOGY_FLOW_CYTOMETRY = "FLOW"; @@ -55,7 +57,7 @@ public class GlobalInstallationContext public static final String[] TECHNOLOGIES = { TECHNOLOGY_ILLUMINA_NGS, TECHNOLOGY_ELN_LIMS, TECHNOLOGY_MICROSCOPY, - TECHNOLOGY_FLOW_CYTOMETRY }; + TECHNOLOGY_FLOW_CYTOMETRY, TECHNOLOGY_ELN_LIMS_TEMPLATE_TYPES }; /** * set to true if the installation process is trying to update an existing openBIS installation. diff --git a/core-plugin-openbis/clients.gradle b/core-plugin-openbis/clients.gradle index 6f3094bcc263e911695a9110e5f7a042672eb992..dbbd8e5e6360535b61f3edf9d97359626474c967 100644 --- a/core-plugin-openbis/clients.gradle +++ b/core-plugin-openbis/clients.gradle @@ -8,8 +8,8 @@ dependencies { 'apache:commons-codec:1.10', 'apache:commons-io:2.6', 'apache:httpclient:4.3.6', - 'apache:commons-lang3:3.11', - 'apache:commons-text:1.6', + 'apache:commons-lang3:3.14', + 'apache:commons-text:1.11', 'apache:commons-logging:1.2', 'apache:log4j:1.2.15', 'apache:geronimo-stax:1.0', diff --git a/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/core-plugin.properties b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/core-plugin.properties new file mode 100644 index 0000000000000000000000000000000000000000..d413de88662dd36fa9f3080355245d37a3edfdc6 --- /dev/null +++ b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/core-plugin.properties @@ -0,0 +1,18 @@ +# +# 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. +# +# + +required-plugins=admin:services \ No newline at end of file diff --git a/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/initialize-master-data.py b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/initialize-master-data.py new file mode 100644 index 0000000000000000000000000000000000000000..51e4e2b0dc2ba95671cd22f6c3dce98f5fd7c4bc --- /dev/null +++ b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/initialize-master-data.py @@ -0,0 +1,41 @@ +# 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. +# +# MasterDataRegistrationTransaction Class +from ch.ethz.sis.openbis.generic.server.asapi.v3 import ApplicationServerApi +from ch.systemsx.cisd.openbis.generic.server import CommonServiceProvider +from ch.ethz.sis.openbis.generic.asapi.v3.dto.service.id import CustomASServiceCode +from ch.ethz.sis.openbis.generic.asapi.v3.dto.service import CustomASServiceExecutionOptions +from ch.systemsx.cisd.openbis.generic.server.jython.api.v1.impl import MasterDataRegistrationHelper +import sys + +print("======================== eln-lims-template-types-master-data xls import ========================") + +helper = MasterDataRegistrationHelper(sys.path) +api = CommonServiceProvider.getApplicationContext().getBean(ApplicationServerApi.INTERNAL_SERVICE_NAME) +sessionToken = api.loginAsSystem() +props = CustomASServiceExecutionOptions().withParameter('xls', helper.listXlsByteArrays()) \ + .withParameter('method', 'import').withParameter('zip', False).withParameter('xls_name', 'TEMPLATE_TYPES').withParameter('update_mode', 'UPDATE_IF_EXISTS') \ + .withParameter('scripts', helper.getAllScripts()) +result = api.executeCustomASService(sessionToken, CustomASServiceCode("xls-import"), props) + +print("======================== eln-lims-template-types-master-data xls ingestion result ========================") +print(result) + + + +api.logout(sessionToken) +print("======================== eln-lims-template-types-master-data xls import end ========================") + + diff --git a/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/master-data/eln-types-template.xlsx b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/master-data/eln-types-template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2859f677c2d02deaf6a82e7b4aed6a9bd728612f Binary files /dev/null and b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/master-data/eln-types-template.xlsx differ diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/customisable-master-data/scripts/date_range_validation.py b/core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/master-data/scripts/date_range_validation.py similarity index 100% rename from ui-eln-lims/src/core-plugins/eln-lims/1/as/customisable-master-data/scripts/date_range_validation.py rename to core-plugin-openbis/dist/core-plugins/eln-lims-template-types/1/as/master-data/scripts/date_range_validation.py diff --git a/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/imaging.py b/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/imaging.py index 410d40f2cdf7f353ddd6e8ea665d6a5af681d5ba..e906d451f1d0e8e8e110f464a4be7fa73951aa3c 100644 --- a/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/imaging.py +++ b/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/imaging.py @@ -158,21 +158,24 @@ class ImagingDataSetExport(AbstractImagingRequest): class ImagingDataSetMultiExport(AbstractImagingRequest): permId: str - index: int + imageIndex: int + previewIndex: int config: dict metadata: dict - def __init__(self, permId, index, config, metadata=None): + def __init__(self, permId, imageIndex, previewIndex, config, metadata=None): self.__dict__["@type"] = "imaging.dto.ImagingDataSetMultiExport" self.permId = permId - self.index = index + self.imageIndex = imageIndex + self.previewIndex = previewIndex self.config = config self.metadata = metadata if metadata is not None else dict() self._validate_data() def _validate_data(self): assert self.permId is not None, "PermId can not be null" - assert self.index is not None, "Index can not be null" + assert self.imageIndex is not None, "imageIndex can not be null" + assert self.previewIndex is not None, "previewIndex can not be null" assert self.config is not None, "Config can not be null" required_keys = {"include", "archive-format", "image-format", "resolution"} for key in required_keys: diff --git a/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/nanonis_importer.py b/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/nanonis_importer.py index 77b7a7f204e47c9c47b1e7748d1109cf003369d4..93b01522c139b1ab1057e773d30027df6ccaca89 100644 --- a/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/nanonis_importer.py +++ b/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/nanonis_importer.py @@ -30,6 +30,7 @@ SXM_ADAPTOR = "ch.ethz.sis.openbis.generic.server.dss.plugins.imaging.adaptor.Na DAT_ADAPTOR = "ch.ethz.sis.openbis.generic.server.dss.plugins.imaging.adaptor.NanonisDatAdaptor" VERBOSE = True + def get_instance(url=None): base_url = "http://localhost:8888/openbis" if url == None: @@ -163,14 +164,14 @@ def create_dat_dataset(openbis, folder_path, file_prefix='', sample=None, experi color_scale_visibility_x += [imaging.ImagingDataSetControlVisibility( "Channel X", [channel], - [minimum, maximum, step], + [str(minimum), str(maximum), str(step)], unit )] color_scale_visibility_y += [imaging.ImagingDataSetControlVisibility( "Channel Y", [channel], - [minimum, maximum, step], + [str(minimum), str(maximum), str(step)], unit )] @@ -247,6 +248,25 @@ def export_image(openbis: Openbis, perm_id: str, image_id: int, path_to_download imaging_control.single_export_download(perm_id, imaging_export, image_id, path_to_download) +def multi_export_images(openbis: Openbis, perm_ids: list[str], image_ids: list[int], preview_ids: list[int], + path_to_download: str, include=None, image_format='original', + archive_format="zip", resolution='original'): + if include is None: + include = ['image', 'raw data'] + imaging_control = imaging.ImagingControl(openbis) + export_config = { + "include": include, + "image-format": image_format, + "archive-format": archive_format, + "resolution": resolution + } + imaging_multi_exports = [] + for i in range(len(perm_ids)): + imaging_multi_exports += [imaging.ImagingDataSetMultiExport(perm_ids[i], image_ids[i], + preview_ids[i], export_config)] + imaging_control.multi_export_download(imaging_multi_exports, path_to_download) + + def demo_sxm_flow(openbis, file_sxm, permId=None): perm_id = permId @@ -378,6 +398,11 @@ for sxm_file in sxm_files: demo_dat_flow(o, nanonis_data_folder) -# export_image(o, '20240111103504018-34', 0, '/home/alaskowski/PREMISE') +# export_image(o, '20240125135841740-40', 0, '/home/alaskowski/PREMISE') # export_image(o, '20240111135043750-39', 0, '/home/alaskowski/PREMISE') +# multi_export_images(o, ['20240125135841740-40', '20240125135841740-40'], +# [0, 0], +# [0, 2], +# '/home/alaskowski/PREMISE') + diff --git a/core-plugin-openbis/dist/core-plugins/imaging/1/as/api-listener/imaging-dataset-interceptor/lib/imaging-dataset-interceptor.jar b/core-plugin-openbis/dist/core-plugins/imaging/1/as/api-listener/imaging-dataset-interceptor/lib/imaging-dataset-interceptor.jar index 18d7570a20c7a6f901be37aaac35a0cfcb804c3d..d57840942749087949b32130d19c4f8ba15eddda 100644 Binary files a/core-plugin-openbis/dist/core-plugins/imaging/1/as/api-listener/imaging-dataset-interceptor/lib/imaging-dataset-interceptor.jar and b/core-plugin-openbis/dist/core-plugins/imaging/1/as/api-listener/imaging-dataset-interceptor/lib/imaging-dataset-interceptor.jar differ diff --git a/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/openBIS-premise-imaging.jar b/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/openBIS-premise-imaging.jar index dba0556c81284308e693623b8cdd1805080480ae..3e3376835a5808989551b2ce12e48c71d35765d1 100644 Binary files a/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/openBIS-premise-imaging.jar and b/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/openBIS-premise-imaging.jar differ diff --git a/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/ImagingService.java b/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/ImagingService.java index f03173973362d886b8b3ca4f8107597035f70ae9..b542ad5b1ff521b74b3b1138b1a96337fe88c41b 100644 --- a/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/ImagingService.java +++ b/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/ImagingService.java @@ -235,13 +235,21 @@ public class ImagingService implements ICustomDSSServiceExecutor File rootFile = getRootFile(sessionToken, dataSet); - final int index = export.getIndex(); - if (config.getImages().size() <= index) + final int imageIndex = export.getImageIndex(); + if (config.getImages().size() <= imageIndex) { - throw new UserFailureException("There is no image with index:" + index); + throw new UserFailureException("There is no image with index: " + imageIndex); } - ImagingDataSetImage image = config.getImages().get(index); + ImagingDataSetImage image = config.getImages().get(imageIndex); + + final int previewIndex = export.getPreviewIndex(); + if(image.getPreviews().size() <= previewIndex) + { + throw new UserFailureException("There is no preview with index: " + previewIndex); + } + + ImagingDataSetPreview preview = image.getPreviews().get(previewIndex); Map<String, Serializable> exportConfig = export.getConfig(); Validator.validateExportConfig(exportConfig); @@ -257,7 +265,8 @@ public class ImagingService implements ICustomDSSServiceExecutor new ImagingServiceContext(sessionToken, getApplicationServerApi(), getDataStoreServerApi()); IImagingDataSetAdaptor adaptor = getAdaptor(config); - archiveImage(context, adaptor, image, index, exportConfig, rootFile, export.getPermId(), archiver); + archivePreview(context, adaptor, image, imageIndex, preview, previewIndex, + exportConfig, rootFile, export.getPermId(), archiver); } else if (exportType.toString().equalsIgnoreCase("raw data")) { archiveRawData(rootFile, export.getPermId(), archiver, dataSet); @@ -352,24 +361,51 @@ public class ImagingService implements ICustomDSSServiceExecutor ImagingDataSetImage image, int imageIdx, Map<String, Serializable> exportConfig, File rootFile, String rootFolderName, ImagingArchiver archiver) { - String imageFormat = exportConfig.get("image-format").toString(); int previewIdx = 0; for(ImagingDataSetPreview preview : image.getPreviews()) { - String format = imageFormat; - if(imageFormat.equalsIgnoreCase("original")) { + archivePreview(context, adaptor, image, imageIdx, preview, previewIdx, exportConfig, + rootFile, rootFolderName, archiver); + previewIdx++; + } + } + + private void archivePreview(ImagingServiceContext context, IImagingDataSetAdaptor adaptor, + ImagingDataSetImage image, int imageIdx, ImagingDataSetPreview preview, int previewIdx, + Map<String, Serializable> exportConfig, + File rootFile, String rootFolderName, ImagingArchiver archiver) { + + String imageFormat = exportConfig.get("image-format").toString(); + + String format = imageFormat; + if(imageFormat.equalsIgnoreCase("original")) { + format = preview.getFormat(); + } + + // check for a new "blank" images + if(preview.getBytes() != null && !preview.getBytes().trim().isEmpty()) + { + String imgString; + Map<String, Serializable> imageConfig = image.getConfig(); + Map<String, Serializable> previewConfig = preview.getConfig(); + + if((imageConfig != null && !imageConfig.isEmpty()) + || (previewConfig != null && !previewConfig.isEmpty())) + { + previewConfig.put("resolution", exportConfig.get("resolution")); + Map<String, Serializable> img = adaptor.process(context, + rootFile, format, imageConfig, image.getMetadata(), previewConfig, + preview.getMetadata()); + imgString = img.get("bytes").toString(); + } else { + // uploaded image case + imgString = preview.getBytes(); format = preview.getFormat(); } - Map<String, Serializable> params = preview.getConfig(); - params.put("resolution", exportConfig.get("resolution")); - Map<String, Serializable> img = adaptor.process(context, - rootFile, format, image.getConfig(), image.getMetadata(), params, preview.getMetadata()); - String imgString = img.get("bytes").toString(); byte[] decoded = Base64.getDecoder().decode(imgString); String fileName = "image" + imageIdx +"_preview" + previewIdx + "." + format; archiver.addToArchive(rootFolderName, fileName, decoded); - previewIdx++; } } diff --git a/core-plugin-openbis/query-api.gradle b/core-plugin-openbis/query-api.gradle index 15e679884de971d4f9324b259b396c9d64ef4110..c61ed99a0dbc2c668f0e3ed86226c14d551d8392 100644 --- a/core-plugin-openbis/query-api.gradle +++ b/core-plugin-openbis/query-api.gradle @@ -79,7 +79,7 @@ dependencies { 'springframework:spring-webmvc:5.0.1.RELEASE', 'springframework:spring-expression:5.0.1.RELEASE', 'apache:commons-logging:1.2', - 'apache:commons-lang3:3.11', + 'apache:commons-lang3:3.14', 'marathon:marathon-spring-util:1.2.5', 'aopalliance:aopalliance:1.0' } @@ -127,7 +127,7 @@ dependencies { apiV3Dependencies 'sis:sis-base:23.06.0', 'sis:sis-file-transfer:19.03.1', 'apache:httpclient:4.3.6', - 'apache:commons-lang3:3.11', + 'apache:commons-lang3:3.14', 'eclipse:jetty-client:9.4.44.v20210927', 'springframework:spring-web:5.0.1.RELEASE', 'marathon:marathon-spring-util:1.2.5' diff --git a/core-plugin-openbis/screening-api.gradle b/core-plugin-openbis/screening-api.gradle index 6f38bfd00d88c604bd7dc8633bcfe2b1e5ddf507..019526741bd68d83fb4406821217229496fc08ba 100644 --- a/core-plugin-openbis/screening-api.gradle +++ b/core-plugin-openbis/screening-api.gradle @@ -85,7 +85,7 @@ dependencies { batteries 'sis:sis-base:23.06.0', 'apache:httpclient:4.3.6', 'apache:httpcore:4.3.3', - 'apache:commons-lang3:3.11', + 'apache:commons-lang3:3.14', 'apache:log4j:1.2.15', 'springframework:spring-aop:5.0.1.RELEASE', 'springframework:spring-beans:5.0.1.RELEASE', diff --git a/docs/software-developer-documentation/client-side-extensions/eln-lims-web-ui-extensions.md b/docs/software-developer-documentation/client-side-extensions/eln-lims-web-ui-extensions.md index 72c57eba424840528fe3b46961c5fad7f0d7f066..ca698471621ef29128356d39530ec20288f9a59c 100644 --- a/docs/software-developer-documentation/client-side-extensions/eln-lims-web-ui-extensions.md +++ b/docs/software-developer-documentation/client-side-extensions/eln-lims-web-ui-extensions.md @@ -158,6 +158,8 @@ An example with only type configurations extensions is show below. profile.plugins.push(new MyTechnology()); ``` +*Note: "SAMPLE_TYPE" and "DATASET_TYPE" of the example above should the names of actual types in the system.* + ### Toolbar Extensions An example with only toolbar extensions is shown below, variables with a @@ -214,6 +216,11 @@ dollar sign '$' indicate they are jquery components: profile.plugins.push(new MyTechnology()); ``` +*extraToolbar* corresponds to a button on the toolbar menu. +*extraToolbarDropdown* corresponds to an entry within "More" dropdown in the toolbar menu. + +*Note: "SAMPLE_TYPE" and "DATASET_TYPE" of the example above should the names of actual types. In that way, different toolbars can be specified.* + ### Extra Views as Utilities Please check the provided example: diff --git a/docs/software-developer-documentation/server-side-extensions/dss-imaging.md b/docs/software-developer-documentation/server-side-extensions/dss-imaging.md new file mode 100644 index 0000000000000000000000000000000000000000..a033ad282ab032cc13aaa470ddba8e73a6ef8d8f --- /dev/null +++ b/docs/software-developer-documentation/server-side-extensions/dss-imaging.md @@ -0,0 +1,347 @@ +Imaging technology +================================== + +## Introduction + +imaging technology is an extension that allows to process raw scientific data stored in datasets into easy to analyse images. + +This technology is split into following parts: +- Imaging Service +- Imaging Gallery Viewer +- Imaging DataSet Viewer + + +## How to enable this technology + +"imaging" core plugin, together with simple dataset type can be found here: https://sissource.ethz.ch/sispub/openbis/-/tree/master/core-plugin-openbis/dist/core-plugins/imaging/1?ref_type=heads + +1. It needs to be downloaded in the installation's `servers/core-plugins` folder +2. 'imaging' needs to be enabled in the `servers/core-plugins/core-plugins.properties` + + +## Data Model + +The new imaging extension follows the current eln-lims data model. + +This structure could initially seem to have a couple of additional levels that not everybody will actively use, but in practice is the most flexible since allows to use all openBIS linking features between Experiments, Experimental Steps and other Objects. + +Space (Space): Used for rights management\ + ïƒ Project (Project): Used for rights management\ + ïƒ Collection (Collection): Allows Object Aggregation\ + ïƒ Experiment (Object): Allows Objects linking\ + ïƒ Exp. Step (Object): Allows Objects linking and DataSets\ + ïƒ DataSet (DataSet): Allows to attach data + +Different DataSet Types can have different properties and metadata sections. A default template type called IMAGING_DATA is provided. Additionally, each lab can create their own types with different metadata - a core requirement for dataset type is to contain an internal property called $IMAGING_DATA_CONFIG. + +### $IMAGING_DATA_CONFIG + +To fulfill the visualization requirements, including the flexibility of updating these over time it is needed for every DataSet to include certain data and mutable metadata. +* Original RAW data, on any format, open or proprietary. +* A property $IMAGING _DATA_CONFIG if type JSON containing: + * Indicating the number of inputs and their components. + * The number of images (at least one). + * The number of previews per image (at least one). + * The config with the inputs selected to recalculate each preview. + * The preview image byte array in png or jpeg format. + * Any Custom Metadata fields. + +Example of `$IMAGING _DATA_CONFIG`: + +```json +{ +"config" : { + "@type" : "dss.dto.imaging.ImagingDataSetConfig", + "adaptor" : "java.package.ImagingDataSetExampleAdaptor", //Adapter to be used by the service + "version" : 1.0, //non-null + "speeds" : [1000, 2000, 5000], // (UI-specific) Available values expressed in milliseconds or null + "resolutions": ["200x200", "2000x2000"], //(UI-specific) Available values expressed in pixels or null + "playable" : true, // (UI-specific)true or false + "exports" : [ // parameters for export + { + "@type" : "dss.dto.imaging.ImagingDataSetControl", //non-null + "label": "Include", //non-null + "type": "Dropdown", // non-null + "values": ["Data", "Metadata"], // nullable + "multiselect" : true + }, + { + "@type" : "dss.dto.imaging.ImagingDataSetControl", + "label": "Resolutions", + "type": "Dropdown", + "values": ["original", "300dpi", "150dpi", "72dpi"], + "multiselect" : false + }, + { + "@type" : "dss.dto.imaging.ImagingDataSetControl", + "label": "Format", + "type": "Dropdown", + "values": ["zip/original", "zip/jpeg", "zip/png", "zip/svg"], + "multiselect" : false + } + ], + "inputs" : [ // parameters for the adapter + { + "@type" : "dss.dto.imaging.ImagingDataSetControl", + "label": "Dimension 1", + "section": "Channels", + "type": "Dropdown", + "values": ["Channel A", "Channel B", "Channel C"], + "multiselect" : false, + "playable" : false, + "speeds": [1000, 2000, 5000] + }, + { + "@type" : "dss.dto.imaging.ImagingDataSetControl", + "label": "Dimension 2", + "section": "Channels", + "type": "Slider", + "range": null, //If range of a component is null, visibility should be used instead. + "unit": null, //optional parameter + "playable": true, + "speeds": [1000, 2000, 5000], + "visibility": [{ + "label": "Dimension 1", + "values": ["Channel A"], + "range": [1,2,1], //From 1 to 2 with a step of 1 + "unit": "nm" //optional + }, { + "label": "Dimension 1", + "values":["Channel B", "Channel C"], + "range": [4,6,1], //From 4 to 6 with a step of 1 + "unit": "px" //optional + }] + }, + { + "@type" : "dss.dto.imaging.ImagingDataSetControl", + "label": "Dimension 3", + "section": "Channels", + "type": "Slider", + "range": [1,2,0.5], // From 1 to 2 with a step of 0.5 + "playable": true, + "speeds": [1000, 2000, 5000] + } + ], + "metadata": {} // Custom Metadata to use by UI +}, +"images" : [ //non-null + { /* Image */ + "@type" : "dss.dto.imaging.ImagingDataSetImage", //non-null + "config" : {} //nullable – custom parameters to be provided to the adaptor + "index" : 0, + "previews" : [ + { /* Preview */ + "@type" : "dss.dto.imaging.ImagingDataSetPreview", //non-null + "config" : { //nullable + "Dimension 1": "Channel A", + "Dimension 2": [2, 1.5] + }, + "format": "jpeg", //non-null + "bytes": "FFD8 … FFD9", // base64-encoded image + "show" : true, /* flag used to indicate if should be shown by default */ non-null + "metadata": {} /* Custom Metadata to use by UI */ + } + ], + "metadata": {} /* Custom Metadata to use by UI */ + }] +} +``` + + +## Imaging Service +This section describes how Imaging Service works and how it can be extended. + +Imaging service is implemented using Custom Services technology for DSS (For more details see [Custom Datastore Server Services](./dss-services.md)). It is a special service that, when requested, runs special "adaptor" java class (specified in $IMAGING_DATA_CONFIG) which computes images based on associated dataset files and some input parameters. + +### Adaptors +Currently, there are 3 types of adaptors that are implemented: +- [ImagingDataSetExampleAdaptor](https://sissource.ethz.ch/sispub/openbis/-/blob/master/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/adaptor/ImagingDataSetExampleAdaptor.java?ref_type=heads) - an example adaptor written in Java, it produces a random image. +- [ImagingDataSetJythonAdaptor](https://sissource.ethz.ch/sispub/openbis/-/blob/master/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/adaptor/ImagingDataSetJythonAdaptor.java?ref_type=heads) - an adaptor that makes use of Jython. +- [ImagingDataSetPythonAdaptor](https://sissource.ethz.ch/sispub/openbis/-/blob/master/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/adaptor/ImagingDataSetPythonAdaptor.java?ref_type=heads) - abstract adaptor that allows to implement image computation logic as a python script. More can be read here: [Python adaptor] + +All of these adaptor have one thing in common: they implement [IImagingDataSetAdaptor](https://sissource.ethz.ch/sispub/openbis/-/blob/master/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/adaptor/IImagingDataSetAdaptor.java?ref_type=heads) interface. + +Writing a completely new adaptor requires: +1. Writing a Java class that implements IImagingDataSetAdaptor interface (by either interface realisation or extension). +2. Compiling java classes into a .jar file. +3. Including .jar library in `servers/core-plugins/imaging/<version number>/dss/services/imaging/lib` folder. +4. Restarting Openbis. + +#### Python adaptor +ImagingDataSetPythonAdaptor is an abstract class that contains logic for handling adaptor logic written in a python script. A concrete implementation may look like this: + +```java +package ch.ethz.sis.openbis.generic.server.dss.plugins.imaging.adaptor; + +import ch.systemsx.cisd.common.exceptions.UserFailureException; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Properties; + +public final class NanonisSxmAdaptor extends ImagingDataSetPythonAdaptor +{ + private final String SXM_SCRIPT_PROPERTY = "nanonis-sxm"; //propertyPath + + public NanonisSxmAdaptor(Properties properties) + { + String scriptProperty = properties.getProperty(SXM_SCRIPT_PROPERTY, ""); + if (scriptProperty.trim().isEmpty()) + { + throw new UserFailureException( + "There is no script path property called '" + SXM_SCRIPT_PROPERTY + "' defined for this adaptor!"); + } + Path script = Paths.get(scriptProperty); + if (!Files.exists(script)) + { + throw new UserFailureException("Script file " + script + " does not exists!"); + } + this.scriptPath = script.toString(); + this.pythonPath = properties.getProperty("python3-path", "python3"); + } + +} + +``` +In this example 3 elements are defined: propertyPath, *scriptPath* and *pythonPath* + +propertyPath - name of a property in `servers/core-plugins/imaging/<version number>/dss/services/imaging/plugin.properties` +*scriptPath* - path to a python script to be executed by this adaptor, this path is defined by propertyPath property. +*pythonPath* - path to a python environment to execute script, defined in `plugin.properties` file as `python3-path`. If such property is not found, a default python3 environment is used. + + +Link to existing adaptor: [Nanonis SXM adaptor](https://sissource.ethz.ch/sispub/openbis/-/blob/master/core-plugin-openbis/dist/core-plugins/imaging/1/dss/services/imaging/lib/premise-sources/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/imaging/adaptor/NanonisSxmAdaptor.java?ref_type=heads) + +### Communication with the service +To send request to an OpenBIS service, it is required to send POST message with special JSON in the body, the recipe is as follows: + +```json +{ + "method": "executeCustomDSSService", + "id": "2", + "jsonrpc": "2.0", + "params": [ + OPENBIS_TOKEN, + { + "@type": "dss.dto.service.id.CustomDssServiceCode", + "permId": SERVICE_NAME + }, + { + "@type": "dss.dto.service.CustomDSSServiceExecutionOptions", + "parameters": PARAMETERS + } + ] +} +``` + +*OPENBIS_TOKEN* is a user session token\ +*SERVICE_NAME* is a name of the plugin we are sending our requests. For Imaging technology it should be *imaging*\ +*PARAMETERS* is a command-specific object to be used by the service. + +Imaging service provides 3 of commands that can process the data: +- preview +- export +- multi-export + + + +#### Preview +Preview command triggers computation of a preview images based on a config parameters + +*PARAMETERS* section looks like this: +```json +{ + "type" : "preview", // preview command type + "permId" : "999999999-9999", // permId of the dataset + "error" : null, // (response) exception details, if error occurs + "index" : 0, // index of an image in dataset + "preview" : { // preview definition + "@type" : "dss.dto.imaging.ImagingDataSetPreview", + "config" : { // config to be passed to the adapter, it is format-specific + "Parameter 1“: “Channel A", + "Parameter 2": [2, 1.5] + }, + "bytes": null, // (response) base64 encoded bytes of the image + "width": null, // (response) width of generated image (in pixels) + "height": null, // (response) height of generated image (in pixels) + "index" : 0, // index of the preview in the UI (UI-specific requirement) + "metadata": {} // metadata map to be used by the adapter + } +} +``` + +In the response, Imaging Service will send the same JSON object with the bytes, width, height filled. + +#### Export +Export command triggers re-computation of existing previews of a single image and packs them into an archive file to be downloaded. + +*PARAMETERS* section looks like this: +```json +{ + "type" : "export", // export command type + "permId" : "999999999-9999", // permId of the dataset + "error" : null, // (response) exception details, if error occurs + "index" : 0, // index of an image in dataset + "url": null, // (response) download url where archive is located + "export" : { // export parameters + "@type" : "dss.dto.imaging.ImagingDataSetExport", + "config" : { + "Include": ["Data"], // What kind of data needs to be exported + "Resolution": "300dpi", // DPI to be used for images + "Format": "Zip/jpeg" // What kind of format to be used for archive/image + }, + "metadata": {} // optional metadata map to be used by adaptor + } +} +``` + +#### Multi-Export +Multi-export allows to download multiple images in a single zip file. + +*PARAMETERS* section looks like this: +```json +{ + "type" : "multi-export", // export command type + "error" : null, // (response) exception details, if error occurs + "exports" : [{ // export parameters + "@type" : "dss.dto.imaging.ImagingDataSetMultiExport", + "permId" : "999999999-1111", // permId of the dataset + "imageIndex" : 0, // image index + "previewIndex": 0, // preview index + "config" : { + "Include": ["Data"] // what kind of data needs to be exported + }, + "metadata": {} // optional metadata map to be used by adaptor + }, + { + "@type" : "dss.dto.imaging.ImagingDataSetMultiExport", + "permId" : "999999999-2222", // permId of the dataset + "imageIndex" : 0, // image index + "previewIndex": 0, // preview index + "config" : { + "Include": ["Image", "Data"], // what kind of data needs to be exported + "Resolutions": "300dpi", // DPI to be used for images + "Format": "jpeg" // what kind of image format to be used + }, + "metadata": {} // optional metadata map to be used by adaptor + }], + "url": null // (response) download url where archive is located +} +``` + +### Helpful tools +[imaging-test-data](https://sissource.ethz.ch/sispub/openbis/-/tree/master/core-plugin-openbis/dist/core-plugins/imaging-test-data?ref_type=heads) is another core plugin containing some data that can be used for the tests. There is also a special python script [imaging.py](https://sissource.ethz.ch/sispub/openbis/-/blob/master/core-plugin-openbis/dist/core-plugins/imaging-test-data/1/as/master-data/nanonis_example/imaging.py?ref_type=heads) containing helpful methods for creating, updating and exporting imaging data. + + + +## Imaging DataSet Viewer +Work-in-progress + +## Imaging Gallery Viewer +Work-in-progress + + + + + diff --git a/lib-base/build.gradle b/lib-base/build.gradle index c2f917ba88530f62a1f684e30f260c4498f24f3d..5013e753bd747558f9773b35907d70e8fc83a717 100644 --- a/lib-base/build.gradle +++ b/lib-base/build.gradle @@ -2,7 +2,7 @@ apply from: '../build/javaproject.gradle' dependencies { api 'apache:commons-io:2.6', - 'apache:commons-lang3:3.11', + 'apache:commons-lang3:3.14', 'testng:testng:6.8-CISD', 'rinn:restrictions:1.0.2' } diff --git a/lib-commonbase/build.gradle b/lib-commonbase/build.gradle index 9ff6a97fb71534764071e0dfa8c35442d2247ca8..7c1075c2d1c77534c19ade37274dfcc7bf1a760d 100644 --- a/lib-commonbase/build.gradle +++ b/lib-commonbase/build.gradle @@ -2,8 +2,8 @@ apply from: '../build/javaproject.gradle' dependencies { api 'apache:commons-io:2.6', - 'apache:commons-lang3:3.11', - 'apache:commons-text:1.6', + 'apache:commons-lang3:3.14', + 'apache:commons-text:1.11', 'apache:log4j:1.2.15', 'sis:sis-base:23.06.0', 'rinn:restrictions:1.0.2', diff --git a/lib-file-download/build.gradle b/lib-file-download/build.gradle index 0d3bc9bfea98db0bbbd48df894cd259ca07c5fc3..9ed5dca42d028eaad8502e32bd3ad0af2dfe67a6 100644 --- a/lib-file-download/build.gradle +++ b/lib-file-download/build.gradle @@ -3,7 +3,7 @@ apply from: './javaproject.gradle' dependencies { compile 'apache:commons-io:2.6', - 'apache:commons-lang3:3.7' + 'apache:commons-lang3:3.14' testCompile 'testng:testng:6.8-CISD', diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java index e04705c5fbe29d3066335d257c81f43c887e056a..4b198f6c413826067294f260a38eb384a8ea9615 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java @@ -940,7 +940,7 @@ public class ExecuteOperationsTest extends AbstractOperationExecutionTest v3api.executeOperations(sessionToken, Arrays.asList(new CreateSpacesOperation(spaceCreation())), o); assertAccessLog( - "execute-operations OPERATIONS('[CreateSpacesOperation 1 creation(s)]') EXECUTION_OPTIONS('SynchronousOperationExecutionOptions[description=test-description,notification=OperationExecutionEmailNotification[emails={test@email.com}]]')"); + "execute-operations OPERATIONS('[CreateSpacesOperation 1 creation(s)]') EXECUTION_OPTIONS('SynchronousOperationExecutionOptions[description=test-description,notification=OperationExecutionEmailNotification[emails=[test@email.com]]]')"); } @Test diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java index 69fa684a54eacee20bc98a2158046a19efda3b57..6a83ae2fec4d0c115828c5c5f524719a3c38d616 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java @@ -70,12 +70,12 @@ public class SampleListerTest extends AssertJUnit user = ManagerTestTool.createPerson(); lister = new SampleLister(query, user); context.checking(new Expectations() + { { - { - atMost(1).of(query).getRelationshipTypeId("PARENT_CHILD", true); - will(returnValue(RELATION_SHIP_TYPE)); - } - }); + atMost(1).of(query).getRelationshipTypeId("PARENT_CHILD", true); + will(returnValue(RELATION_SHIP_TYPE)); + } + }); } @AfterMethod @@ -106,30 +106,31 @@ public class SampleListerTest extends AssertJUnit { final List<Long> sampleIDs = Arrays.asList(101L, 102L); context.checking(new Expectations() + { { - { - SampleRecord r101 = record(101); - SampleRecord r102 = record(102); - LongOpenHashSet sampleIdSet = new LongOpenHashSet(new long[] { r101.s_id, r102.s_id }); - one(query).listSamplesByIds(sampleIdSet); - will(returnValue(Arrays.asList(r101, r102))); + SampleRecord r101 = record(101); + SampleRecord r102 = record(102); + LongOpenHashSet sampleIdSet = + new LongOpenHashSet(new long[] { r101.s_id, r102.s_id }); + one(query).listSamplesByIds(sampleIdSet); + will(returnValue(Arrays.asList(r101, r102))); - one(query).getProperties(sampleIdSet); - will(returnValue(Arrays.asList(property(101, "A", "alpha")))); + one(query).getProperties(sampleIdSet); + will(returnValue(Arrays.asList(property(101, "A", "alpha")))); - one(query).getMetaprojectAssignments(sampleIdSet, user.getId()); - will(returnValue(Arrays.asList(sampleMetaproject(102, 42)))); + one(query).getMetaprojectAssignments(sampleIdSet, user.getId()); + will(returnValue(Arrays.asList(sampleMetaproject(102, 42)))); - one(query).getMetaprojects(new LongOpenHashSet(new long[] { 42 })); - will(returnValue(Arrays.asList(metaproject(42, "answer")))); + one(query).getMetaprojects(new LongOpenHashSet(new long[] { 42 })); + will(returnValue(Arrays.asList(metaproject(42, "answer")))); - atLeast(1).of(filter).isValid(user, sample(r101)); - will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r101)); + will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r102)); - will(returnValue(true)); - } - }); + atLeast(1).of(filter).isValid(user, sample(r102)); + will(returnValue(true)); + } + }); List<Sample> samples = lister.getSamples(sampleIDs, @@ -147,43 +148,44 @@ public class SampleListerTest extends AssertJUnit { final List<Long> sampleIDs = Arrays.asList(101L, 102L); context.checking(new Expectations() + { { - { - one(query).getParents(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs)); - will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101), - parentChild(3, 102)))); + one(query).getParents(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs)); + will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101), + parentChild(3, 102)))); - SampleRecord r1 = record(1); - SampleRecord r2 = record(2); - SampleRecord r3 = record(3); - SampleRecord r101 = record(101); - SampleRecord r102 = record(102); - one(query).listSamplesByIds(new LongOpenHashSet(new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id })); - will(returnValue(Arrays.asList(r1, r2, r3, r101, r102))); + SampleRecord r1 = record(1); + SampleRecord r2 = record(2); + SampleRecord r3 = record(3); + SampleRecord r101 = record(101); + SampleRecord r102 = record(102); + one(query).listSamplesByIds(new LongOpenHashSet( + new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id })); + will(returnValue(Arrays.asList(r1, r2, r3, r101, r102))); - atLeast(1).of(filter).isValid(user, sample(r1)); - will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r1)); + will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r2)); - will(returnValue(false)); + atLeast(1).of(filter).isValid(user, sample(r2)); + will(returnValue(false)); - atLeast(1).of(filter).isValid(user, sample(r3)); - will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r3)); + will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r101)); - will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r101)); + will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r102)); - will(returnValue(false)); - } - }); + atLeast(1).of(filter).isValid(user, sample(r102)); + will(returnValue(false)); + } + }); List<Sample> samples = lister.getSamples(sampleIDs, EnumSet.of(SampleFetchOption.PARENTS), filter); assertEquals( - "[Sample[/SPACE/S-101,MY-TYPE,properties=?,parents={Sample[/SPACE/S-1," - + "MY-TYPE,properties=?,parents=?,children=?]},children=?]]", + "[Sample[/SPACE/S-101,MY-TYPE,properties=?,parents=[Sample[/SPACE/S-1," + + "MY-TYPE,properties=?,parents=?,children=?]],children=?]]", samples.toString()); assertEquals("[BASIC, PARENTS]", samples.get(0).getRetrievedFetchOptions().toString()); assertEquals("[BASIC]", samples.get(0).getParents().get(0).getRetrievedFetchOptions() @@ -195,53 +197,55 @@ public class SampleListerTest extends AssertJUnit { final List<Long> sampleIDs = Arrays.asList(201L, 202L); context.checking(new Expectations() + { { - { - one(query).getDescendants(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs)); - will(returnValue(Arrays.asList(parentChild(201, 301), parentChild(201, 302), - parentChild(302, 401)))); - one(query).getAncestors(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs)); - will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101), - parentChild(3, 102), parentChild(101, 201), parentChild(102, 202)))); - - SampleRecord r1 = record(1); - SampleRecord r2 = record(2); - SampleRecord r3 = record(3); - SampleRecord r101 = record(101); - SampleRecord r102 = record(102); - SampleRecord r201 = record(201); - SampleRecord r202 = record(202); - SampleRecord r301 = record(301); - SampleRecord r302 = record(302); - SampleRecord r401 = record(401); - one(query).listSamplesByIds( - new LongOpenHashSet(new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id, r201.s_id, - r202.s_id, r301.s_id, r302.s_id, r401.s_id })); - will(returnValue(Arrays.asList(r1, r2, r3, r101, r102, r201, r202, r301, r302, - r401))); - - atLeast(1).of(filter).isValid(user, sample(r1)); - will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r2)); - will(returnValue(false)); - atLeast(1).of(filter).isValid(user, sample(r3)); - will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r101)); - will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r102)); - will(returnValue(false)); - atLeast(1).of(filter).isValid(user, sample(r201)); - will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r202)); - will(returnValue(false)); - atLeast(1).of(filter).isValid(user, sample(r301)); - will(returnValue(false)); - atLeast(1).of(filter).isValid(user, sample(r302)); - will(returnValue(true)); - atLeast(1).of(filter).isValid(user, sample(r401)); - will(returnValue(true)); - } - }); + one(query).getDescendants(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs)); + will(returnValue(Arrays.asList(parentChild(201, 301), parentChild(201, 302), + parentChild(302, 401)))); + one(query).getAncestors(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs)); + will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101), + parentChild(3, 102), parentChild(101, 201), parentChild(102, 202)))); + + SampleRecord r1 = record(1); + SampleRecord r2 = record(2); + SampleRecord r3 = record(3); + SampleRecord r101 = record(101); + SampleRecord r102 = record(102); + SampleRecord r201 = record(201); + SampleRecord r202 = record(202); + SampleRecord r301 = record(301); + SampleRecord r302 = record(302); + SampleRecord r401 = record(401); + one(query).listSamplesByIds( + new LongOpenHashSet( + new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id, + r201.s_id, + r202.s_id, r301.s_id, r302.s_id, r401.s_id })); + will(returnValue(Arrays.asList(r1, r2, r3, r101, r102, r201, r202, r301, r302, + r401))); + + atLeast(1).of(filter).isValid(user, sample(r1)); + will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r2)); + will(returnValue(false)); + atLeast(1).of(filter).isValid(user, sample(r3)); + will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r101)); + will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r102)); + will(returnValue(false)); + atLeast(1).of(filter).isValid(user, sample(r201)); + will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r202)); + will(returnValue(false)); + atLeast(1).of(filter).isValid(user, sample(r301)); + will(returnValue(false)); + atLeast(1).of(filter).isValid(user, sample(r302)); + will(returnValue(true)); + atLeast(1).of(filter).isValid(user, sample(r401)); + will(returnValue(true)); + } + }); List<Sample> samples = lister.getSamples(sampleIDs, @@ -249,11 +253,11 @@ public class SampleListerTest extends AssertJUnit filter); assertEquals( - "[Sample[/SPACE/S-201,MY-TYPE,properties=?,parents={Sample[/SPACE/S-101,MY-TYPE," - + "properties=?,parents={Sample[/SPACE/S-1,MY-TYPE,properties=?,parents=[]," - + "children=?]},children=?]},children={Sample[/SPACE/S-302,MY-TYPE," - + "properties=?,parents=?,children={Sample[/SPACE/S-401,MY-TYPE,properties=?," - + "parents=?,children=[]]}]}]]", + "[Sample[/SPACE/S-201,MY-TYPE,properties=?,parents=[Sample[/SPACE/S-101," + + "MY-TYPE,properties=?,parents=[Sample[/SPACE/S-1,MY-TYPE,properties=?," + + "parents=[],children=?]],children=?]],children=[Sample[/SPACE/S-302,MY-TYPE," + + "properties=?,parents=?,children=[Sample[/SPACE/S-401,MY-TYPE,properties=?" + + ",parents=?,children=[]]]]]]]", samples.toString()); assertEquals("[BASIC, PARENTS, CHILDREN]", samples.get(0).getRetrievedFetchOptions() .toString()); diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java index 56cb94c49f4419f22e2ff509d3df1cb8e6ce69ec..288ff6ea98af111981acbddd9f6d82aca82f0ce7 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java @@ -155,8 +155,8 @@ public class TranslatorTest extends AssertJUnit ExperimentType translatedExperimentType = Translator.translate(builder.getExperimentType(), vocabTerms); - assertEquals("ExperimentType[MY-EXP,<null>,{PropertyTypeGroup[<null>," - + "{PropertyType[VARCHAR,NAME,Name,<null>,mandatory]}]}]", + assertEquals("ExperimentType[MY-EXP,<null>,[PropertyTypeGroup[<null>," + + "[PropertyType[VARCHAR,NAME,Name,<null>,mandatory]]]]]", translatedExperimentType.toString()); } @@ -182,13 +182,12 @@ public class TranslatorTest extends AssertJUnit ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType translatedDataSetType = Translator.translate(dataSetType, vocabTerms); - assertEquals("DataSetType[CODE,<null>,deletionDisallowed=false,mainDataSetPattern=<null>," - + "mainDataSetPath=<null>,{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,NAME," - + "Name,<null>,optional]}],PropertyTypeGroup[A,{PropertyType[VARCHAR,CITY,City," - + "<null>,optional]}],PropertyTypeGroup[<null>," - + "{ControlledVocabularyPropertyType[CONTROLLEDVOCABULARY,LEVEL,Level,<null>," - + "mandatory,{ControlledVocabularyPropertyType.VocabularyTerm[HIGH,High]}]}]," - + "PropertyTypeGroup[A,{PropertyType[REAL,AGE,Age,<null>,optional]}]}]", + assertEquals("DataSetType[CODE,<null>,deletionDisallowed=false,mainDataSetPattern=<null>," + + "mainDataSetPath=<null>,[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,NAME,Name," + + "<null>,optional]]], PropertyTypeGroup[A,[PropertyType[VARCHAR,CITY,City,<null>,optional]]]," + + " PropertyTypeGroup[<null>,[ControlledVocabularyPropertyType[CONTROLLEDVOCABULARY," + + "LEVEL,Level,<null>,mandatory,[ControlledVocabularyPropertyType.VocabularyTerm[HIGH,High]]]]]," + + " PropertyTypeGroup[A,[PropertyType[REAL,AGE,Age,<null>,optional]]]]]", translatedDataSetType.toString()); } @@ -206,8 +205,8 @@ public class TranslatorTest extends AssertJUnit ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType translatedDataSetType = Translator.translate(builder.getDataSetType(), vocabTerms); - assertEquals("DataSetType[CODE,hello,deletionDisallowed=true,mainDataSetPattern=.*,mainDataSetPath=/here," - + "{PropertyTypeGroup[A,{PropertyType[VARCHAR,NAME,Name,<null>,optional]}]}]", + assertEquals("DataSetType[CODE,hello,deletionDisallowed=true,mainDataSetPattern=.*," + + "mainDataSetPath=/here,[PropertyTypeGroup[A,[PropertyType[VARCHAR,NAME,Name,<null>,optional]]]]]", translatedDataSetType.toString()); } @@ -230,12 +229,11 @@ public class TranslatorTest extends AssertJUnit ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleType translatedSampleType = Translator.translate(dataSetType, vocabTerms); - assertEquals("SampleType[CODE,test type,ValidationPluginInfo[test,Testing],listable=true," - + "showContainer=true,showParents=true,showParentMetaData=true,uniqueSubcodes=true," - + "automaticCodeGeneration=true,codePrefix=S-,{PropertyTypeGroup[A," - + "{PropertyType[VARCHAR,NAME,Name,<null>,optional],PropertyType[VARCHAR,CITY," - + "City,<null>,optional]}],PropertyTypeGroup[<null>,{PropertyType[TIMESTAMP," - + "TIMESTAMP,Timestamp,<null>,optional]}]}]", + assertEquals("SampleType[CODE,test type,ValidationPluginInfo[test,Testing],listable=true," + + "showContainer=true,showParents=true,showParentMetaData=true,uniqueSubcodes=true," + + "automaticCodeGeneration=true,codePrefix=S-,[PropertyTypeGroup[A," + + "[PropertyType[VARCHAR,NAME,Name,<null>,optional], PropertyType[VARCHAR,CITY,City,<null>,optional]]], " + + "PropertyTypeGroup[<null>,[PropertyType[TIMESTAMP,TIMESTAMP,Timestamp,<null>,optional]]]]]", translatedSampleType.toString()); } @@ -268,10 +266,10 @@ public class TranslatorTest extends AssertJUnit ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleType translatedSampleType = Translator.translate(dataSetType, vocabTerms); - assertEquals("SampleType[CODE,<null>,<null>,listable=false,showContainer=false,showParents=false," - + "showParentMetaData=false,uniqueSubcodes=false,automaticCodeGeneration=false," - + "codePrefix=<null>,{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,NAME,Name," - + "<null>,optional]}]}]", + assertEquals("SampleType[CODE,<null>,<null>,listable=false,showContainer=false," + + "showParents=false,showParentMetaData=false,uniqueSubcodes=false," + + "automaticCodeGeneration=false,codePrefix=<null>,[PropertyTypeGroup" + + "[<null>,[PropertyType[VARCHAR,NAME,Name,<null>,optional]]]]]", translatedSampleType.toString()); } diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java index 4577e465ef0633360a1a77e0224b966c98bd93c6..549e50918a1b5642fb20d0c882b2476d7d09e076 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java @@ -114,10 +114,9 @@ public class DataSetTypeTest extends AssertJUnit public void testToString() { String stringRepresentation = dataSetType.toString(); - assertEquals("DataSetType[dataSet-type,hello,deletionDisallowed=false,mainDataSetPattern=.*," - + "mainDataSetPath=/a/b/c,{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,PROP1," - + "Property 1,<null>,optional],PropertyType[VARCHAR,PROP2,Property 2," - + "Property 2 Description,optional]}]}]", + assertEquals("DataSetType[dataSet-type,hello,deletionDisallowed=false,mainDataSetPattern=.*," + + "mainDataSetPath=/a/b/c,[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,PROP1," + + "Property 1,<null>,optional], PropertyType[VARCHAR,PROP2,Property 2,Property 2 Description,optional]]]]]", stringRepresentation); } } diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java index de42558e640679049a5403355f54d8ad7bb98885..53afb5e0b1448134ab2edf97d7486a0103ab33ae 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java @@ -69,8 +69,8 @@ public class GeneralInformationChangingServiceJsonApiTest extends RemoteApiTestC String vocabularyCode = "ORGANISM"; Vocabulary vocabulary = fetchVocabularyFromServer(vocabularyCode); - assertEquals("Vocabulary[ORGANISM,{VocabularyTerm[RAT,RAT],VocabularyTerm[DOG,DOG]," - + "VocabularyTerm[HUMAN,HUMAN],VocabularyTerm[GORILLA,GORILLA],VocabularyTerm[FLY,FLY]}]", + assertEquals("Vocabulary[ORGANISM,[VocabularyTerm[RAT,RAT], VocabularyTerm[DOG,DOG], " + + "VocabularyTerm[HUMAN,HUMAN], VocabularyTerm[GORILLA,GORILLA], VocabularyTerm[FLY,FLY]]]", vocabulary.toString()); NewVocabularyTerm newTerm = new NewVocabularyTerm(); @@ -84,9 +84,9 @@ public class GeneralInformationChangingServiceJsonApiTest extends RemoteApiTestC Vocabulary updatedVocabulary = fetchVocabularyFromServer(vocabularyCode); - assertEquals("Vocabulary[ORGANISM,{VocabularyTerm[RAT,RAT],VocabularyTerm[DOG,DOG]," - + "VocabularyTerm[HUMAN,HUMAN],VocabularyTerm[GORILLA,GORILLA]," - + "VocabularyTerm[FLY,FLY],VocabularyTerm[ALIEN,Alien species]}]", + assertEquals("Vocabulary[ORGANISM,[VocabularyTerm[RAT,RAT], VocabularyTerm[DOG,DOG], " + + "VocabularyTerm[HUMAN,HUMAN], VocabularyTerm[GORILLA,GORILLA], VocabularyTerm[FLY,FLY], " + + "VocabularyTerm[ALIEN,Alien species]]]", updatedVocabulary.toString()); } diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java index ae266dddabb1cdf6a59a8521cc61475ecaf55c85..7b997418f4a208a35621400d109f832241d7f961 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java @@ -551,11 +551,10 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase } }); - assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening," - + "{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,DESCRIPTION,Description," - + "A Description,mandatory],PropertyType[VARCHAR,COMMENT,Comment," - + "Any other comments,optional],PropertyType[MATERIAL,ANY_MATERIAL," - + "any_material,any_material,optional]}]}]", + assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening," + + "[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,DESCRIPTION,Description," + + "A Description,mandatory], PropertyType[VARCHAR,COMMENT,Comment,Any other comments,optional], " + + "PropertyType[MATERIAL,ANY_MATERIAL,any_material,any_material,optional]]]]]", experimentTypes.get(0).toString()); assertEquals(3, experimentTypes.size()); } @@ -600,11 +599,10 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase + "listable=false,showContainer=true,showParents=false,showParentMetaData=false," + "uniqueSubcodes=false,automaticCodeGeneration=false,codePrefix=S,[]]", pick(types, "WELL").toString()); - assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false," - + "showParents=true,showParentMetaData=false,uniqueSubcodes=false," - + "automaticCodeGeneration=false,codePrefix=S,{PropertyTypeGroup[<null>," - + "{PropertyType[INTEGER,OFFSET,Offset,Offset from the start of the sequence," - + "optional]}]}]", + assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false," + + "showParents=true,showParentMetaData=false,uniqueSubcodes=false,automaticCodeGeneration=false," + + "codePrefix=S,[PropertyTypeGroup[<null>," + + "[PropertyType[INTEGER,OFFSET,Offset,Offset from the start of the sequence,optional]]]]]", pick(types, "DILUTION_PLATE").toString()); assertEquals(12, types.size()); } @@ -826,11 +824,11 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase List<Vocabulary> vocabularies = generalInformationService.listVocabularies(sessionToken); final Vocabulary gender = findVocabulary(vocabularies, "GENDER"); - assertEquals("Vocabulary[GENDER,{VocabularyTerm[MALE,MALE],VocabularyTerm[FEMALE,FEMALE]}]", + assertEquals("Vocabulary[GENDER,[VocabularyTerm[MALE,MALE], VocabularyTerm[FEMALE,FEMALE]]]", gender.toString()); final Vocabulary human = findVocabulary(vocabularies, "HUMAN"); - assertEquals("Vocabulary[HUMAN,{VocabularyTerm[MAN,MAN],VocabularyTerm[WOMAN,WOMAN]," - + "VocabularyTerm[CHILD,CHILD]}]", + assertEquals("Vocabulary[HUMAN,[VocabularyTerm[MAN,MAN], VocabularyTerm[WOMAN,WOMAN]," + + " VocabularyTerm[CHILD,CHILD]]]", human.toString()); Vocabulary organism = findVocabulary(vocabularies, "ORGANISM"); diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java index e5380e62b344c85682a5acca7c379035075d7725..8906f612857752e29be7eff118a437b5fbe31600 100644 --- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java +++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java @@ -564,8 +564,8 @@ public class GeneralInformationServiceTest extends SystemTestCase generalInformationService.searchForSamples(sessionToken, searchCriteria, EnumSet.of(SampleFetchOption.DESCENDANTS)); Collections.sort(samples, SAMPLE_COMPARATOR); - assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?,children={Sample[/TEST-SPACE/S1," - + "NORMAL,properties=?,parents=?,children=[]]}]", samples.get(1).toString()); + assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?," + + "children=[Sample[/TEST-SPACE/S1,NORMAL,properties=?,parents=?,children=[]]]]", samples.get(1).toString()); assertEquals(8, samples.size()); sessionToken = generalInformationService.tryToAuthenticateForAllServices("test_role", "a"); @@ -598,8 +598,8 @@ public class GeneralInformationServiceTest extends SystemTestCase generalInformationService.searchForSamples(sessionToken, searchCriteria, EnumSet.of(SampleFetchOption.DESCENDANTS)); Collections.sort(samples, SAMPLE_COMPARATOR); - assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?,children={Sample[/TEST-SPACE/S1," - + "NORMAL,properties=?,parents=?,children=[]]}]", samples.get(1).toString()); + assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?,children=" + + "[Sample[/TEST-SPACE/S1,NORMAL,properties=?,parents=?,children=[]]]]", samples.get(1).toString()); assertEquals(8, samples.size()); samples = @@ -2016,11 +2016,10 @@ public class GeneralInformationServiceTest extends SystemTestCase } }); - assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening," - + "{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,DESCRIPTION,Description," - + "A Description,mandatory],PropertyType[VARCHAR,COMMENT,Comment," - + "Any other comments,optional],PropertyType[MATERIAL,ANY_MATERIAL," - + "any_material,any_material,optional]}]}]", + assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening," + + "[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,DESCRIPTION,Description,A Description,mandatory], " + + "PropertyType[VARCHAR,COMMENT,Comment,Any other comments,optional], " + + "PropertyType[MATERIAL,ANY_MATERIAL,any_material,any_material,optional]]]]]", experimentTypes.get(0).toString()); assertEquals(3, experimentTypes.size()); } @@ -2087,10 +2086,10 @@ public class GeneralInformationServiceTest extends SystemTestCase + "listable=false,showContainer=true,showParents=false,showParentMetaData=false," + "uniqueSubcodes=false,automaticCodeGeneration=false,codePrefix=S,[]]", pick(types, "WELL").toString()); - assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false," - + "showParents=true,showParentMetaData=false,uniqueSubcodes=false," - + "automaticCodeGeneration=false,codePrefix=S,{PropertyTypeGroup[<null>," - + "{PropertyType[INTEGER,OFFSET,Offset,Offset from the start of the sequence,optional]}]}]", + assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false," + + "showParents=true,showParentMetaData=false,uniqueSubcodes=false,automaticCodeGeneration=false," + + "codePrefix=S,[PropertyTypeGroup[<null>,[PropertyType[INTEGER,OFFSET,Offset," + + "Offset from the start of the sequence,optional]]]]]", pick(types, "DILUTION_PLATE").toString()); assertEquals(12, types.size()); } diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java index d1ddb8e533e186a155d437d89595b3f9faffb51f..0f42fa87ad220dbe2c29456a706f083c7b6d183e 100644 --- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java +++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java @@ -198,8 +198,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa task.execute(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," - + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," + + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]],[]]", criteriaMatcher.recordedObject().toString()); AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" + LOG_PREFIX + "Paths inside data set ds-5 successfully added to database. Data set size: 0\n" + @@ -232,10 +232,10 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa task.execute(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,REGISTRATION_DATE," - + "2017-01-21 15:42:49,LESS_THAN_OR_EQUAL]," - + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,A,EQUALS]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,REGISTRATION_DATE,2017-01-21 15:42:49,LESS_THAN_OR_EQUAL], " + + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,A,EQUALS]]," + + "[]]", criteriaMatcher.recordedObject().toString()); AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" + LOG_PREFIX + "Paths inside data set ds-2 successfully added to database. Data set size: 0\n" + @@ -264,8 +264,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa task.execute(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," - + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," + + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]],[]]", criteriaMatcher.recordedObject().toString()); AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" + LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" + @@ -295,8 +295,9 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa task.execute(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," - + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,REGISTRATION_DATE," + + "2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]],[]]", criteriaMatcher.recordedObject().toString()); AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" + LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" + @@ -311,8 +312,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa task.execute(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[" - + "ATTRIBUTE,REGISTRATION_DATE," + T2 + ",LESS_THAN_OR_EQUAL]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause[" + + "ATTRIBUTE,REGISTRATION_DATE," + T2 + ",LESS_THAN_OR_EQUAL]],[]]", criteriaMatcher.recordedObject().toString()); AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" + LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" + @@ -328,8 +329,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa task.execute(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[" - + "ATTRIBUTE,REGISTRATION_DATE," + T1 + ",LESS_THAN_OR_EQUAL]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause[" + + "ATTRIBUTE,REGISTRATION_DATE," + T1 + ",LESS_THAN_OR_EQUAL]],[]]", criteriaMatcher.recordedObject().toString()); AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" + LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" + diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java index 78cbecc7bb9c75df4854495d6794e2a4059211c1..4d91e10a1beb1e3941343177c4ee3250a09ef959 100644 --- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java +++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java @@ -537,10 +537,10 @@ public class OpenbisServiceFacadeTest extends AssertJUnit List<Sample> samples = openbisFacade.listSamplesForExperimentAndSampleType("123-1", "MY-TYPE"); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,MY-TYPE,EQUALS]}," - + "{SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]]}]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,MY-TYPE,EQUALS]]," + + "[SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]]]]", criteriaMatcher.recordedObject().toString()); assertSame(result, samples); } @@ -569,12 +569,12 @@ public class OpenbisServiceFacadeTest extends AssertJUnit List<Sample> samples = openbisFacade.listSamplesOfSample("123-1"); List<SearchCriteria> recordedCriterias = criteriaMatcher.getRecordedObjects(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]", recordedCriterias.get(0).toString()); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[SAMPLE_CONTAINER," - + "SearchCriteria[MATCH_ALL_CLAUSES,{" - + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]]}]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],[SearchSubCriteria[SAMPLE_CONTAINER," + + "SearchCriteria[MATCH_ALL_CLAUSES,[" + + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]]]]", recordedCriterias.get(1).toString()); assertEquals(2, recordedCriterias.size()); assertEquals("[Sample[/DB/S1,sample-type-code,properties=?,parents=?,children=?], " @@ -604,12 +604,11 @@ public class OpenbisServiceFacadeTest extends AssertJUnit List<Sample> samples = openbisFacade.listSamplesOfSample("123-1"); List<SearchCriteria> recordedCriterias = criteriaMatcher.getRecordedObjects(); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]", recordedCriterias.get(0).toString()); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[SAMPLE_CONTAINER," - + "SearchCriteria[MATCH_ALL_CLAUSES,{" - + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]]}]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],[SearchSubCriteria[SAMPLE_CONTAINER," + + "SearchCriteria[MATCH_ALL_CLAUSES,[" + + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]]]]", recordedCriterias.get(1).toString()); assertEquals(2, recordedCriterias.size()); assertEquals("[Sample[/DB/S3,sample-type-code,properties=?,parents=?,children=?]]", @@ -631,9 +630,9 @@ public class OpenbisServiceFacadeTest extends AssertJUnit List<DataSet> dataSets = openbisFacade.listDataSetsForExperiment("abc-1"); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[EXPERIMENT," + - "SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.AttributeMatchClause[" + - "ATTRIBUTE,PERM_ID,abc-1,EQUALS]},[]]]}]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," + + "[SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,abc-1,EQUALS]],[]]]]]", criteriaMatcher.recordedObject().toString()); assertEquals("[DataSet[ds1,e1,<null>,data-set-type,{}]]", dataSets.toString()); } @@ -653,9 +652,9 @@ public class OpenbisServiceFacadeTest extends AssertJUnit List<DataSet> dataSets = openbisFacade.listDataSetsForSample("abc-1"); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[SAMPLE," - + "SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.AttributeMatchClause[" - + "ATTRIBUTE,PERM_ID,abc-1,EQUALS]},[]]]}]", criteriaMatcher.recordedObject() + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," + + "[SearchSubCriteria[SAMPLE,SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,abc-1,EQUALS]],[]]]]]", criteriaMatcher.recordedObject() .toString()); assertEquals("[DataSet[ds1,e1,<null>,data-set-type,{}]]", dataSets.toString()); } diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java index bf58be666544543c1284b9700c50ffa1725dd6d3..5b9a819ee4e1caa439b4c26719a07aec4c2cf402 100644 --- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java +++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java @@ -169,9 +169,9 @@ public class JythonBasedAggregationServiceReportingPluginTest extends AbstractFi IReportingPluginTask plugin = createPlugin("script.py"); TableModel tableModel = plugin.createAggregationReport(parameters, processingContext); - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," - + "{SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,ABC,EQUALS]},[]]]}]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],[SearchSubCriteria[EXPERIMENT," + + "SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,ABC,EQUALS]],[]]]]]", searchCriteriaRecorder.recordedObject().toString()); assertEquals("[Experiment, Data Set Code, Number of Files, Number of Proteins]", tableModel .getHeader().toString()); @@ -210,9 +210,9 @@ public class JythonBasedAggregationServiceReportingPluginTest extends AbstractFi message.startsWith(prefix)); } - assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," - + "{SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," - + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,<null>,EQUALS]},[]]]}]", + assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," + + "[SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," + + "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,<null>,EQUALS]],[]]]]]", searchCriteriaRecorder.recordedObject().toString()); context.assertIsSatisfied(); } diff --git a/test-api-openbis-javascript/build.gradle b/test-api-openbis-javascript/build.gradle index 6c606c5fa01b30b7941090f3cf9bfdfb4dd82a93..24a2a393b936c2df7565ccf4a40a6de9e9163970 100644 --- a/test-api-openbis-javascript/build.gradle +++ b/test-api-openbis-javascript/build.gradle @@ -45,7 +45,7 @@ dependencies { 'testng:testng:6.8-CISD', 'selenium:selenium-java:3.141.59' - testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.11' + testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.14' testRuntimeSecond 'google:gwt-user:2.4' diff --git a/test-api-openbis-javascript/servers/common/core-plugins/core-plugins.properties b/test-api-openbis-javascript/servers/common/core-plugins/core-plugins.properties index 7d9272995b32cd064f287c20ae5c27c7cd0280d2..dd1dd46d457109bb208f23475917f308ddc59aea 100644 --- a/test-api-openbis-javascript/servers/common/core-plugins/core-plugins.properties +++ b/test-api-openbis-javascript/servers/common/core-plugins/core-plugins.properties @@ -1 +1 @@ -enabled-modules=screening, illumina-ngs, tests, tests-data-import, eln-lims, eln-lims-life-sciences, admin, search-store +enabled-modules=screening, illumina-ngs, tests, tests-data-import, eln-lims, eln-lims-template-types, admin, search-store diff --git a/test-api-openbis-javascript/servers/common/core-plugins/eln-lims-life-sciences b/test-api-openbis-javascript/servers/common/core-plugins/eln-lims-life-sciences deleted file mode 120000 index 3a40e65e15e182920c546b0ccd2a509c0bab3f2a..0000000000000000000000000000000000000000 --- a/test-api-openbis-javascript/servers/common/core-plugins/eln-lims-life-sciences +++ /dev/null @@ -1 +0,0 @@ -../../../../core-plugin-openbis/dist/core-plugins/eln-lims-life-sciences/ \ No newline at end of file diff --git a/test-api-openbis-javascript/servers/common/core-plugins/eln-lims-template-types b/test-api-openbis-javascript/servers/common/core-plugins/eln-lims-template-types new file mode 120000 index 0000000000000000000000000000000000000000..82146b303570564ae314fe16289380a638e2e9bc --- /dev/null +++ b/test-api-openbis-javascript/servers/common/core-plugins/eln-lims-template-types @@ -0,0 +1 @@ +../../../../core-plugin-openbis/dist/core-plugins/eln-lims-template-types/ \ No newline at end of file diff --git a/test-app-openbis-installer/test_openbis_sync_big.py b/test-app-openbis-installer/test_openbis_sync_big.py index 05403a6b5416117747b0d7b9a7ed0a6da0532108..71e01c34494685808ad6998eb10ba21407ef2536 100755 --- a/test-app-openbis-installer/test_openbis_sync_big.py +++ b/test-app-openbis-installer/test_openbis_sync_big.py @@ -48,7 +48,7 @@ def sslwrap(func): ssl.wrap_socket = sslwrap(ssl.wrap_socket) -ALL_TECHNOLOGIES = ['eln-lims', 'illumina-ngs', 'microscopy', 'flow'] +ALL_TECHNOLOGIES = ['eln-lims', 'illumina-ngs', 'microscopy', 'flow', 'eln-lims-template-types'] DATA_SOURCE_AS_PORT = '9000' DATA_SOURCE_DSS_PORT = '9001' HARVESTER_AS_PORT = '9002' diff --git a/test-ui-core/build.gradle b/test-ui-core/build.gradle index bc11d527897c774dd417b074ca5c791c3fe79ad2..74614fc3c03da6f8c280ff033cf9eb5a3d608013 100644 --- a/test-ui-core/build.gradle +++ b/test-ui-core/build.gradle @@ -37,7 +37,7 @@ dependencies { 'testng:testng:6.8-CISD', 'selenium:selenium-java:3.141.59' - testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.11' + testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.14' testRuntimeSecond 'google:gwt-user:2.4' diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/customisable-master-data/eln-types-template.xlsx b/ui-eln-lims/src/core-plugins/eln-lims/1/as/customisable-master-data/eln-types-template.xlsx deleted file mode 100644 index 6809bdbbd67343537974011fe0a25cf5fbe26c8a..0000000000000000000000000000000000000000 Binary files a/ui-eln-lims/src/core-plugins/eln-lims/1/as/customisable-master-data/eln-types-template.xlsx and /dev/null differ diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/common-data-model.xls b/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/common-data-model.xls index db7f93edc11b477e9bbfda9aca230cafe119c0e4..9b8d4d55abbd086148b097ec3435e04acfa976a5 100644 Binary files a/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/common-data-model.xls and b/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/common-data-model.xls differ diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/single-group-data-model.xls b/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/single-group-data-model.xls index 28673fe965b94468d9a7ba8924c3023e2f8c47d1..88fb3fcee8f70fc2647e243649266b90355174ce 100644 Binary files a/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/single-group-data-model.xls and b/ui-eln-lims/src/core-plugins/eln-lims/1/as/master-data/single-group-data-model.xls differ