From 78d08230a87685dbff9b4c2b33ec46671bb61b6a Mon Sep 17 00:00:00 2001 From: vkovtun <viktor.kovtun@id.ethz.ch> Date: Tue, 28 Mar 2023 16:54:05 +0200 Subject: [PATCH] SSDM-13256: Excluded "$" and "Auto generate codes" from the list of default attributes when exporting samples not for import. --- .../generic/server/xls/export/Attribute.java | 73 ++++++++++-------- .../helper/AbstractXLSEntityExportHelper.java | 4 +- .../xls/export/resources/export-sample.xlsx | Bin 6630 -> 6445 bytes 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java index 9318e05fbcd..1053b6d1d81 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/xls/export/Attribute.java @@ -20,69 +20,69 @@ package ch.ethz.sis.openbis.generic.server.xls.export; public enum Attribute { - $("$", true, true), + $("$", true, true, false), - ARCHIVING_STATUS("Archiving status", false, false), + ARCHIVING_STATUS("Archiving status", false, false, true), - AUTO_GENERATE_CODES("Auto generate codes", true, true), + AUTO_GENERATE_CODES("Auto generate codes", true, true, false), - CHILDREN("Children", true, false), + CHILDREN("Children", true, false, true), - CODE("Code", true, true), + CODE("Code", true, true, true), - DESCRIPTION("Description", true, true), + DESCRIPTION("Description", true, true, true), - DISALLOW_DELETION("Disallow Deletion", false, false), + DISALLOW_DELETION("Disallow Deletion", false, false, true), - EXPERIMENT("Experiment", true, false), + EXPERIMENT("Experiment", true, false, true), - GENERATE_CODES("Generate Codes", false, false), + GENERATE_CODES("Generate Codes", false, false, true), - GENERATED_CODE_PREFIX("Generated code prefix", true, true), + GENERATED_CODE_PREFIX("Generated code prefix", true, true, true), - IDENTIFIER("Identifier", true, true), + IDENTIFIER("Identifier", true, true, true), - LABEL("Label", true, true), + LABEL("Label", true, true, true), - MAIN_DATA_SET_PATH("Main Data Set Path", false, false), + MAIN_DATA_SET_PATH("Main Data Set Path", false, false, true), - MAIN_DATA_SET_PATTERN("Main Data Set Pattern", false, false), + MAIN_DATA_SET_PATTERN("Main Data Set Pattern", false, false, true), - MODIFICATION_DATE("Modification Date", false, false), + MODIFICATION_DATE("Modification Date", false, false, true), - MODIFIER("Modifier", false, false), + MODIFIER("Modifier", false, false, true), - ONTOLOGY_ID("Ontology ID", true, false), + ONTOLOGY_ID("Ontology ID", true, false, true), - ONTOLOGY_VERSION("Ontology Version", true, false), + ONTOLOGY_VERSION("Ontology Version", true, false, true), - ONTOLOGY_ANNOTATION_ID("Ontology Annotation Id", true, false), + ONTOLOGY_ANNOTATION_ID("Ontology Annotation Id", true, false, true), - PARENTS("Parents", true, false), + PARENTS("Parents", true, false, true), - PERM_ID("PermId", false, false), + PERM_ID("PermId", false, false, true), - PRESENT_IN_ARCHIVE("Present in archive", true, false), + PRESENT_IN_ARCHIVE("Present in archive", true, false, true), - PROJECT("Project", true, true), + PROJECT("Project", true, true, true), - REGISTRATION_DATE("Registration Date", false, false), + REGISTRATION_DATE("Registration Date", false, false, true), - REGISTRATOR("Registrator", false, false), + REGISTRATOR("Registrator", false, false, true), - SAMPLE("Sample", false, false), + SAMPLE("Sample", false, false, true), - SPACE("Space", true, true), + SPACE("Space", true, true, true), - STORAGE_CONFIRMATION("Storage confirmation", false, false), + STORAGE_CONFIRMATION("Storage confirmation", false, false, true), - UNIQUE_SUBCODES("Unique Subcodes", false, false), + UNIQUE_SUBCODES("Unique Subcodes", false, false, true), - URL_TEMPLATE("URL Template", false, false), + URL_TEMPLATE("URL Template", false, false, true), - VALIDATION_SCRIPT("Validation script", true, true), + VALIDATION_SCRIPT("Validation script", true, true, true), - VERSION("Version", true, true); + VERSION("Version", true, true, false); final String name; @@ -90,11 +90,14 @@ public enum Attribute final boolean requiredForImport; - Attribute(final String name, final boolean importable, final boolean requiredForImport) + final boolean includeInDefaultList; + + Attribute(final String name, final boolean importable, final boolean requiredForImport, final boolean includeInDefaultList) { this.name = name; this.importable = importable; this.requiredForImport = requiredForImport; + this.includeInDefaultList = includeInDefaultList; } public String getName() @@ -112,4 +115,8 @@ public enum Attribute return requiredForImport; } + public boolean isIncludeInDefaultList() + { + return includeInDefaultList; + } } 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 424c4564349..dbcc1a1eca9 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 @@ -91,7 +91,9 @@ public abstract class AbstractXLSEntityExportHelper<ENTITY extends IPermIdHolder // Headers final Attribute[] importableAttributes = Arrays.stream(possibleAttributes).filter(Attribute::isImportable) .toArray(Attribute[]::new); - final Attribute[] attributes = compatibleWithImport ? importableAttributes : possibleAttributes; + final Attribute[] defaultPossibleAttributes = Arrays.stream(possibleAttributes).filter(Attribute::isIncludeInDefaultList) + .toArray(Attribute[]::new); + final Attribute[] attributes = compatibleWithImport ? importableAttributes : defaultPossibleAttributes; final String[] fieldHeaders = Stream.concat( Arrays.stream(attributes).map(Attribute::getName), diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/resources/export-sample.xlsx index 009bd2ed680e267a74920601d44e55d1693df698..ce75bbec3c14d1568bf9c66eb80feed5d1e4807c 100644 GIT binary patch delta 4228 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 WsQ#FqUzm2lxOxaL`7@^9^Zo}5K%%bz delta 4454 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 ZNbYz&{21PUZQju!uo*b<4d`xg{{xlY6`244 -- GitLab