From e876684bcd9041a063de140934e9e7dbe7ba4e8d Mon Sep 17 00:00:00 2001 From: vkovtun <viktor.kovtun@id.ethz.ch> Date: Mon, 3 Apr 2023 10:29:53 +0200 Subject: [PATCH] SSDM-13256: Fixed the "No value present" exception. --- .../helper/AbstractXLSEntityExportHelper.java | 18 ++++++++++++++---- .../AbstractXLSEntityTypeExportHelper.java | 5 +++-- .../helper/AbstractXLSExportHelper.java | 18 ++++++++++-------- .../xls/export/DataSetExpectations.java | 7 +++++-- .../xls/export/DataSetTypeExpectations.java | 7 +++++-- .../xls/export/ExperimentExpectations.java | 7 +++++-- .../export/ExperimentTypeExpectations.java | 10 +++++++--- .../server/xls/export/SampleExpectations.java | 6 ++++-- .../xls/export/SampleTypeExpectations.java | 9 ++++++--- ...ypeWithBareSamplePropertyExpectations.java | 7 ++++++- ...thChainedSamplePropertiesExpectations.java | 12 +++++++++++- ...ithCyclicSamplePropertiesExpectations.java | 13 ++++++++++++- ...pleTypeWithSamplePropertyExpectations.java | 9 ++++++++- ...ypeWithVocabularyPropertyExpectations.java | 7 +++++-- ...e-type-with-chained-sample-properties.xlsx | Bin 6758 -> 6746 bytes ...le-type-with-cyclic-sample-properties.xlsx | Bin 6817 -> 6806 bytes 16 files changed, 101 insertions(+), 34 deletions(-) diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java index 5b1c71d51a6..66ac519bd44 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityExportHelper.java @@ -135,7 +135,14 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder case PROPERTY: { return propertyTypes.stream() - .filter(propertyType -> Objects.equals(propertyType.getCode(), fieldId)) + .filter(propertyType -> + { + final String code = propertyType.getCode(); + return fieldId.startsWith(INTERNAL_PROPERTY_PREFIX) + ? propertyType.isManagedInternally() && + Objects.equals(code, fieldId.substring(INTERNAL_PROPERTY_PREFIX.length())) + : !propertyType.isManagedInternally() && Objects.equals(code, fieldId); + }) .findFirst() .orElseThrow(() -> new IllegalArgumentException("Property type not found for id: " + fieldId)) .getLabel(); @@ -165,7 +172,9 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder // Values final Set<Map<String, String>> selectedExportFieldSet = new HashSet<>(selectedExportFields); final Map<String, PropertyType> codeToPropertyTypeMap = propertyTypes.stream() - .collect(Collectors.toMap(PropertyType::getCode, propertyType -> propertyType, (o1, o2) -> o2)); + .collect(Collectors.toMap(propertyType -> (propertyType.isManagedInternally() ? INTERNAL_PROPERTY_PREFIX : "") + + propertyType.getCode(), + propertyType -> propertyType, (o1, o2) -> o2)); final List<Map<String, String>> extraExportFields = compatibleWithImport ? Arrays.stream(requiredForImportAttributes) .map(attribute -> Map.of(FIELD_TYPE_KEY, FieldType.ATTRIBUTE.toString(), FIELD_ID_KEY, attribute.toString())) @@ -180,16 +189,17 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder .filter(field -> isFieldAcceptable(possibleAttributeNameSet, field)) .map(field -> { + final String fieldId = field.get(FIELD_ID_KEY); switch (FieldType.valueOf(field.get(FIELD_TYPE_KEY))) { case ATTRIBUTE: { - return getAttributeValue(entity, Attribute.valueOf(field.get(FIELD_ID_KEY))); + return getAttributeValue(entity, Attribute.valueOf(fieldId)); } case PROPERTY: { return getPropertiesMappingFunction(textFormatting, entity.getProperties()) - .apply(codeToPropertyTypeMap.get(field.get(FIELD_ID_KEY))); + .apply(codeToPropertyTypeMap.get(fieldId)); } default: { diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java index 1f48b50db07..cd2d633b259 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSEntityTypeExportHelper.java @@ -187,9 +187,10 @@ public abstract class AbstractXLSEntityTypeExportHelper<ENTITY_TYPE extends IEnt final Plugin plugin = propertyAssignment.getPlugin(); final Vocabulary vocabulary = propertyType.getVocabulary(); + final String code = (propertyType.isManagedInternally() ? INTERNAL_PROPERTY_PREFIX : "") + propertyType.getCode(); final String[] values = { - String.valueOf(VersionUtils.getStoredVersion(allVersions, ImportTypes.PROPERTY_TYPE, null, propertyType.getCode())), - propertyType.getCode(), + String.valueOf(VersionUtils.getStoredVersion(allVersions, ImportTypes.PROPERTY_TYPE, null, code)), + code, String.valueOf(propertyAssignment.isMandatory()).toUpperCase(), String.valueOf(propertyAssignment.isShowInEditView()).toUpperCase(), propertyAssignment.getSection(), diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSExportHelper.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSExportHelper.java index 804f7eaaca3..678a9449402 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSExportHelper.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/helper/AbstractXLSExportHelper.java @@ -17,9 +17,7 @@ package ch.ethz.sis.openbis.generic.server.xls.export.helper; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; @@ -37,11 +35,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IEntityType; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.plugin.Plugin; import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.DataType; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyAssignment; import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyType; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.Vocabulary; import ch.ethz.sis.openbis.generic.server.xls.export.Attribute; import ch.ethz.sis.openbis.generic.server.xls.export.ExportableKind; import ch.ethz.sis.openbis.generic.server.xls.export.FieldType; @@ -61,6 +56,8 @@ public abstract class AbstractXLSExportHelper<ENTITY_TYPE extends IEntityType> i public static final String FIELD_ID_KEY = "id"; + protected static final String INTERNAL_PROPERTY_PREFIX = "$"; + final Workbook wb; final CellStyle normalCellStyle; @@ -167,11 +164,16 @@ public abstract class AbstractXLSExportHelper<ENTITY_TYPE extends IEntityType> i { return textFormatting == XLSExport.TextFormatting.PLAIN ? propertyType -> propertyType.getDataType() == DataType.MULTILINE_VARCHAR - ? properties.get(propertyType.getCode()) != null + ? getProperty(properties, propertyType) != null ? properties.get(propertyType.getCode()).replaceAll("<[^>]+>", "") : null - : properties.get(propertyType.getCode()) - : propertyType -> properties.get(propertyType.getCode()); + : getProperty(properties, propertyType) + : propertyType -> getProperty(properties, propertyType); + } + + private static String getProperty(final Map<String, String> properties, final PropertyType propertyType) + { + return properties.get((propertyType.isManagedInternally() ? INTERNAL_PROPERTY_PREFIX : "") + propertyType.getCode()); } } diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetExpectations.java index 22cd36e81f7..20a0098b8c2 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetExpectations.java @@ -204,10 +204,11 @@ class DataSetExpectations extends Expectations private PropertyAssignment getNamePropertyAssignment() { final PropertyType propertyType = new PropertyType(); - propertyType.setCode("$NAME"); + propertyType.setCode("NAME"); propertyType.setLabel("Name"); propertyType.setDescription("Name"); propertyType.setDataType(DataType.VARCHAR); + propertyType.setManagedInternally(true); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); @@ -222,10 +223,11 @@ class DataSetExpectations extends Expectations private PropertyAssignment getAttachmentPropertyAssignment() { final PropertyType propertyType = new PropertyType(); - propertyType.setCode("$ATTACHMENT"); + propertyType.setCode("ATTACHMENT"); propertyType.setLabel("Attachment"); propertyType.setDescription("Attachment"); propertyType.setDataType(DataType.VARCHAR); + propertyType.setManagedInternally(true); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); @@ -244,6 +246,7 @@ class DataSetExpectations extends Expectations propertyType.setLabel("Notes"); propertyType.setDescription("Notes"); propertyType.setDataType(DataType.MULTILINE_VARCHAR); + propertyType.setManagedInternally(false); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetTypeExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetTypeExpectations.java index a4c21b94aca..f02c6824650 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetTypeExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/DataSetTypeExpectations.java @@ -82,10 +82,11 @@ class DataSetTypeExpectations extends Expectations propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment( propertyAssignmentFetchOptions); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(false); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -96,6 +97,7 @@ class DataSetTypeExpectations extends Expectations propertyAssignments[1].setMandatory(false); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("Comments"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Notes"); propertyAssignments[1].getPropertyType().setDataType(DataType.MULTILINE_VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Notes"); @@ -104,9 +106,10 @@ class DataSetTypeExpectations extends Expectations propertyAssignments[2] = PropertyAssignmentFactory.createPropertyAssignment( propertyAssignmentFetchOptions); - propertyAssignments[2].getPropertyType().setCode("$XMLCOMMENTS"); + propertyAssignments[2].getPropertyType().setCode("XMLCOMMENTS"); propertyAssignments[2].setMandatory(false); propertyAssignments[2].setShowInEditView(false); + propertyAssignments[2].getPropertyType().setManagedInternally(true); propertyAssignments[2].getPropertyType().setLabel("Comments List"); propertyAssignments[2].getPropertyType().setDataType(DataType.XML); propertyAssignments[2].getPropertyType().setDescription("Comments log"); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentExpectations.java index 51fd0434b65..cd1090372ec 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentExpectations.java @@ -198,10 +198,11 @@ class ExperimentExpectations extends Expectations private PropertyAssignment getNamePropertyAssignment() { final PropertyType propertyType = new PropertyType(); - propertyType.setCode("$NAME"); + propertyType.setCode("NAME"); propertyType.setLabel("Name"); propertyType.setDescription("Name"); propertyType.setDataType(DataType.VARCHAR); + propertyType.setManagedInternally(true); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); @@ -216,10 +217,11 @@ class ExperimentExpectations extends Expectations private PropertyAssignment getDefaultObjectTypePropertyAssignment() { final PropertyType propertyType = new PropertyType(); - propertyType.setCode("$DEFAULT_OBJECT_TYPE"); + propertyType.setCode("DEFAULT_OBJECT_TYPE"); propertyType.setLabel("Default object type"); propertyType.setDescription("Enter the code of the object type for which the collection is used"); propertyType.setDataType(DataType.VARCHAR); + propertyType.setManagedInternally(true); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); @@ -238,6 +240,7 @@ class ExperimentExpectations extends Expectations propertyType.setLabel("Experiment completed"); propertyType.setDescription("Marks the experiment as finished"); propertyType.setDataType(DataType.BOOLEAN); + propertyType.setManagedInternally(false); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentTypeExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentTypeExpectations.java index 09f4a190b81..3e6d20ae6a6 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentTypeExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/ExperimentTypeExpectations.java @@ -86,20 +86,22 @@ class ExperimentTypeExpectations extends Expectations propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(false); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); propertyAssignments[1] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[1].getPropertyType().setCode("$DEFAULT_OBJECT_TYPE"); + propertyAssignments[1].getPropertyType().setCode("DEFAULT_OBJECT_TYPE"); propertyAssignments[1].setMandatory(false); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(true); propertyAssignments[1].getPropertyType().setLabel("Default object type"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription( @@ -110,6 +112,7 @@ class ExperimentTypeExpectations extends Expectations propertyAssignments[2].getPropertyType().setCode("NOTES"); propertyAssignments[2].setMandatory(false); propertyAssignments[2].setShowInEditView(true); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Notes"); propertyAssignments[2].getPropertyType().setDataType(DataType.MULTILINE_VARCHAR); propertyAssignments[2].getPropertyType().setDescription("Notes"); @@ -118,9 +121,10 @@ class ExperimentTypeExpectations extends Expectations propertyAssignments[3] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[3].getPropertyType().setCode("$XMLCOMMENTS"); + propertyAssignments[3].getPropertyType().setCode("XMLCOMMENTS"); propertyAssignments[3].setMandatory(false); propertyAssignments[3].setShowInEditView(false); + propertyAssignments[3].getPropertyType().setManagedInternally(true); propertyAssignments[3].getPropertyType().setLabel("Comments List"); propertyAssignments[3].getPropertyType().setDataType(DataType.XML); propertyAssignments[3].getPropertyType().setDescription("Comments log"); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleExpectations.java index 882d3b87e66..d0f2ba1b89b 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleExpectations.java @@ -219,10 +219,11 @@ class SampleExpectations extends Expectations private PropertyAssignment getBoxesCountPropertyAssignment() { final PropertyType propertyType = new PropertyType(); - propertyType.setCode("$STORAGE.BOX_NUM"); + propertyType.setCode("STORAGE.BOX_NUM"); propertyType.setLabel("Number of Boxes"); propertyType.setDescription("Number of Boxes"); propertyType.setDataType(DataType.INTEGER); + propertyType.setManagedInternally(true); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); @@ -237,10 +238,11 @@ class SampleExpectations extends Expectations private PropertyAssignment getNamePropertyAssignment() { final PropertyType propertyType = new PropertyType(); - propertyType.setCode("$NAME"); + propertyType.setCode("NAME"); propertyType.setLabel("Name"); propertyType.setDescription("Name"); propertyType.setDataType(DataType.VARCHAR); + propertyType.setManagedInternally(true); final PropertyAssignment propertyAssignment = new PropertyAssignment(); propertyAssignment.setFetchOptions(getPropertyAssignmentFetchOptions()); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeExpectations.java index 8fb3e83d7af..5da30a0232b 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeExpectations.java @@ -100,20 +100,22 @@ class SampleTypeExpectations extends Expectations propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(false); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); propertyAssignments[1] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[1].getPropertyType().setCode("$DOCUMENT"); + propertyAssignments[1].getPropertyType().setCode("DOCUMENT"); propertyAssignments[1].setMandatory(false); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(true); propertyAssignments[1].getPropertyType().setLabel("Document"); propertyAssignments[1].getPropertyType().setDataType(DataType.MULTILINE_VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Document"); @@ -122,9 +124,10 @@ class SampleTypeExpectations extends Expectations propertyAssignments[2] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[2].getPropertyType().setCode("$ANNOTATIONS_STATE"); + propertyAssignments[2].getPropertyType().setCode("ANNOTATIONS_STATE"); propertyAssignments[2].setMandatory(false); propertyAssignments[2].setShowInEditView(false); + propertyAssignments[2].getPropertyType().setManagedInternally(true); propertyAssignments[2].getPropertyType().setLabel("Annotations State"); propertyAssignments[2].getPropertyType().setDataType(DataType.XML); propertyAssignments[2].getPropertyType().setDescription("Annotations State"); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithBareSamplePropertyExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithBareSamplePropertyExpectations.java index 820d75963cd..b83874fe903 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithBareSamplePropertyExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithBareSamplePropertyExpectations.java @@ -100,10 +100,11 @@ class SampleTypeWithBareSamplePropertyExpectations extends Expectations propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -114,6 +115,7 @@ class SampleTypeWithBareSamplePropertyExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Open"); propertyAssignments[1].getPropertyType().setDataType(DataType.BOOLEAN); propertyAssignments[1].getPropertyType().setDescription("Marks the program open for assignment"); @@ -125,6 +127,7 @@ class SampleTypeWithBareSamplePropertyExpectations extends Expectations propertyAssignments[2].setMandatory(true); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Start date"); propertyAssignments[2].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[2].getPropertyType().setDescription("Start date"); @@ -135,6 +138,7 @@ class SampleTypeWithBareSamplePropertyExpectations extends Expectations propertyAssignments[3].setMandatory(true); propertyAssignments[3].setShowInEditView(true); propertyAssignments[3].setSection("General info"); + propertyAssignments[3].getPropertyType().setManagedInternally(false); propertyAssignments[3].getPropertyType().setLabel("End date"); propertyAssignments[3].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[3].getPropertyType().setDescription("End date"); @@ -145,6 +149,7 @@ class SampleTypeWithBareSamplePropertyExpectations extends Expectations propertyAssignments[4].setMandatory(false); propertyAssignments[4].setShowInEditView(true); propertyAssignments[4].setSection("General info"); + propertyAssignments[4].getPropertyType().setManagedInternally(false); propertyAssignments[4].getPropertyType().setLabel("Teacher"); propertyAssignments[4].getPropertyType().setDataType(DataType.SAMPLE); propertyAssignments[4].getPropertyType().setDescription("Teacher"); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithChainedSamplePropertiesExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithChainedSamplePropertiesExpectations.java index 32789bee5aa..8b1ad81ccb3 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithChainedSamplePropertiesExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithChainedSamplePropertiesExpectations.java @@ -144,6 +144,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -153,6 +154,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Address"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Address"); @@ -170,6 +172,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(false); propertyAssignments[0].getPropertyType().setLabel("First name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("First name"); @@ -179,6 +182,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Last name"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Last name"); @@ -188,6 +192,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[2].setMandatory(false); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Department"); propertyAssignments[2].getPropertyType().setDataType(DataType.SAMPLE); final SampleType sampleType = new SampleType(); @@ -207,10 +212,11 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations final PropertyAssignment[] propertyAssignments = new PropertyAssignment[5]; propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment(propertyAssignmentFetchOptions); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -220,6 +226,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Open"); propertyAssignments[1].getPropertyType().setDataType(DataType.BOOLEAN); propertyAssignments[1].getPropertyType().setDescription("Marks the program open for assignment"); @@ -229,6 +236,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[2].setMandatory(true); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Start date"); propertyAssignments[2].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[2].getPropertyType().setDescription("Start date"); @@ -238,6 +246,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[3].setMandatory(true); propertyAssignments[3].setShowInEditView(true); propertyAssignments[3].setSection("General info"); + propertyAssignments[3].getPropertyType().setManagedInternally(false); propertyAssignments[3].getPropertyType().setLabel("End date"); propertyAssignments[3].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[3].getPropertyType().setDescription("End date"); @@ -247,6 +256,7 @@ class SampleTypeWithChainedSamplePropertiesExpectations extends Expectations propertyAssignments[4].setMandatory(false); propertyAssignments[4].setShowInEditView(true); propertyAssignments[4].setSection("General info"); + propertyAssignments[4].getPropertyType().setManagedInternally(false); propertyAssignments[4].getPropertyType().setLabel("Teacher"); propertyAssignments[4].getPropertyType().setDataType(DataType.SAMPLE); final SampleType sampleType = new SampleType(); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithCyclicSamplePropertiesExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithCyclicSamplePropertiesExpectations.java index 2133fd350ff..ce59a4b7252 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithCyclicSamplePropertiesExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithCyclicSamplePropertiesExpectations.java @@ -143,6 +143,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -152,6 +153,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Address"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Address"); @@ -161,6 +163,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[2].setMandatory(true); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Course"); propertyAssignments[2].getPropertyType().setDataType(DataType.SAMPLE); final SampleType sampleType = new SampleType(); @@ -181,6 +184,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(false); propertyAssignments[0].getPropertyType().setLabel("First name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("First name"); @@ -190,6 +194,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Last name"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Last name"); @@ -199,6 +204,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[2].setMandatory(false); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Department"); propertyAssignments[2].getPropertyType().setDataType(DataType.SAMPLE); final SampleType sampleType = new SampleType(); @@ -217,10 +223,11 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations final PropertyAssignment[] propertyAssignments = new PropertyAssignment[5]; propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment(propertyAssignmentFetchOptions); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -230,6 +237,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Open"); propertyAssignments[1].getPropertyType().setDataType(DataType.BOOLEAN); propertyAssignments[1].getPropertyType().setDescription("Marks the program open for assignment"); @@ -239,6 +247,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[2].setMandatory(true); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Start date"); propertyAssignments[2].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[2].getPropertyType().setDescription("Start date"); @@ -248,6 +257,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[3].setMandatory(true); propertyAssignments[3].setShowInEditView(true); propertyAssignments[3].setSection("General info"); + propertyAssignments[3].getPropertyType().setManagedInternally(false); propertyAssignments[3].getPropertyType().setLabel("End date"); propertyAssignments[3].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[3].getPropertyType().setDescription("End date"); @@ -257,6 +267,7 @@ class SampleTypeWithCyclicSamplePropertiesExpectations extends Expectations propertyAssignments[4].setMandatory(false); propertyAssignments[4].setShowInEditView(true); propertyAssignments[4].setSection("General info"); + propertyAssignments[4].getPropertyType().setManagedInternally(false); propertyAssignments[4].getPropertyType().setLabel("Teacher"); propertyAssignments[4].getPropertyType().setDataType(DataType.SAMPLE); final SampleType sampleType = new SampleType(); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithSamplePropertyExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithSamplePropertyExpectations.java index f04bb060cb1..366335c732a 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithSamplePropertyExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithSamplePropertyExpectations.java @@ -139,6 +139,7 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(false); propertyAssignments[0].getPropertyType().setLabel("First name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("First name"); @@ -149,6 +150,7 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Last name"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Last name"); @@ -169,10 +171,11 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(true); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); @@ -183,6 +186,7 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[1].setMandatory(true); propertyAssignments[1].setShowInEditView(true); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(false); propertyAssignments[1].getPropertyType().setLabel("Open"); propertyAssignments[1].getPropertyType().setDataType(DataType.BOOLEAN); propertyAssignments[1].getPropertyType().setDescription("Marks the program open for assignment"); @@ -194,6 +198,7 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[2].setMandatory(true); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Start date"); propertyAssignments[2].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[2].getPropertyType().setDescription("Start date"); @@ -204,6 +209,7 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[3].setMandatory(true); propertyAssignments[3].setShowInEditView(true); propertyAssignments[3].setSection("General info"); + propertyAssignments[3].getPropertyType().setManagedInternally(false); propertyAssignments[3].getPropertyType().setLabel("End date"); propertyAssignments[3].getPropertyType().setDataType(DataType.TIMESTAMP); propertyAssignments[3].getPropertyType().setDescription("End date"); @@ -214,6 +220,7 @@ class SampleTypeWithSamplePropertyExpectations extends Expectations propertyAssignments[4].setMandatory(false); propertyAssignments[4].setShowInEditView(true); propertyAssignments[4].setSection("General info"); + propertyAssignments[4].getPropertyType().setManagedInternally(false); propertyAssignments[4].getPropertyType().setLabel("Teacher"); propertyAssignments[4].getPropertyType().setDataType(DataType.SAMPLE); final SampleType sampleType = new SampleType(); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithVocabularyPropertyExpectations.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithVocabularyPropertyExpectations.java index f9114f9ef6b..3eb95e9a342 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithVocabularyPropertyExpectations.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/SampleTypeWithVocabularyPropertyExpectations.java @@ -179,20 +179,22 @@ class SampleTypeWithVocabularyPropertyExpectations extends Expectations propertyAssignments[0] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[0].getPropertyType().setCode("$NAME"); + propertyAssignments[0].getPropertyType().setCode("NAME"); propertyAssignments[0].setMandatory(false); propertyAssignments[0].setShowInEditView(true); propertyAssignments[0].setSection("General info"); + propertyAssignments[0].getPropertyType().setManagedInternally(true); propertyAssignments[0].getPropertyType().setLabel("Name"); propertyAssignments[0].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[0].getPropertyType().setDescription("Name"); propertyAssignments[1] = PropertyAssignmentFactory.createPropertyAssignment( fetchOptions.withPropertyAssignments()); - propertyAssignments[1].getPropertyType().setCode("$BARCODE"); + propertyAssignments[1].getPropertyType().setCode("BARCODE"); propertyAssignments[1].setMandatory(false); propertyAssignments[1].setShowInEditView(false); propertyAssignments[1].setSection("General info"); + propertyAssignments[1].getPropertyType().setManagedInternally(true); propertyAssignments[1].getPropertyType().setLabel("Custom Barcode"); propertyAssignments[1].getPropertyType().setDataType(DataType.VARCHAR); propertyAssignments[1].getPropertyType().setDescription("Custom Barcode"); @@ -203,6 +205,7 @@ class SampleTypeWithVocabularyPropertyExpectations extends Expectations propertyAssignments[2].setMandatory(false); propertyAssignments[2].setShowInEditView(true); propertyAssignments[2].setSection("General info"); + propertyAssignments[2].getPropertyType().setManagedInternally(false); propertyAssignments[2].getPropertyType().setLabel("Antibody host"); propertyAssignments[2].getPropertyType().setDataType(DataType.CONTROLLEDVOCABULARY); final Vocabulary vocabulary = new Vocabulary(); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample-type-with-chained-sample-properties.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample-type-with-chained-sample-properties.xlsx index 755c51dc26e8712e6945501a60fdaa3966cffd97..56d8359974934e87053beee3b962f312a8d32cc0 100644 GIT binary patch delta 4140 zcmZ8k2QVC37v9C{J=!Abs>@<^A*|?~)qAi+4<SU!MkIP)VWW#4(H<eOM2Q}~L{`*j zA;^Xxg7_uxpEv*e@65U7%y+)Icka3OoU<V_CqrYRPfWrDASWjWc;7=e&_IC1mt&(0 zP?qTT1mi<2iEfH(2+ol)Bu|j>-03pR>+8-Q4k%uq9ZQ*#5eecz)n}GTG^CD&oUJ!T z?r0sQdL%vM5JU2Xa);qyBv>*&NW^4pcFD@<b&@J|WexM&^RajGx>vh6R4wi#NVp_1 zk28eM#Wt7?7O$2flE8W)nh#(5#XoY>*?OL*;K?UNiAEB;Onbie8@m~ITY+$rN%K?> z!BcL3coQcHJpIAs<=0M2A~#<}F8d@E>l!Z{#1*t>nZNW4OBpPq)N$slukB6!7Bj~B z8fCcbC`+)vsJ+XEo1=IOrSFeTx>{b<rF3FPbEZRBe|HboloeID7{#ISvI=!ZjCf2E z2;Y0Vf*v2a4+izr2Vc|7OcIdlBbQR&eDBjGl~Kh-%^~q+@u*>PN^jtb?u&=(5Bx@! zT|XABG37S%*`B_(u$v9o?2UPMddh1z1~WcIkuJxpxY0E#P?Yt4@<DjB{h%<T)W1H> zoR+P9pdk@jdr(A!IXUkO=bM=K4%UCLQ+#@r3XI-vvnvI?l8j0#ieHX%6pUo!&2h2D zE+*Q&k)(}C;4dTAhsTc~<9nnKnT!UkENoLRlkJ&;j)CRhyCL7|CiZs?y>c{<F|aYw zFn`JUgJ;Q^RwfzaCni`PytB<)+;EwTQn6b%*fBsEqrRes3O8}*`f+Q8+=X{ApVpW3 zHacT7q7fy+$cBk@B4;Y7x>KB%{7i8{FEgpBfj*re`Ng`WtO0Ts28k)X^&Tz&qEXYl zo%|Lwh<(IvyC38}kzlrGCghLI4=kuwe=>q9W0`UeA82BSdk^@uHM7HMp2is5DCcdY zcxr?*x`yhnX3jOL`Ovi8v$4#L2^i`RL5E`{@>kp24adGUe!hMPFBS@1YQ7Pv**v=H zc6z{oc0fN8%?aih;i|EzoAAMHK0OgbhIAG9(}ngn?xa6E?|?SiAxFG$@Gqj)`9hbN zof$}@uQm3iQud5x{Ur5AZ<3E2H}G=8%}x~}%>wZkMVBl{n;Mxr`~InA93XUW$N-m^ zP1NhUiCCxM1rgf}Uu6Mv20!o7$j&NfYVosnKhU@%6<}%pE2z>6c*sR!Sk|MAWyQ8r zmLEV3%IeN3{l4<fgR`QzqKN`cqCVjG^reDP_was%D<=A6<dHw`D0vVA01ZL_z`tIj zCE!oPfXO7$1lB!;y(Yn5daYYNbGyTD7}8wJ*&2AR8QwqF<B^=N1~g(6B)|%s4h{?a zUFjuT6-%ck*D@e9w}Ps2Sz~I`2TJbKtJrU=zLB{8p*0IGzrT>CwPuFqtNP`6)c-wQ zuw(KnufZzt*>|%gDHin3p_#w-kzW|XmGPU9UCxdJy3ZdI>&PzDbJ(bLTJHhwt8590 z)*0iEFlg;5`slmN5E~Y&5^v1~;Vpg_`g02wH^n#S-+@$C4d6a8NsJH`Q98lE3l!D9 z9Ytl2XZqnEYahd9m4|fw%{Vr{_WVSr5A$+wOVR7uXx6vSqB6tfPlDrA2_K~DrX%S| zcSJbQ_1AOVzjX-A$&rI~-<TC9wgtb<BzQEOs_l`VGI)&PLw+U`_pUDb%wdu}kgCgJ zal=iId?XIXHu}B2#e~7DUmqx!Kk*h{nCJ%?6X;t#86=3ab(fb&7*>S!X&KKFuaA1Z z`qaC8(DZYeySv&Fpi8J<6<JIZhu(l6|4Mm;?s4s@YsRV6r-cL_H+59p1a}JA9n-_p ziN2-?g6^+@owm~}JqB(}S_er9-4yPt@-A4ey>~XDHd`RFuyoIFpxTXHYyH>Q3q=i0 z75{mmuz?}I!i2J5<1Gnb{Hquf5st@|{yPaM;l^><>=JFhMzGb_gL2!S{<Q-?AXsvH zbUUon#tj+cEe`FfCP)+TMr*-RG9wM1sj;a1SE5ipuTgF~iJoW=m^M%sc*}8%BM`#t zpN2B;4P`w6gukSAQ%`v}kC!P<WoM1f&e5OQ1gVxL?cMPzHqCmRk7}TbDAYiaD&lx+ z#DrijpZlt?g1u|U8Wn{Hjweow3hU_40qzFj+68q&V5h(sfuUUB9dZTwR}VXhi1f){ z@YKh2mJ@vs9UN-4sR`zA`tH>3mo>a$E`Md3M*4-4Yk@Q=vsTCG?b}I+`~Vd1c}#F0 zk+fEDAER_%aNp3wZM9`3vKXEG`_)QyFvG?5N;oHn4pPtpE~u81CsjK{^}ZL)SMkAu z5=-<h4_;-~$@yxp!=$AP*G5BH(`efTz}&4ZdSLTKSlD^aQAF5z5yr$M8IVm$iKT`b z0NHDp5uFiu;fD`S0#!m0TPr741N1fYRNKluQ~;BWT_&Lltkz2*lLe?I+*wQf(zL{K z*R(cPf?QIm1Hhjrj=gZwLhlkaA@fYhfJ}p(Ps)qbfO91;sPs-I*xHK**t~eD?7z7r zhpkNpr<c61Ifs3<$IV3H$D<IPQJu^rEcDju&Y&n+5;^7~%a%c$LcQ*n7E0+N;@l=B zNls#=dfjT`x743IB`>EG=43>(7*-aH_1WhAj=}5R{=|~cBr4j_Mw|rS0)3+rI!vAx zzo25WkwG96D54_&DPF0|g6VUgIp?i@bI#9~^5dyVKoLJOphy6DyGRK6II7%$nY0x? zXj-}WrY<6KP`u4Y(Bw|_0$b3sLdKL24HL!T#7`uIW&{zdFuS2|r*m-iC{1ut<7i?V z>BE@LxXY;>Xp7D?fw&<AB*~x?TpkXAL;i^;lX5ehGPW<RvQgu$E!j*{K0n-t1*&XV zzyn^HAR(Ek=gxW^bQYeJNQuzc-A{HANoz*6sUB*lM_Yz(QUX1Yhkl>4^#{S0_i-9& z(Zx_|aml8hampLs)V^LO?bzgNg)O%yp7kqdljchK$)YDSCf7=tO^cquGCT>Bl$0`4 zl$1eJ6{dwj>f>7K35x!O$2CGNaWAa~010lZv%~by-CE{6`^7@KDiruDF_EH4nZ0|? z-Mf}o-l(U~lH<+OTg5PfHj8WGGF$aw=A3Jj77({73&`4~xJ_S<m*O_V3|SL0k4m$# zLWAJb+=zDyUw$@HxBVKYD+dkwSQ8z<AQe2a>~tt2LI_fTV)%I(>H(;En=w2&$M?C8 z1MHwJ@M*%Vz}aCjkL<gds5Pci_t)l%coP`2C($}Q-9Evcn0N@3`v?1_Ezl<6`^5HN ztpoocyLPiOregzbbZXJG4YQT_@`UMi_4lW~>)X)DSohNZB`v;)uGZ11y`E8hV@KAj zxr#6N^(fA@nJ^kC`OqsE54XG8JZzaQ-Y8lkHLcebHCm!*)V@(7J=3=6ebCY1h?{j> z*D=i_VZbFfBBSS0UVVDyYTFl~a8*5e;HskU0@{;Nc`EMpN}fg%q=KvWo*ql+4}^rO z+3}1a7tvw>_Ns+6tZ$!?)8;NSS{n-56Is0h+q;XWPzaEhG5jb)Q?2@!m}}=p9}(2H zcKbft67PE#dBH&kg26so&w}<js{b@$%5lG0d9lo!ug5pzaBr&r^J$7kOGIYdFWpYE zr|A5SwrSU#`W_lKW96WBr$YXVO_=j~JYvLnerQEG_0dY+UN2(QJg+X%OEdV>gAOhY zFHKqFIPKL3Zg$q!TiZkvUjTBreOlT+G1!slhHXE8<R5vl9h!q|6gfOUbLK7NdE$Nl zsrK;7e(M~#L)^G)^cV5(;4Dp|K^a5_U<Bww|1UZ>j?=RKNtQ9&bVBIClsPr}_D!g* zWv#Ou3eh<bB`D2E`c962{ShVZf#r^01@2}{hcVEUR#9U;H{0rbs4i=Ba4Os(p31f& zsets{PlCRZ3Mm?yNBS`Wf5J$<iO4nqCr>RWz(R8(u?m}@$6oR@MvL;Rl0m%`-nSj5 zipu55T)hcF-l@gjVrca(qqsM<-H5tlkr#+9HKvUhDibMjM=xgTq(`}pwVa~yJyrO% zQTSaNCJm#0g(g;NcN-=l=<9cANFd`+Jf!XBMRZ{<qfIBMwflJ=hEpse=tzsxv;>s; zT}432avo~_{1HcTDE(j0-dymCel>XL$T@ut8W?V6<+iD!+K<G}Ef*zdXHh*{7ZJt? zkGQ@befm(|IWjq?q7!b5YRlN%$|B?ZPWsl!|HIa?=EXs%BxkCY@;yJ~N^<*O<M_cg ziZW2vP-0@Yydw=<>_a=&ItSy*AcW@s7I3w<O-VJT;u#+&HPo3#7MU%auc|HLe^ZR5 zY8cMdEVh+1D;#goIFdtF7Ch!twXUDDeyzDjA2rA-W7T3Yy+L4ZQaoLuU(Nb>>kYnq z_*~rxbyb3O8$E9`u08MYYwz6etsQ5s#{N(%?<xw|;VTCPf1^$A`W4h&=!bH5O=0m0 zI0!-P!8#R#r*}s3*UjS=_=fK7yBGK%GVNyvom_OO1G?4U9X>3KpGGAryUC!l+APxe z$5k=DQ==C~_jE39HZJ}4C6cZSRs<0M&`a@uu7tVG2t(s!YI?Mqf*FhQv1%??;_P%5 z#K#3qKSiF0Px^@y3;G>}ON`y!`4;44HNlc+rDaUc0f7*S8y0`}QqM}XQRYk6E~YXC z(_9Gz7?+>SSlhyqqlG-g6wH@PoJ&=*@2bC#%R+9ivwN+OA&QA@*sZ9jtL#jnYZcZ& zL(E#vd-Q{6^uo7X**-3&=ZR6_?dFoJZKKuADvL;y3;qI@EZLG+ohH)RZW!1=m91Y1 z?+!S&A3tZ^yNm0Bd6yNVwVXET#&#<kCP%Dvc}{*zlV{VCs55|w?~Bb!N#GaGU9|RP zbf*+_UFGZ{^2!_mS?$SNb;rpoQgX0D=vI=v09q>*RRz(|r>ng;31trkIx3;0#N_-3 zxzz@s#a6lXk2!<dBK!nYrgvHxxi(iA^+3J5yrK4;t#V(k99`tu<hcd(vG@#tS3Sez zJUqrN@77z4AT~;xZxzZpoQ|B5=_sd63-M|_X69Uho!u!tVf}q0keob=FdzUxAOg_- zJNIrBWs?5;bvrZ9{3(eQSW5p^EV0V{DUI3KlxQwXWXpf@cZ?GojOVxJzn{jRKZEV> zB>ulWkPO31#x7=}4<up&{8M&Y8WT>!CNCiZm)^ntF9RGcW{H*)LkFhj{>}WqF2wXN z;0#6y%>M`TKZgP^{0n1^i2(Eb*?S?F1IU2Efw}*z7Qh@t+RPY#W@Zc>JM|wG7dr=# O8>7T7NZP~to8vzw)opD6 delta 4184 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 JJj(Q&`5%i=Y=Qs) diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample-type-with-cyclic-sample-properties.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample-type-with-cyclic-sample-properties.xlsx index 6d49c3efd75c1628a586ca8b5df2ac3ef96fa92f..3de0cb40e840ca239231956fd7f1b3991e4d6d54 100644 GIT binary patch delta 4443 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 delta 4510 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 OjkKrZz$UnN<^KR1OELWb -- GitLab