From 0304253ebfcc1d09d4e6c2529a6d416ecb247231 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 17 Sep 2025 15:13:08 -0700 Subject: [PATCH 01/12] More commonality in how we reserve names for domains --- .../api/exp/api/SampleTypeDomainKind.java | 58 ++++++++----------- .../labkey/api/exp/property/DomainKind.java | 34 +++++++++++ .../api/assay/AssayBatchDomainKind.java | 20 ++++--- .../experiment/api/DataClassDomainKind.java | 16 ++--- 4 files changed, 80 insertions(+), 48 deletions(-) diff --git a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java index fba5debed21..d4d0eeb6101 100644 --- a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java +++ b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java @@ -18,13 +18,11 @@ import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.compliance.ComplianceService; -import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.ContainerManager; @@ -46,6 +44,7 @@ import org.labkey.api.exp.TemplateInfo; import org.labkey.api.exp.property.AbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.property.DomainProperty; import org.labkey.api.exp.query.ExpMaterialTable; import org.labkey.api.exp.query.ExpSampleTypeTable; @@ -110,38 +109,31 @@ public class SampleTypeDomainKind extends AbstractDomainKind ColumnInfo.labelFromName(col.name())).toList()); - RESERVED_NAMES.addAll(Arrays.stream(ExpMaterialTable.Column.values()).map(ExpMaterialTable.Column::name).toList()); - RESERVED_NAMES.addAll(Arrays.stream(ExpMaterialTable.Column.values()).map(col -> ColumnInfo.labelFromName(col.name())).toList()); - RESERVED_NAMES.add("Sample Type"); // Issue 52716 - RESERVED_NAMES.add("SampleType"); // Issue 52716 - RESERVED_NAMES.add("Protocol"); // alias for "SourceProtocolApplication" - RESERVED_NAMES.add("SampleTypeUnits"); // alias for MetricUnit - RESERVED_NAMES.add("Sample Type Units"); - RESERVED_NAMES.add("CpasType"); - RESERVED_NAMES.add("Cpas Type"); - RESERVED_NAMES.add(ExpMaterial.ALIQUOTED_FROM_INPUT); - RESERVED_NAMES.add("Aliquoted From"); + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels( + BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())) + ); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpSampleTypeTable.Column.values()).map(Enum::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpMaterialTable.Column.values()).map(Enum::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of( + "SampleType", // Issue 52716 + "Protocol", // alias for "SourceProtocolApplication" + "SampleTypeUnits", // alias for MetricUnit + "CpasType", + ExpMaterial.ALIQUOTED_FROM_INPUT, + "AliquotTotalVolume", // Issue 52158 + "AliquotedFromParent", + "RootMaterial", + "RecomputeRollup", + "AliquotUnit", + "ExpirationDate", // alias for MaterialExpDate + "Ancestors", + "SampleID", // alias for Name + "Status", + "Amount", // alias for storedAmount + "RunId" + ))); RESERVED_NAMES.addAll(ALIQUOT_ROLLUP_FIELD_LABELS); - RESERVED_NAMES.add("AliquotTotalVolume"); // Issue 52158: Sample Manager: data type reserved field name and label inconsistencies - RESERVED_NAMES.add("Aliquot Total Volume"); // Issue 52158: Sample Manager: data type reserved field name and label inconsistencies - RESERVED_NAMES.add("Aliquoted From Parent"); - RESERVED_NAMES.add("Root Material"); - RESERVED_NAMES.add("RecomputeRollup"); - RESERVED_NAMES.add("Recompute Rollup"); - RESERVED_NAMES.add("Aliquot Unit"); - RESERVED_NAMES.add("ExpirationDate"); // alias for MaterialExpDate - RESERVED_NAMES.add("Expiration Date"); - RESERVED_NAMES.add("Ancestors"); - RESERVED_NAMES.add("Container"); - RESERVED_NAMES.add("SampleID"); // alias for Name - RESERVED_NAMES.add("Sample ID"); - RESERVED_NAMES.add("Status"); - RESERVED_NAMES.add("Amount"); // alias for storedAmount - RESERVED_NAMES.add("RunId"); // Issue 50461 - RESERVED_NAMES.add("Run Id"); RESERVED_NAMES.addAll(InventoryService.InventoryStatusColumn.namesAndLabels()); FOREIGN_KEYS = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList( diff --git a/api/src/org/labkey/api/exp/property/DomainKind.java b/api/src/org/labkey/api/exp/property/DomainKind.java index 508ef06f025..83c37e4541c 100644 --- a/api/src/org/labkey/api/exp/property/DomainKind.java +++ b/api/src/org/labkey/api/exp/property/DomainKind.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashSet; +import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.DbSchemaType; @@ -36,6 +37,7 @@ import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; +import org.labkey.api.query.FieldKey; import org.labkey.api.query.UserSchema; import org.labkey.api.query.ValidationException; import org.labkey.api.security.User; @@ -48,6 +50,8 @@ import org.labkey.api.writer.ContainerUser; import org.labkey.data.xml.domainTemplate.DomainTemplateType; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -57,9 +61,39 @@ abstract public class DomainKind implements Handler { + protected static final Set COMMON_RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet(); + + static + { + COMMON_RESERVED_PROPERTY_NAMES.add("RowId"); + COMMON_RESERVED_PROPERTY_NAMES.add("LSID"); + COMMON_RESERVED_PROPERTY_NAMES.add("Name"); + COMMON_RESERVED_PROPERTY_NAMES.add("Container"); + COMMON_RESERVED_PROPERTY_NAMES.add("Folder"); + COMMON_RESERVED_PROPERTY_NAMES.add("CreatedBy"); + COMMON_RESERVED_PROPERTY_NAMES.add("Created"); + COMMON_RESERVED_PROPERTY_NAMES.add("ModifiedBy"); + COMMON_RESERVED_PROPERTY_NAMES.add("Modified"); + COMMON_RESERVED_PROPERTY_NAMES.add("LastIndexed"); + COMMON_RESERVED_PROPERTY_NAMES.add("*"); // Issue 53416 + } + public static final Logger LOG = LogHelper.getLogger(DomainKind.class, "Generic domain kind activities."); abstract public String getKindName(); + public static Set namesAndLabels(Collection names) + { + Set values = new CaseInsensitiveHashSet(); + for (String name : names) + { + values.add(name); + String label = ColumnInfo.labelFromName(name); + values.add(label); + values.add(label.replaceAll("\\s", "")); + } + return values; + } + /** * Return a class of DomainKind's bean which carries domain specific properties. * This class will be used when marshalling/unmarshalling via Jackson during Create and Save/Update Domain diff --git a/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java index 090deac4b7c..c4633315a96 100644 --- a/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java @@ -15,11 +15,15 @@ */ package org.labkey.api.assay; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.query.ExpExperimentTable; import org.labkey.api.security.User; +import java.util.Arrays; +import java.util.List; import java.util.Set; /** @@ -28,6 +32,13 @@ */ public class AssayBatchDomainKind extends AssayDomainKind { + private static final Set RESERVED_NAMES; + + static { + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpExperimentTable.Column.values()).map( ExpExperimentTable.Column::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of("AssayId"))); + } public AssayBatchDomainKind() { super(ExpProtocol.ASSAY_DOMAIN_BATCH); @@ -42,14 +53,7 @@ public String getKindName() @Override public Set getReservedPropertyNames(Domain domain, User user) { - Set result = super.getAssayReservedPropertyNames(); - for (ExpExperimentTable.Column column : ExpExperimentTable.Column.values()) - { - result.add(column.toString()); - } - result.add("AssayId"); - result.add("Assay Id"); - return result; + return RESERVED_NAMES; } @Override diff --git a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java index 7efec176896..b727ba361de 100644 --- a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.compliance.ComplianceService; -import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.DbSchema; @@ -46,6 +45,7 @@ import org.labkey.api.exp.api.SampleTypeService; import org.labkey.api.exp.property.AbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.query.DataClassUserSchema; import org.labkey.api.exp.query.ExpDataClassDataTable; import org.labkey.api.gwt.client.DefaultValueType; @@ -101,12 +101,14 @@ public class DataClassDomainKind extends AbstractDomainKind ColumnInfo.labelFromName(col.name())).toList()); - RESERVED_NAMES.add("Container"); - RESERVED_NAMES.add("RunId"); // Issue 50461 - RESERVED_NAMES.add("Run Id"); + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels( + BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())) + ); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpDataClassDataTable.Column.values()).map(ExpDataClassDataTable.Column::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of( + "RunId" // Issue 50461 + ))); FOREIGN_KEYS = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList( // NOTE: We join to exp.data using LSID instead of rowid for insert performance -- we will generate From e09cda456ca38a50502f23790cdcd8a98444fba9 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 09:52:29 -0700 Subject: [PATCH 02/12] Issue 53416: Don't allow * as a field name --- .../labkey/api/exp/property/DomainUtil.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index bf6436e8926..325291dccdf 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -116,6 +116,7 @@ public class DomainUtil { private static final Logger LOG = LogManager.getLogger(DomainUtil.class); public static final String ILLEGAL_DOMAIN_NAME_CHARSET = "<>[]{};,`\"~!@#$%^*=|?\\"; + public static final Set ILLEGAL_PROPERTY_NAMES = Set.of("*"); // Issue 53416 private DomainUtil() { @@ -1433,6 +1434,11 @@ public static ValidationException validateProperties(@Nullable Domain domain, @N continue; } + if (ILLEGAL_PROPERTY_NAMES.contains(name.trim())) + { + exception.addError(new SimpleValidationError(getDomainErrorMessage(updates, "The name '" + name + "' is not allowed."))); + } + Matcher expMatcher = SUBSTITUTION_EXP_PATTERN.matcher(name); if (expMatcher.find()) { @@ -1529,4 +1535,27 @@ private static Map getOriginalFieldPropertyIdNameMap(@Nullable } return null; } + + public static Set nameAndLabels(String name) + { + Set values = new CaseInsensitiveHashSet(); + values.add(name); + String label = ColumnInfo.labelFromName(name); + values.add(label); + values.add(label.replaceAll("\\s", "")); + return values; + } + + public static Set namesAndLabels(Collection names) + { + Set values = new CaseInsensitiveHashSet(); + for (String name : names) + { + values.add(name); + String label = ColumnInfo.labelFromName(name); + values.add(label); + values.add(label.replaceAll("\\s", "")); + } + return values; + } } From 4ddbe0db49a58dbf88496a5d0cd976d7d9d4bfb2 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 10:12:43 -0700 Subject: [PATCH 03/12] Update error message --- api/src/org/labkey/api/exp/property/DomainUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index 325291dccdf..c3f932b9851 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -1436,7 +1436,7 @@ public static ValidationException validateProperties(@Nullable Domain domain, @N if (ILLEGAL_PROPERTY_NAMES.contains(name.trim())) { - exception.addError(new SimpleValidationError(getDomainErrorMessage(updates, "The name '" + name + "' is not allowed."))); + exception.addError(new SimpleValidationError(getDomainErrorMessage(updates, "The field name '" + name + "' is not allowed."))); } Matcher expMatcher = SUBSTITUTION_EXP_PATTERN.matcher(name); From a84ac6e0a04dfcb6ebf5e7650649bd9f098d672f Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Wed, 17 Sep 2025 15:13:08 -0700 Subject: [PATCH 04/12] More commonality in how we reserve names for domains --- .../api/exp/api/SampleTypeDomainKind.java | 58 ++++++++----------- .../labkey/api/exp/property/DomainKind.java | 34 +++++++++++ .../api/assay/AssayBatchDomainKind.java | 20 ++++--- .../experiment/api/DataClassDomainKind.java | 16 ++--- 4 files changed, 80 insertions(+), 48 deletions(-) diff --git a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java index fba5debed21..d4d0eeb6101 100644 --- a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java +++ b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java @@ -18,13 +18,11 @@ import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.compliance.ComplianceService; -import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.ContainerManager; @@ -46,6 +44,7 @@ import org.labkey.api.exp.TemplateInfo; import org.labkey.api.exp.property.AbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.property.DomainProperty; import org.labkey.api.exp.query.ExpMaterialTable; import org.labkey.api.exp.query.ExpSampleTypeTable; @@ -110,38 +109,31 @@ public class SampleTypeDomainKind extends AbstractDomainKind ColumnInfo.labelFromName(col.name())).toList()); - RESERVED_NAMES.addAll(Arrays.stream(ExpMaterialTable.Column.values()).map(ExpMaterialTable.Column::name).toList()); - RESERVED_NAMES.addAll(Arrays.stream(ExpMaterialTable.Column.values()).map(col -> ColumnInfo.labelFromName(col.name())).toList()); - RESERVED_NAMES.add("Sample Type"); // Issue 52716 - RESERVED_NAMES.add("SampleType"); // Issue 52716 - RESERVED_NAMES.add("Protocol"); // alias for "SourceProtocolApplication" - RESERVED_NAMES.add("SampleTypeUnits"); // alias for MetricUnit - RESERVED_NAMES.add("Sample Type Units"); - RESERVED_NAMES.add("CpasType"); - RESERVED_NAMES.add("Cpas Type"); - RESERVED_NAMES.add(ExpMaterial.ALIQUOTED_FROM_INPUT); - RESERVED_NAMES.add("Aliquoted From"); + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels( + BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())) + ); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpSampleTypeTable.Column.values()).map(Enum::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpMaterialTable.Column.values()).map(Enum::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of( + "SampleType", // Issue 52716 + "Protocol", // alias for "SourceProtocolApplication" + "SampleTypeUnits", // alias for MetricUnit + "CpasType", + ExpMaterial.ALIQUOTED_FROM_INPUT, + "AliquotTotalVolume", // Issue 52158 + "AliquotedFromParent", + "RootMaterial", + "RecomputeRollup", + "AliquotUnit", + "ExpirationDate", // alias for MaterialExpDate + "Ancestors", + "SampleID", // alias for Name + "Status", + "Amount", // alias for storedAmount + "RunId" + ))); RESERVED_NAMES.addAll(ALIQUOT_ROLLUP_FIELD_LABELS); - RESERVED_NAMES.add("AliquotTotalVolume"); // Issue 52158: Sample Manager: data type reserved field name and label inconsistencies - RESERVED_NAMES.add("Aliquot Total Volume"); // Issue 52158: Sample Manager: data type reserved field name and label inconsistencies - RESERVED_NAMES.add("Aliquoted From Parent"); - RESERVED_NAMES.add("Root Material"); - RESERVED_NAMES.add("RecomputeRollup"); - RESERVED_NAMES.add("Recompute Rollup"); - RESERVED_NAMES.add("Aliquot Unit"); - RESERVED_NAMES.add("ExpirationDate"); // alias for MaterialExpDate - RESERVED_NAMES.add("Expiration Date"); - RESERVED_NAMES.add("Ancestors"); - RESERVED_NAMES.add("Container"); - RESERVED_NAMES.add("SampleID"); // alias for Name - RESERVED_NAMES.add("Sample ID"); - RESERVED_NAMES.add("Status"); - RESERVED_NAMES.add("Amount"); // alias for storedAmount - RESERVED_NAMES.add("RunId"); // Issue 50461 - RESERVED_NAMES.add("Run Id"); RESERVED_NAMES.addAll(InventoryService.InventoryStatusColumn.namesAndLabels()); FOREIGN_KEYS = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList( diff --git a/api/src/org/labkey/api/exp/property/DomainKind.java b/api/src/org/labkey/api/exp/property/DomainKind.java index 508ef06f025..83c37e4541c 100644 --- a/api/src/org/labkey/api/exp/property/DomainKind.java +++ b/api/src/org/labkey/api/exp/property/DomainKind.java @@ -20,6 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashSet; +import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.DbSchemaType; @@ -36,6 +37,7 @@ import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; +import org.labkey.api.query.FieldKey; import org.labkey.api.query.UserSchema; import org.labkey.api.query.ValidationException; import org.labkey.api.security.User; @@ -48,6 +50,8 @@ import org.labkey.api.writer.ContainerUser; import org.labkey.data.xml.domainTemplate.DomainTemplateType; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; @@ -57,9 +61,39 @@ abstract public class DomainKind implements Handler { + protected static final Set COMMON_RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet(); + + static + { + COMMON_RESERVED_PROPERTY_NAMES.add("RowId"); + COMMON_RESERVED_PROPERTY_NAMES.add("LSID"); + COMMON_RESERVED_PROPERTY_NAMES.add("Name"); + COMMON_RESERVED_PROPERTY_NAMES.add("Container"); + COMMON_RESERVED_PROPERTY_NAMES.add("Folder"); + COMMON_RESERVED_PROPERTY_NAMES.add("CreatedBy"); + COMMON_RESERVED_PROPERTY_NAMES.add("Created"); + COMMON_RESERVED_PROPERTY_NAMES.add("ModifiedBy"); + COMMON_RESERVED_PROPERTY_NAMES.add("Modified"); + COMMON_RESERVED_PROPERTY_NAMES.add("LastIndexed"); + COMMON_RESERVED_PROPERTY_NAMES.add("*"); // Issue 53416 + } + public static final Logger LOG = LogHelper.getLogger(DomainKind.class, "Generic domain kind activities."); abstract public String getKindName(); + public static Set namesAndLabels(Collection names) + { + Set values = new CaseInsensitiveHashSet(); + for (String name : names) + { + values.add(name); + String label = ColumnInfo.labelFromName(name); + values.add(label); + values.add(label.replaceAll("\\s", "")); + } + return values; + } + /** * Return a class of DomainKind's bean which carries domain specific properties. * This class will be used when marshalling/unmarshalling via Jackson during Create and Save/Update Domain diff --git a/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java index 090deac4b7c..c4633315a96 100644 --- a/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java @@ -15,11 +15,15 @@ */ package org.labkey.api.assay; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.query.ExpExperimentTable; import org.labkey.api.security.User; +import java.util.Arrays; +import java.util.List; import java.util.Set; /** @@ -28,6 +32,13 @@ */ public class AssayBatchDomainKind extends AssayDomainKind { + private static final Set RESERVED_NAMES; + + static { + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpExperimentTable.Column.values()).map( ExpExperimentTable.Column::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of("AssayId"))); + } public AssayBatchDomainKind() { super(ExpProtocol.ASSAY_DOMAIN_BATCH); @@ -42,14 +53,7 @@ public String getKindName() @Override public Set getReservedPropertyNames(Domain domain, User user) { - Set result = super.getAssayReservedPropertyNames(); - for (ExpExperimentTable.Column column : ExpExperimentTable.Column.values()) - { - result.add(column.toString()); - } - result.add("AssayId"); - result.add("Assay Id"); - return result; + return RESERVED_NAMES; } @Override diff --git a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java index 7efec176896..b727ba361de 100644 --- a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java @@ -22,7 +22,6 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.compliance.ComplianceService; -import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.DbSchema; @@ -46,6 +45,7 @@ import org.labkey.api.exp.api.SampleTypeService; import org.labkey.api.exp.property.AbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.query.DataClassUserSchema; import org.labkey.api.exp.query.ExpDataClassDataTable; import org.labkey.api.gwt.client.DefaultValueType; @@ -101,12 +101,14 @@ public class DataClassDomainKind extends AbstractDomainKind ColumnInfo.labelFromName(col.name())).toList()); - RESERVED_NAMES.add("Container"); - RESERVED_NAMES.add("RunId"); // Issue 50461 - RESERVED_NAMES.add("Run Id"); + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels( + BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())) + ); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpDataClassDataTable.Column.values()).map(ExpDataClassDataTable.Column::name).toList())); + RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of( + "RunId" // Issue 50461 + ))); FOREIGN_KEYS = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList( // NOTE: We join to exp.data using LSID instead of rowid for insert performance -- we will generate From 826833c9825ec090527a5b451b2b492299ecaa4d Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 09:52:29 -0700 Subject: [PATCH 05/12] Issue 53416: Don't allow * as a field name --- .../labkey/api/exp/property/DomainUtil.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index bf6436e8926..325291dccdf 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -116,6 +116,7 @@ public class DomainUtil { private static final Logger LOG = LogManager.getLogger(DomainUtil.class); public static final String ILLEGAL_DOMAIN_NAME_CHARSET = "<>[]{};,`\"~!@#$%^*=|?\\"; + public static final Set ILLEGAL_PROPERTY_NAMES = Set.of("*"); // Issue 53416 private DomainUtil() { @@ -1433,6 +1434,11 @@ public static ValidationException validateProperties(@Nullable Domain domain, @N continue; } + if (ILLEGAL_PROPERTY_NAMES.contains(name.trim())) + { + exception.addError(new SimpleValidationError(getDomainErrorMessage(updates, "The name '" + name + "' is not allowed."))); + } + Matcher expMatcher = SUBSTITUTION_EXP_PATTERN.matcher(name); if (expMatcher.find()) { @@ -1529,4 +1535,27 @@ private static Map getOriginalFieldPropertyIdNameMap(@Nullable } return null; } + + public static Set nameAndLabels(String name) + { + Set values = new CaseInsensitiveHashSet(); + values.add(name); + String label = ColumnInfo.labelFromName(name); + values.add(label); + values.add(label.replaceAll("\\s", "")); + return values; + } + + public static Set namesAndLabels(Collection names) + { + Set values = new CaseInsensitiveHashSet(); + for (String name : names) + { + values.add(name); + String label = ColumnInfo.labelFromName(name); + values.add(label); + values.add(label.replaceAll("\\s", "")); + } + return values; + } } From 9e8611dc59564569a5409e4ceb0f93add1e2d7d2 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 10:12:43 -0700 Subject: [PATCH 06/12] Update error message --- api/src/org/labkey/api/exp/property/DomainUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index 325291dccdf..c3f932b9851 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -1436,7 +1436,7 @@ public static ValidationException validateProperties(@Nullable Domain domain, @N if (ILLEGAL_PROPERTY_NAMES.contains(name.trim())) { - exception.addError(new SimpleValidationError(getDomainErrorMessage(updates, "The name '" + name + "' is not allowed."))); + exception.addError(new SimpleValidationError(getDomainErrorMessage(updates, "The field name '" + name + "' is not allowed."))); } Matcher expMatcher = SUBSTITUTION_EXP_PATTERN.matcher(name); From bea766e6ace17d6cfba45b27b99d3c294292bb66 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 11:28:24 -0700 Subject: [PATCH 07/12] Relocated utility method --- .../api/exp/api/SampleTypeDomainKind.java | 13 ++++--- .../labkey/api/exp/property/DomainKind.java | 34 ------------------- 2 files changed, 6 insertions(+), 41 deletions(-) diff --git a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java index d4d0eeb6101..5c429f1c7c7 100644 --- a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java +++ b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java @@ -44,8 +44,8 @@ import org.labkey.api.exp.TemplateInfo; import org.labkey.api.exp.property.AbstractDomainKind; import org.labkey.api.exp.property.Domain; -import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.property.DomainProperty; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.query.ExpMaterialTable; import org.labkey.api.exp.query.ExpSampleTypeTable; import org.labkey.api.exp.query.SamplesSchema; @@ -109,13 +109,12 @@ public class SampleTypeDomainKind extends AbstractDomainKind implements Handler { - protected static final Set COMMON_RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet(); - - static - { - COMMON_RESERVED_PROPERTY_NAMES.add("RowId"); - COMMON_RESERVED_PROPERTY_NAMES.add("LSID"); - COMMON_RESERVED_PROPERTY_NAMES.add("Name"); - COMMON_RESERVED_PROPERTY_NAMES.add("Container"); - COMMON_RESERVED_PROPERTY_NAMES.add("Folder"); - COMMON_RESERVED_PROPERTY_NAMES.add("CreatedBy"); - COMMON_RESERVED_PROPERTY_NAMES.add("Created"); - COMMON_RESERVED_PROPERTY_NAMES.add("ModifiedBy"); - COMMON_RESERVED_PROPERTY_NAMES.add("Modified"); - COMMON_RESERVED_PROPERTY_NAMES.add("LastIndexed"); - COMMON_RESERVED_PROPERTY_NAMES.add("*"); // Issue 53416 - } - public static final Logger LOG = LogHelper.getLogger(DomainKind.class, "Generic domain kind activities."); abstract public String getKindName(); - public static Set namesAndLabels(Collection names) - { - Set values = new CaseInsensitiveHashSet(); - for (String name : names) - { - values.add(name); - String label = ColumnInfo.labelFromName(name); - values.add(label); - values.add(label.replaceAll("\\s", "")); - } - return values; - } - /** * Return a class of DomainKind's bean which carries domain specific properties. * This class will be used when marshalling/unmarshalling via Jackson during Create and Save/Update Domain From b5f58972f781050d73c3021e3abd4fff6b3fc5d0 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 13:10:34 -0700 Subject: [PATCH 08/12] More consistency in reserving names and labels of fields --- .../audit/query/AbstractAuditDomainKind.java | 2 +- .../api/exp/api/SampleTypeDomainKind.java | 14 ++++---- .../labkey/api/exp/property/DomainUtil.java | 4 +-- .../api/exp/property/TestDomainKind.java | 3 +- .../api/query/SimpleTableDomainKind.java | 23 +++++------- .../api/assay/AssayBatchDomainKind.java | 12 +++---- .../org/labkey/api/assay/AssayDomainKind.java | 30 +++++++++------- .../api/assay/AssayResultDomainKind.java | 18 +++++++--- .../labkey/api/assay/AssayRunDomainKind.java | 26 +++++++++----- .../labkey/assay/DefaultAssayDomainKind.java | 3 +- .../PlateBasedAssaySampleTypeDomainKind.java | 5 +-- .../assay/plate/PlateMetadataDomainKind.java | 4 +-- .../plate/PlateReplicateStatsDomainKind.java | 3 +- .../labkey/core/query/UsersDomainKind.java | 36 +++++++++++-------- .../experiment/api/DataClassDomainKind.java | 12 +++---- .../experiment/api/VocabularyDomainKind.java | 25 ++++++------- .../api/property/StorageProvisionerImpl.java | 5 +-- .../filecontent/FilePropertiesDomainKind.java | 16 ++++----- .../issue/query/IssueDefDomainKind.java | 23 ++++++------ .../org/labkey/list/model/ListDomainKind.java | 14 +++----- .../model/AbstractSpecimenDomainKind.java | 5 +-- .../specimen/model/SpecimenDomainKind.java | 10 +++--- .../model/SpecimenEventDomainKind.java | 10 +++--- .../api/specimen/model/VialDomainKind.java | 10 +++--- .../query/AbstractStudyDesignDomainKind.java | 18 +++++----- .../study/model/BaseStudyDomainKind.java | 3 +- .../model/ContinuousDatasetDomainKind.java | 3 +- .../labkey/study/model/DatasetDomainKind.java | 6 ++-- .../study/model/DateDatasetDomainKind.java | 5 +-- .../study/model/TestDatasetDomainKind.java | 3 +- .../study/model/VisitDatasetDomainKind.java | 9 +++-- 31 files changed, 194 insertions(+), 166 deletions(-) diff --git a/api/src/org/labkey/api/audit/query/AbstractAuditDomainKind.java b/api/src/org/labkey/api/audit/query/AbstractAuditDomainKind.java index c3dfbbb0b11..4c7635376cf 100644 --- a/api/src/org/labkey/api/audit/query/AbstractAuditDomainKind.java +++ b/api/src/org/labkey/api/audit/query/AbstractAuditDomainKind.java @@ -302,7 +302,7 @@ public boolean hasNullValues(Domain domain, DomainProperty prop) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { Set names = new HashSet<>(); diff --git a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java index 5c429f1c7c7..b71d90b3a84 100644 --- a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java +++ b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java @@ -109,12 +109,12 @@ public class SampleTypeDomainKind extends AbstractDomainKind getBaseProperties(Domain domain) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return getReservedPropertyNames(domain, user, false); } @Override - public Set getReservedPropertyNames(Domain domain, User user, boolean forCreate) + public @NotNull Set getReservedPropertyNames(Domain domain, User user, boolean forCreate) { Set reserved = new CaseInsensitiveHashSet(RESERVED_NAMES); diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index c3f932b9851..be53dec1a47 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -1536,7 +1536,7 @@ private static Map getOriginalFieldPropertyIdNameMap(@Nullable return null; } - public static Set nameAndLabels(String name) + public static Set getNameAndLabels(String name) { Set values = new CaseInsensitiveHashSet(); values.add(name); @@ -1546,7 +1546,7 @@ public static Set nameAndLabels(String name) return values; } - public static Set namesAndLabels(Collection names) + public static Set getNamesAndLabels(Collection names) { Set values = new CaseInsensitiveHashSet(); for (String name : names) diff --git a/api/src/org/labkey/api/exp/property/TestDomainKind.java b/api/src/org/labkey/api/exp/property/TestDomainKind.java index 363125723f5..99aabb991f7 100644 --- a/api/src/org/labkey/api/exp/property/TestDomainKind.java +++ b/api/src/org/labkey/api/exp/property/TestDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.api.exp.property; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; import org.labkey.api.data.Container; @@ -147,7 +148,7 @@ public void deletePropertyDescriptor(Domain domain, User user, PropertyDescripto } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { throw new UnsupportedOperationException(); } diff --git a/api/src/org/labkey/api/query/SimpleTableDomainKind.java b/api/src/org/labkey/api/query/SimpleTableDomainKind.java index a5b5ac8581a..6ddb80b2af8 100644 --- a/api/src/org/labkey/api/query/SimpleTableDomainKind.java +++ b/api/src/org/labkey/api/query/SimpleTableDomainKind.java @@ -15,12 +15,11 @@ */ package org.labkey.api.query; -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerType; @@ -34,6 +33,7 @@ import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.BaseAbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.exp.xar.LsidUtils; import org.labkey.api.gwt.client.model.GWTDomain; @@ -242,21 +242,16 @@ public boolean canEditDefinition(User user, Domain domain) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { SimpleUserSchema.SimpleTable table = domain != null ? getTable(domain, user) : null; if (table != null) { - // return the set of built-in column names. - return Sets.newHashSet(Iterables.transform(table.getBuiltInColumns(), - new Function() { - @Override - public String apply(ColumnInfo col) - { - return col.getName(); - } - } - )); + Set set = new CaseInsensitiveHashSet(); + ((Iterable) table.getBuiltInColumns()).forEach(col -> { + set.addAll(DomainUtil.getNameAndLabels(col.getName())); + }); + return set; } return Collections.emptySet(); } diff --git a/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java index c4633315a96..fb91f6a379f 100644 --- a/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayBatchDomainKind.java @@ -15,15 +15,15 @@ */ package org.labkey.api.assay; +import org.jetbrains.annotations.NotNull; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; -import org.labkey.api.exp.property.DomainKind; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.query.ExpExperimentTable; import org.labkey.api.security.User; import java.util.Arrays; -import java.util.List; import java.util.Set; /** @@ -35,9 +35,9 @@ public class AssayBatchDomainKind extends AssayDomainKind private static final Set RESERVED_NAMES; static { - RESERVED_NAMES = new CaseInsensitiveHashSet(DomainKind.namesAndLabels(COMMON_RESERVED_PROPERTY_NAMES)); - RESERVED_NAMES.addAll(DomainKind.namesAndLabels(Arrays.stream(ExpExperimentTable.Column.values()).map( ExpExperimentTable.Column::name).toList())); - RESERVED_NAMES.addAll(DomainKind.namesAndLabels(List.of("AssayId"))); + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(Arrays.stream(ExpExperimentTable.Column.values()).map( ExpExperimentTable.Column::name).toList())); + RESERVED_NAMES.addAll(getAssayReservedPropertyNames()); + RESERVED_NAMES.addAll(DomainUtil.getNameAndLabels("AssayId")); } public AssayBatchDomainKind() { @@ -51,7 +51,7 @@ public String getKindName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return RESERVED_NAMES; } diff --git a/assay/api-src/org/labkey/api/assay/AssayDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayDomainKind.java index 111079ea908..d62b572460f 100644 --- a/assay/api-src/org/labkey/api/assay/AssayDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayDomainKind.java @@ -33,6 +33,7 @@ import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.property.BaseAbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.model.GWTDomain; @@ -48,6 +49,7 @@ import org.labkey.api.view.ActionURL; import org.labkey.api.writer.ContainerUser; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -55,6 +57,20 @@ public abstract class AssayDomainKind extends BaseAbstractDomainKind { private final String _namespacePrefix; private final Priority _priority; + private static final Set RESERVED_NAMES; + static { + Set s = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(List.of( + "RowId", + "Container", + "LSID", + "Owner", + "CreatedBy", + "Created", + "ModifiedBy", + "Modified" + ))); + RESERVED_NAMES = Collections.unmodifiableSet(s); + } protected AssayDomainKind(String namespacePrefix) { @@ -210,19 +226,9 @@ public Domain createDomain(GWTDomain domain, JSONObject arguments, Container con return PropertyService.get().getDomain(container, dd.getDomainURI(), forUpdate); } - protected Set getAssayReservedPropertyNames() + protected static Set getAssayReservedPropertyNames() { - Set result = new CaseInsensitiveHashSet(); - result.add("RowId"); - result.add("Row Id"); - result.add("Container"); - result.add("LSID"); - result.add("Owner"); - result.add("CreatedBy"); - result.add("Created"); - result.add("ModifiedBy"); - result.add("Modified"); - return result; + return RESERVED_NAMES; } @Override diff --git a/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java index a72c27169b7..d6e4000a671 100644 --- a/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java @@ -16,6 +16,8 @@ package org.labkey.api.assay; +import org.jetbrains.annotations.NotNull; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.Container; import org.labkey.api.data.DbSchema; import org.labkey.api.data.DbScope; @@ -25,6 +27,7 @@ import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.query.FieldKey; import org.labkey.api.security.User; import org.labkey.api.util.PageFlowUtil; @@ -32,6 +35,7 @@ import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import static org.labkey.api.assay.AssayFileWriter.DIR_NAME; @@ -42,6 +46,13 @@ public class AssayResultDomainKind extends AssayDomainKind { + private static final Set RESERVED_NAMES; + static + { + RESERVED_NAMES = new CaseInsensitiveHashSet(getAssayReservedPropertyNames()); + RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(List.of("Run", "DataId"))); + } + public enum Column { Plate, @@ -119,12 +130,9 @@ public DbSchema getSchema() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set result = getAssayReservedPropertyNames(); - result.add("Run"); - result.add("DataId"); - return result; + return RESERVED_NAMES; } @Override diff --git a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java index 1af89502bda..a058e9747ff 100644 --- a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java @@ -15,17 +15,32 @@ */ package org.labkey.api.assay; +import org.jetbrains.annotations.NotNull; import org.labkey.api.assay.plate.AssayPlateMetadataService; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.query.ExpRunTable; import org.labkey.api.security.User; import org.labkey.api.util.Pair; +import java.util.Arrays; import java.util.Set; +import java.util.stream.Collectors; public class AssayRunDomainKind extends AssayDomainKind { + private static final Set RESERVED_NAMES; + static + { + RESERVED_NAMES = new CaseInsensitiveHashSet(getAssayReservedPropertyNames()); + RESERVED_NAMES.addAll(DomainUtil.getNameAndLabels("AsasyId")); + RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels( + Arrays.stream(ExpRunTable.Column.values()).map(Enum::name).collect(Collectors.toSet()) + )); + } + public AssayRunDomainKind() { super(ExpProtocol.ASSAY_DOMAIN_RUN); @@ -38,16 +53,9 @@ public String getKindName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set result = getAssayReservedPropertyNames(); - for (ExpRunTable.Column column : ExpRunTable.Column.values()) - { - result.add(column.toString()); - } - result.add("AssayId"); - result.add("Assay Id"); - return result; + return RESERVED_NAMES; } @Override diff --git a/assay/src/org/labkey/assay/DefaultAssayDomainKind.java b/assay/src/org/labkey/assay/DefaultAssayDomainKind.java index 60802a7e691..56fef31c8f8 100644 --- a/assay/src/org/labkey/assay/DefaultAssayDomainKind.java +++ b/assay/src/org/labkey/assay/DefaultAssayDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.assay; +import org.jetbrains.annotations.NotNull; import org.labkey.api.assay.AssayDomainKind; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; @@ -42,7 +43,7 @@ public String getKindName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return getAssayReservedPropertyNames(); } diff --git a/assay/src/org/labkey/assay/PlateBasedAssaySampleTypeDomainKind.java b/assay/src/org/labkey/assay/PlateBasedAssaySampleTypeDomainKind.java index 95e1f781a9b..a87b0de7996 100644 --- a/assay/src/org/labkey/assay/PlateBasedAssaySampleTypeDomainKind.java +++ b/assay/src/org/labkey/assay/PlateBasedAssaySampleTypeDomainKind.java @@ -34,6 +34,7 @@ import org.labkey.api.writer.ContainerUser; import org.labkey.api.exp.api.SampleTypeDomainKind; +import java.util.Collections; import java.util.Set; /** @@ -56,9 +57,9 @@ public String getKindName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - return null; + return Collections.emptySet(); } }; } diff --git a/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java b/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java index b5a3d7f1684..65bb914028f 100644 --- a/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java +++ b/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java @@ -73,7 +73,7 @@ public enum Column static { - RESERVED_NAMES = new CaseInsensitiveHashSet(Arrays.stream(Column.values()).map(Enum::name).toList()); + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(Arrays.stream(Column.values()).map(Enum::name).toList())); INDEXES = Set.of(new PropertyStorageSpec.Index(true, Column.Lsid.name())); REQUIRED_PROPS = List.of( new PropertyStorageSpec(Column.Amount.name(), JdbcType.DOUBLE), @@ -217,7 +217,7 @@ public SQLFragment sqlObjectIdsInDomain(Domain domain) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return RESERVED_NAMES; } diff --git a/assay/src/org/labkey/assay/plate/PlateReplicateStatsDomainKind.java b/assay/src/org/labkey/assay/plate/PlateReplicateStatsDomainKind.java index 3f9afa3bfb6..a25e0911006 100644 --- a/assay/src/org/labkey/assay/plate/PlateReplicateStatsDomainKind.java +++ b/assay/src/org/labkey/assay/plate/PlateReplicateStatsDomainKind.java @@ -1,5 +1,6 @@ package org.labkey.assay.plate; +import org.jetbrains.annotations.NotNull; import org.labkey.api.assay.AbstractTsvAssayProvider; import org.labkey.api.assay.AssayDomainKind; import org.labkey.api.assay.plate.PlateSet; @@ -50,7 +51,7 @@ public String getKindName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return getAssayReservedPropertyNames(); } diff --git a/core/src/org/labkey/core/query/UsersDomainKind.java b/core/src/org/labkey/core/query/UsersDomainKind.java index b5fcceed910..7147671e195 100644 --- a/core/src/org/labkey/core/query/UsersDomainKind.java +++ b/core/src/org/labkey/core/query/UsersDomainKind.java @@ -15,8 +15,10 @@ */ package org.labkey.core.query; +import org.jetbrains.annotations.NotNull; import org.json.JSONObject; import org.labkey.api.collections.CaseInsensitiveHashMap; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; @@ -31,6 +33,7 @@ import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainProperty; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.module.ModuleContext; @@ -57,23 +60,26 @@ public class UsersDomainKind extends SimpleTableDomainKind { public static final String NAME = "CoreUsersTable"; - private static final Set _reservedNames = new HashSet<>(); + private static final Set _reservedNames = new CaseInsensitiveHashSet(); private static final List _requiredProperties = new ArrayList<>(); static { - _reservedNames.add("Email"); - _reservedNames.add("_ts"); - _reservedNames.add("EntityId"); - _reservedNames.add("CreatedBy"); - _reservedNames.add("Created"); - _reservedNames.add("ModifiedBy"); - _reservedNames.add("Modified"); - _reservedNames.add("Owner"); - _reservedNames.add("UserId"); - _reservedNames.add("DisplayName"); - _reservedNames.add("LastLogin"); - _reservedNames.add("Active"); - _reservedNames.add("ExpirationDate"); + _reservedNames.addAll(DomainUtil.getNamesAndLabels(List.of( + "Email", + "_ts", + "EntityId", + "CreatedBy", + "Created", + "ModifiedBy", + "Modified", + "Owner", + "UserId", + "DisplayName", + "LastLogin", + "Active", + "ExpirationDate" + ))); + _requiredProperties.add(new PropertyDescriptorSpec("FirstName", PropertyType.STRING, 64, false)); _requiredProperties.add(new PropertyDescriptorSpec("LastName", PropertyType.STRING, 64, false)); @@ -154,7 +160,7 @@ public Domain createDomain(GWTDomain domain, JSONObject arguments, Container con } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return _reservedNames; } diff --git a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java index b727ba361de..1d390132ae3 100644 --- a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java @@ -45,7 +45,7 @@ import org.labkey.api.exp.api.SampleTypeService; import org.labkey.api.exp.property.AbstractDomainKind; import org.labkey.api.exp.property.Domain; -import org.labkey.api.exp.property.DomainKind; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.query.DataClassUserSchema; import org.labkey.api.exp.query.ExpDataClassDataTable; import org.labkey.api.gwt.client.DefaultValueType; @@ -100,13 +100,11 @@ public class DataClassDomainKind extends AbstractDomainKind getBaseProperties(Domain domain) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return RESERVED_NAMES; } diff --git a/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java b/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java index daddfde1180..7927a2d5f45 100644 --- a/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java @@ -1,6 +1,7 @@ package org.labkey.experiment.api; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; import org.labkey.api.collections.CaseInsensitiveHashSet; @@ -26,7 +27,6 @@ import org.labkey.api.writer.ContainerUser; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -37,6 +37,13 @@ public class VocabularyDomainKind extends BaseAbstractDomainKind { public static final String KIND_NAME = "Vocabulary"; + private static final Set RESERVED_PROPERTY_NAMES; + static + { + RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels( + List.of("RowId", "LSID", "EntityId", "Container", "Folder", "CreatedBy", "Created", "ModifiedBy", "Modified", "Owner", "LastIndexed") + )); + } @Override public String getKindName() @@ -72,21 +79,9 @@ public ActionURL urlShowData(Domain domain, ContainerUser containerUser) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set reservedProperties = new HashSet<>(); - reservedProperties.add("RowId"); - reservedProperties.add("LSID"); - reservedProperties.add("EntityId"); - reservedProperties.add("Container"); - reservedProperties.add("Folder"); - reservedProperties.add("CreatedBy"); - reservedProperties.add("Created"); - reservedProperties.add("ModifiedBy"); - reservedProperties.add("Modified"); - reservedProperties.add("Owner"); - reservedProperties.add("LastIndexed"); - return reservedProperties; + return RESERVED_PROPERTY_NAMES; } @Override diff --git a/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java b/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java index 75c01943dcd..47cd48e4b94 100644 --- a/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java +++ b/experiment/src/org/labkey/experiment/api/property/StorageProvisionerImpl.java @@ -98,6 +98,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -1712,9 +1713,9 @@ public ActionURL urlShowData(Domain domain, ContainerUser containerUser) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - return Set.of(); + return Collections.emptySet(); } @Override diff --git a/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java b/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java index b62130335ec..959a78feb1f 100644 --- a/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java +++ b/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.filecontent; +import org.jetbrains.annotations.NotNull; import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.compliance.ComplianceService; import org.labkey.api.data.SQLFragment; @@ -22,6 +23,7 @@ import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.BaseAbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.query.ExpDataTable; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.security.User; @@ -33,6 +35,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * User: klum @@ -56,10 +59,9 @@ public class FilePropertiesDomainKind extends BaseAbstractDomainKind private static final Set _reservedFieldSet; static { - Set s = new CaseInsensitiveHashSet(RESERVED_FIELDS); + Set s = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(RESERVED_FIELDS)); - for (ExpDataTable.Column col : ExpDataTable.Column.values()) - s.add(col.name()); + s.addAll(DomainUtil.getNamesAndLabels(Arrays.stream(ExpDataTable.Column.values()).map(Enum::name).collect(Collectors.toSet()))); _reservedFieldSet = Collections.unmodifiableSet(s); } @@ -101,7 +103,7 @@ public ActionURL urlEditDefinition(Domain domain, ContainerUser containerUser) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return _reservedFieldSet; } @@ -118,12 +120,6 @@ public DefaultValueType[] getDefaultValueOptions(Domain domain) return new DefaultValueType[] { DefaultValueType.FIXED_EDITABLE, DefaultValueType.FIXED_NON_EDITABLE }; } - @Override - public DefaultValueType getDefaultDefaultType(Domain domain) - { - return DefaultValueType.FIXED_EDITABLE; - } - @Override public boolean supportsPhiLevel() { diff --git a/issues/src/org/labkey/issue/query/IssueDefDomainKind.java b/issues/src/org/labkey/issue/query/IssueDefDomainKind.java index ac2da140aeb..d84bbcdd188 100644 --- a/issues/src/org/labkey/issue/query/IssueDefDomainKind.java +++ b/issues/src/org/labkey/issue/query/IssueDefDomainKind.java @@ -16,6 +16,8 @@ package org.labkey.issue.query; import com.google.common.collect.Sets; +import org.jetbrains.annotations.NotNull; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.Container; import org.labkey.api.data.JdbcType; import org.labkey.api.data.PropertyStorageSpec; @@ -23,6 +25,7 @@ import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainTemplate; import org.labkey.api.exp.property.DomainTemplateGroup; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.issues.AbstractIssuesListDefDomainKind; import org.labkey.api.query.BatchValidationException; @@ -83,23 +86,23 @@ public class IssueDefDomainKind extends AbstractIssuesListDefDomainKind new PropertyStorageSpec.ForeignKey(RESOLUTION_LOOKUP, "Lists", RESOLUTION_LOOKUP, "value", null, false) ))); - RESERVED_NAMES = BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet()); - RESERVED_NAMES.addAll(Arrays.asList("RowId", "Name")); - RESERVED_NAMES.addAll(REQUIRED_PROPERTIES + RESERVED_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet()))); + RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(Arrays.asList("RowId", "Name"))); + RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(REQUIRED_PROPERTIES .stream() - .filter(p -> !OPTIONAL_NAMES.contains(p.getName())) .map(PropertyStorageSpec::getName) - .collect(Collectors.toSet())); + .filter(name -> !OPTIONAL_NAMES.contains(name)) + .collect(Collectors.toSet()))); - // field names that are contained in the issues table that get's joined to the provisioned table - RESERVED_NAMES.addAll(Arrays.asList("IssueId", "AssignedTo", "Modified", "ModifiedBy", + // field names that are contained in the issues table that gets joined to the provisioned table + RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(Arrays.asList("IssueId", "AssignedTo", "Modified", "ModifiedBy", "Created", "CreatedBy", "Resolved", "ResolvedBy", "Status", "BuildFound", - "Tag", "Resolution", "Duplicate", "ClosedBy", "Closed", "LastIndexed", "IssueDefId")); + "Tag", "Resolution", "Duplicate", "ClosedBy", "Closed", "LastIndexed", "IssueDefId"))); MANDATORY_PROPERTIES = REQUIRED_PROPERTIES .stream() - .filter(p -> !OPTIONAL_NAMES.contains(p.getName())) .map(PropertyStorageSpec::getName) + .filter(name -> !OPTIONAL_NAMES.contains(name)) .collect(Collectors.toSet()); } @@ -110,7 +113,7 @@ public String getKindName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return RESERVED_NAMES; } diff --git a/list/src/org/labkey/list/model/ListDomainKind.java b/list/src/org/labkey/list/model/ListDomainKind.java index 01ff5caa5b8..68df28deb16 100644 --- a/list/src/org/labkey/list/model/ListDomainKind.java +++ b/list/src/org/labkey/list/model/ListDomainKind.java @@ -27,7 +27,6 @@ import org.labkey.api.data.ColumnInfo; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; -import org.labkey.api.data.ContainerManager; import org.labkey.api.data.DbScope; import org.labkey.api.data.JdbcType; import org.labkey.api.data.PropertyStorageSpec; @@ -96,6 +95,7 @@ public abstract class ListDomainKind extends AbstractDomainKind BASE_PROPERTIES; private ListDefinitionImpl _list; private final static int MAX_NAME_LENGTH = 200; + private static final Set RESERVED_NAMES; static { @@ -107,6 +107,8 @@ public abstract class ListDomainKind extends AbstractDomainKind getSupportedKeyTypes(); @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set properties = new CaseInsensitiveHashSet(); - for (PropertyStorageSpec pss : BASE_PROPERTIES) - { - properties.add(pss.getName()); - } - - return Collections.unmodifiableSet(properties); + return RESERVED_NAMES; } @Override diff --git a/study/api-src/org/labkey/api/specimen/model/AbstractSpecimenDomainKind.java b/study/api-src/org/labkey/api/specimen/model/AbstractSpecimenDomainKind.java index 7ab93f2d336..ff6e23acca5 100644 --- a/study/api-src/org/labkey/api/specimen/model/AbstractSpecimenDomainKind.java +++ b/study/api-src/org/labkey/api/specimen/model/AbstractSpecimenDomainKind.java @@ -34,6 +34,7 @@ import org.labkey.api.exp.property.BaseAbstractDomainKind; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainProperty; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; import org.labkey.api.query.SimpleValidationError; @@ -143,9 +144,9 @@ public Priority getPriority(String domainURI) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - return new HashSet<>(); + return Collections.emptySet(); } @Override diff --git a/study/api-src/org/labkey/api/specimen/model/SpecimenDomainKind.java b/study/api-src/org/labkey/api/specimen/model/SpecimenDomainKind.java index 255c67e6411..dddf63d5239 100644 --- a/study/api-src/org/labkey/api/specimen/model/SpecimenDomainKind.java +++ b/study/api-src/org/labkey/api/specimen/model/SpecimenDomainKind.java @@ -25,6 +25,7 @@ import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; import org.labkey.api.query.PropertyValidationError; @@ -46,6 +47,8 @@ public final class SpecimenDomainKind extends AbstractSpecimenDomainKind { + private static final Set RESERVED_FIELD_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(List.of(COMMENTS, COLUMN))); + private static final String NAME = "Specimen"; private static final String NAMESPACE_PREFIX = "Specimen"; @@ -224,11 +227,8 @@ public ActionURL urlEditDefinition(Domain domain, ContainerUser containerUser) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set names = new HashSet<>(); - names.add(COMMENTS); - names.add(COLUMN); - return names; + return RESERVED_FIELD_NAMES; } } diff --git a/study/api-src/org/labkey/api/specimen/model/SpecimenEventDomainKind.java b/study/api-src/org/labkey/api/specimen/model/SpecimenEventDomainKind.java index 81d6f8a96c5..f66ebf80483 100644 --- a/study/api-src/org/labkey/api/specimen/model/SpecimenEventDomainKind.java +++ b/study/api-src/org/labkey/api/specimen/model/SpecimenEventDomainKind.java @@ -19,11 +19,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONObject; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.Container; import org.labkey.api.data.JdbcType; import org.labkey.api.data.PropertyStorageSpec; import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; import org.labkey.api.query.PropertyValidationError; @@ -44,6 +46,8 @@ public final class SpecimenEventDomainKind extends AbstractSpecimenDomainKind { + private static final Set RESERVED_FIELD_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNameAndLabels(COLUMN)); + private static final String NAME = "SpecimenEvent"; private static final String NAMESPACE_PREFIX = "SpecimenEvent"; @@ -264,10 +268,8 @@ public ActionURL urlEditDefinition(Domain domain, ContainerUser containerUser) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set names = new HashSet<>(); - names.add(COLUMN); - return names; + return RESERVED_FIELD_NAMES; } } diff --git a/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java b/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java index 1d67a539bed..4c6e8115c10 100644 --- a/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java +++ b/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java @@ -26,6 +26,7 @@ import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainProperty; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; import org.labkey.api.query.PropertyValidationError; @@ -47,6 +48,8 @@ public final class VialDomainKind extends AbstractSpecimenDomainKind { + private static final Set RESERVED_FIELD_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(List.of(COMMENTS, COLUMN))); + private static final String NAME = "Vial"; private static final String NAMESPACE_PREFIX = "Vial"; @@ -228,11 +231,8 @@ public ActionURL urlEditDefinition(Domain domain, ContainerUser containerUser) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set names = new HashSet<>(); - names.add(COMMENTS); - names.add(COLUMN); - return names; + return RESERVED_FIELD_NAMES; } } diff --git a/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java b/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java index 8e589c84395..8236d35a760 100644 --- a/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java +++ b/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java @@ -15,6 +15,8 @@ */ package org.labkey.api.studydesign.query; +import org.jetbrains.annotations.NotNull; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.Container; import org.labkey.api.data.DbScope; import org.labkey.api.data.JdbcType; @@ -27,6 +29,7 @@ import org.labkey.api.exp.api.ExperimentUrls; import org.labkey.api.exp.property.BaseAbstractDomainKind; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.exp.xar.LsidUtils; import org.labkey.api.query.QueryAction; @@ -37,9 +40,9 @@ import org.labkey.api.writer.ContainerUser; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; +import java.util.stream.Collectors; public abstract class AbstractStudyDesignDomainKind extends BaseAbstractDomainKind { @@ -50,6 +53,7 @@ public abstract class AbstractStudyDesignDomainKind extends BaseAbstractDomainKi private static final String DOMAIN_LSID_TEMPLATE = "${FolderLSIDBase}:${TableName}"; private static final Set BASE_FIELDS; + private static final Set RESERVED_PROPERTY_NAMES; static { @@ -61,6 +65,9 @@ public abstract class AbstractStudyDesignDomainKind extends BaseAbstractDomainKi baseFields.add(createFieldSpec("ModifiedBy", JdbcType.INTEGER)); BASE_FIELDS = Collections.unmodifiableSet(baseFields); + RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet( + DomainUtil.getNamesAndLabels(baseFields.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())) + ); } private final Set _standardFields = new LinkedHashSet<>(BASE_FIELDS); @@ -159,14 +166,9 @@ public String getStorageSchemaName() } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - Set names = new HashSet<>(); - - for (PropertyStorageSpec spec : getBaseProperties(domain)) - names.add(spec.getName()); - - return names; + return RESERVED_PROPERTY_NAMES; } protected static PropertyStorageSpec createFieldSpec(String name, JdbcType jdbcType) diff --git a/study/src/org/labkey/study/model/BaseStudyDomainKind.java b/study/src/org/labkey/study/model/BaseStudyDomainKind.java index badc6293fe1..c1f7f08728c 100644 --- a/study/src/org/labkey/study/model/BaseStudyDomainKind.java +++ b/study/src/org/labkey/study/model/BaseStudyDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.study.model; +import org.jetbrains.annotations.NotNull; import org.labkey.api.data.Container; import org.labkey.api.data.SQLFragment; import org.labkey.api.data.TableInfo; @@ -72,7 +73,7 @@ public SQLFragment sqlObjectIdsInDomain(Domain domain) protected abstract TableInfo getTableInfo(); @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { TableInfo table = getTableInfo(); return table.getColumnNameSet(); diff --git a/study/src/org/labkey/study/model/ContinuousDatasetDomainKind.java b/study/src/org/labkey/study/model/ContinuousDatasetDomainKind.java index 3e314a9a557..24029c4e5ee 100644 --- a/study/src/org/labkey/study/model/ContinuousDatasetDomainKind.java +++ b/study/src/org/labkey/study/model/ContinuousDatasetDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.study.model; +import org.jetbrains.annotations.NotNull; import org.labkey.api.exp.property.Domain; import org.labkey.api.security.User; import org.labkey.api.study.TimepointType; @@ -55,7 +56,7 @@ public Set getMandatoryPropertyNames(Domain domain) @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { HashSet fields = new HashSet<>(getStudySubjectReservedName(domain)); fields.addAll(DatasetDefinition.DEFAULT_ABSOLUTE_DATE_FIELDS); diff --git a/study/src/org/labkey/study/model/DatasetDomainKind.java b/study/src/org/labkey/study/model/DatasetDomainKind.java index 7210771238e..be77b3f371d 100644 --- a/study/src/org/labkey/study/model/DatasetDomainKind.java +++ b/study/src/org/labkey/study/model/DatasetDomainKind.java @@ -283,21 +283,21 @@ DatasetDefinition getDatasetDefinition(String domainURI) // Issue 43898: Add the study subject name column to reserved fields protected Set getStudySubjectReservedName(Domain domain) { - HashSet fields = new HashSet<>(); + HashSet fields = new CaseInsensitiveHashSet(); if (null != domain) { Study study = StudyManager.getInstance().getStudy(domain.getContainer()); if (null != study) { String participantIdField = study.getSubjectColumnName(); - fields.add(participantIdField); + fields.addAll(DomainUtil.getNameAndLabels(participantIdField)); } } return Collections.unmodifiableSet(fields); } @Override - public abstract Set getReservedPropertyNames(Domain domain, User user); + public abstract @NotNull Set getReservedPropertyNames(Domain domain, User user); @Override public Set getBaseProperties(Domain domain) diff --git a/study/src/org/labkey/study/model/DateDatasetDomainKind.java b/study/src/org/labkey/study/model/DateDatasetDomainKind.java index 56eb4d00104..3a0f22f52a3 100644 --- a/study/src/org/labkey/study/model/DateDatasetDomainKind.java +++ b/study/src/org/labkey/study/model/DateDatasetDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.study.model; +import org.jetbrains.annotations.NotNull; import org.labkey.api.exp.property.Domain; import org.labkey.api.security.User; import org.labkey.api.study.TimepointType; @@ -57,11 +58,11 @@ public Set getMandatoryPropertyNames(Domain domain) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { HashSet fields = new HashSet<>(getStudySubjectReservedName(domain)); fields.addAll(DatasetDefinition.DEFAULT_RELATIVE_DATE_FIELDS); return Collections.unmodifiableSet(fields); } -} \ No newline at end of file +} diff --git a/study/src/org/labkey/study/model/TestDatasetDomainKind.java b/study/src/org/labkey/study/model/TestDatasetDomainKind.java index 923dbbe0caf..6fe00579cc8 100644 --- a/study/src/org/labkey/study/model/TestDatasetDomainKind.java +++ b/study/src/org/labkey/study/model/TestDatasetDomainKind.java @@ -15,6 +15,7 @@ */ package org.labkey.study.model; +import org.jetbrains.annotations.NotNull; import org.labkey.api.data.PropertyStorageSpec; import org.labkey.api.exp.property.Domain; import org.labkey.api.security.User; @@ -48,7 +49,7 @@ public Priority getPriority(String domainURI) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { return Collections.emptySet(); } diff --git a/study/src/org/labkey/study/model/VisitDatasetDomainKind.java b/study/src/org/labkey/study/model/VisitDatasetDomainKind.java index ab5d91e6a33..6efda927209 100644 --- a/study/src/org/labkey/study/model/VisitDatasetDomainKind.java +++ b/study/src/org/labkey/study/model/VisitDatasetDomainKind.java @@ -15,8 +15,11 @@ */ package org.labkey.study.model; +import org.jetbrains.annotations.NotNull; +import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.data.PropertyStorageSpec; import org.labkey.api.exp.property.Domain; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.security.User; import org.labkey.api.study.Study; import org.labkey.api.study.StudyService; @@ -57,10 +60,10 @@ public Set getMandatoryPropertyNames(Domain domain) } @Override - public Set getReservedPropertyNames(Domain domain, User user) + public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - HashSet fields = new HashSet<>(getStudySubjectReservedName(domain)); - fields.addAll(DatasetDefinition.DEFAULT_VISIT_FIELDS); + HashSet fields = new CaseInsensitiveHashSet(getStudySubjectReservedName(domain)); + fields.addAll(DomainUtil.getNamesAndLabels(DatasetDefinition.DEFAULT_VISIT_FIELDS)); return Collections.unmodifiableSet(fields); } From 0f97b79d4388154ce108b78602210580b6d9ffc4 Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Thu, 18 Sep 2025 15:29:49 -0700 Subject: [PATCH 09/12] Add missing field --- api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java index b71d90b3a84..810470bf9f5 100644 --- a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java +++ b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java @@ -127,6 +127,7 @@ public class SampleTypeDomainKind extends AbstractDomainKind Date: Fri, 19 Sep 2025 06:37:49 -0700 Subject: [PATCH 10/12] Add missing "Container" class --- .../src/org/labkey/experiment/api/DataClassDomainKind.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java index 1d390132ae3..d7106cded31 100644 --- a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java @@ -105,7 +105,8 @@ public class DataClassDomainKind extends AbstractDomainKind Date: Mon, 22 Sep 2025 13:07:02 -0700 Subject: [PATCH 11/12] Typo --- assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java index a058e9747ff..997ff845690 100644 --- a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java @@ -35,7 +35,7 @@ public class AssayRunDomainKind extends AssayDomainKind static { RESERVED_NAMES = new CaseInsensitiveHashSet(getAssayReservedPropertyNames()); - RESERVED_NAMES.addAll(DomainUtil.getNameAndLabels("AsasyId")); + RESERVED_NAMES.addAll(DomainUtil.getNameAndLabels("AssayId")); RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels( Arrays.stream(ExpRunTable.Column.values()).map(Enum::name).collect(Collectors.toSet()) )); From c0e13ac679f9dc63aa0e75febb7889bdd94fbc3c Mon Sep 17 00:00:00 2001 From: labkey-susanh Date: Mon, 22 Sep 2025 13:58:44 -0700 Subject: [PATCH 12/12] Reduce number of sets we are constructing --- .../api/exp/api/SampleTypeDomainKind.java | 15 +++++++-------- .../labkey/api/assay/AssayBatchDomainKind.java | 2 +- .../org/labkey/api/assay/AssayDomainKind.java | 5 +++-- .../labkey/api/assay/AssayRunDomainKind.java | 11 ++++++----- .../assay/plate/PlateMetadataDomainKind.java | 2 +- .../org/labkey/core/query/UsersDomainKind.java | 6 +++--- .../experiment/api/DataClassDomainKind.java | 16 ++++++++-------- .../experiment/api/VocabularyDomainKind.java | 4 ++-- .../filecontent/FilePropertiesDomainKind.java | 7 ++++--- .../labkey/issue/query/IssueDefDomainKind.java | 18 ++++++++++-------- .../org/labkey/list/model/ListDomainKind.java | 4 ++-- .../api/specimen/model/SpecimenDomainKind.java | 2 +- .../api/specimen/model/VialDomainKind.java | 2 +- .../query/AbstractStudyDesignDomainKind.java | 4 +--- .../study/model/VisitDatasetDomainKind.java | 4 ++-- 15 files changed, 52 insertions(+), 50 deletions(-) diff --git a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java index 810470bf9f5..12c86515f64 100644 --- a/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java +++ b/api/src/org/labkey/api/exp/api/SampleTypeDomainKind.java @@ -109,12 +109,10 @@ public class SampleTypeDomainKind extends AbstractDomainKind names = BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet()); + names.addAll(Arrays.stream(ExpSampleTypeTable.Column.values()).map(Enum::name).toList()); + names.addAll(Arrays.stream(ExpMaterialTable.Column.values()).map(Enum::name).toList()); + names.addAll(List.of( "SampleType", // Issue 52716 "Protocol", // alias for "SourceProtocolApplication" "SampleTypeUnits", // alias for MetricUnit @@ -132,8 +130,9 @@ public class SampleTypeDomainKind extends AbstractDomainKind RESERVED_NAMES; static { - RESERVED_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(Arrays.stream(ExpExperimentTable.Column.values()).map( ExpExperimentTable.Column::name).toList())); + RESERVED_NAMES = DomainUtil.getNamesAndLabels(Arrays.stream(ExpExperimentTable.Column.values()).map(ExpExperimentTable.Column::name).toList()); RESERVED_NAMES.addAll(getAssayReservedPropertyNames()); RESERVED_NAMES.addAll(DomainUtil.getNameAndLabels("AssayId")); } diff --git a/assay/api-src/org/labkey/api/assay/AssayDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayDomainKind.java index d62b572460f..582a4d43565 100644 --- a/assay/api-src/org/labkey/api/assay/AssayDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayDomainKind.java @@ -59,7 +59,7 @@ public abstract class AssayDomainKind extends BaseAbstractDomainKind private final Priority _priority; private static final Set RESERVED_NAMES; static { - Set s = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(List.of( + Set s = DomainUtil.getNamesAndLabels(List.of( "RowId", "Container", "LSID", @@ -68,7 +68,8 @@ public abstract class AssayDomainKind extends BaseAbstractDomainKind "Created", "ModifiedBy", "Modified" - ))); + )); + // make this an unmodifiable set because many domains build from this set but shouldn't alter the base set RESERVED_NAMES = Collections.unmodifiableSet(s); } diff --git a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java index 997ff845690..0d3f46c04ee 100644 --- a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java @@ -26,6 +26,7 @@ import org.labkey.api.util.Pair; import java.util.Arrays; +import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -34,11 +35,11 @@ public class AssayRunDomainKind extends AssayDomainKind private static final Set RESERVED_NAMES; static { - RESERVED_NAMES = new CaseInsensitiveHashSet(getAssayReservedPropertyNames()); - RESERVED_NAMES.addAll(DomainUtil.getNameAndLabels("AssayId")); - RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels( - Arrays.stream(ExpRunTable.Column.values()).map(Enum::name).collect(Collectors.toSet()) - )); + Set names = new HashSet<>(getAssayReservedPropertyNames()); + names.add("AssayId"); + names.addAll(Arrays.stream(ExpRunTable.Column.values()).map(Enum::name).collect(Collectors.toSet())); + + RESERVED_NAMES = DomainUtil.getNamesAndLabels(names); } public AssayRunDomainKind() diff --git a/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java b/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java index 65bb914028f..7adec4b0deb 100644 --- a/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java +++ b/assay/src/org/labkey/assay/plate/PlateMetadataDomainKind.java @@ -73,7 +73,7 @@ public enum Column static { - RESERVED_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(Arrays.stream(Column.values()).map(Enum::name).toList())); + RESERVED_NAMES = DomainUtil.getNamesAndLabels(Arrays.stream(Column.values()).map(Enum::name).toList()); INDEXES = Set.of(new PropertyStorageSpec.Index(true, Column.Lsid.name())); REQUIRED_PROPS = List.of( new PropertyStorageSpec(Column.Amount.name(), JdbcType.DOUBLE), diff --git a/core/src/org/labkey/core/query/UsersDomainKind.java b/core/src/org/labkey/core/query/UsersDomainKind.java index 7147671e195..20fc332bf43 100644 --- a/core/src/org/labkey/core/query/UsersDomainKind.java +++ b/core/src/org/labkey/core/query/UsersDomainKind.java @@ -60,11 +60,11 @@ public class UsersDomainKind extends SimpleTableDomainKind { public static final String NAME = "CoreUsersTable"; - private static final Set _reservedNames = new CaseInsensitiveHashSet(); + private static final Set _reservedNames; private static final List _requiredProperties = new ArrayList<>(); static { - _reservedNames.addAll(DomainUtil.getNamesAndLabels(List.of( + _reservedNames = DomainUtil.getNamesAndLabels(List.of( "Email", "_ts", "EntityId", @@ -78,7 +78,7 @@ public class UsersDomainKind extends SimpleTableDomainKind "LastLogin", "Active", "ExpirationDate" - ))); + )); _requiredProperties.add(new PropertyDescriptorSpec("FirstName", PropertyType.STRING, 64, false)); diff --git a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java index d7106cded31..3261a0f7d6c 100644 --- a/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/DataClassDomainKind.java @@ -70,6 +70,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -100,14 +101,13 @@ public class DataClassDomainKind extends AbstractDomainKind names = new HashSet<>(); + names.addAll(BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())); + names.addAll(Arrays.stream(ExpDataClassDataTable.Column.values()).map(ExpDataClassDataTable.Column::name).toList()); + names.add("RunId"); // Issue 50461 + names.add("Container"); + + RESERVED_NAMES = DomainUtil.getNamesAndLabels(names); FOREIGN_KEYS = Collections.unmodifiableSet(Sets.newLinkedHashSet(Arrays.asList( // NOTE: We join to exp.data using LSID instead of rowid for insert performance -- we will generate diff --git a/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java b/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java index 7927a2d5f45..2ffec105742 100644 --- a/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java +++ b/experiment/src/org/labkey/experiment/api/VocabularyDomainKind.java @@ -40,9 +40,9 @@ public class VocabularyDomainKind extends BaseAbstractDomainKind private static final Set RESERVED_PROPERTY_NAMES; static { - RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels( + RESERVED_PROPERTY_NAMES = DomainUtil.getNamesAndLabels( List.of("RowId", "LSID", "EntityId", "Container", "Folder", "CreatedBy", "Created", "ModifiedBy", "Modified", "Owner", "LastIndexed") - )); + ); } @Override diff --git a/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java b/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java index 959a78feb1f..1ba6a86b513 100644 --- a/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java +++ b/filecontent/src/org/labkey/filecontent/FilePropertiesDomainKind.java @@ -33,6 +33,7 @@ import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -59,10 +60,10 @@ public class FilePropertiesDomainKind extends BaseAbstractDomainKind private static final Set _reservedFieldSet; static { - Set s = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(RESERVED_FIELDS)); + Set s = new HashSet<>(RESERVED_FIELDS); - s.addAll(DomainUtil.getNamesAndLabels(Arrays.stream(ExpDataTable.Column.values()).map(Enum::name).collect(Collectors.toSet()))); - _reservedFieldSet = Collections.unmodifiableSet(s); + s.addAll(Arrays.stream(ExpDataTable.Column.values()).map(Enum::name).collect(Collectors.toSet())); + _reservedFieldSet = Collections.unmodifiableSet(DomainUtil.getNamesAndLabels(s)); } @Override diff --git a/issues/src/org/labkey/issue/query/IssueDefDomainKind.java b/issues/src/org/labkey/issue/query/IssueDefDomainKind.java index d84bbcdd188..c13921cea88 100644 --- a/issues/src/org/labkey/issue/query/IssueDefDomainKind.java +++ b/issues/src/org/labkey/issue/query/IssueDefDomainKind.java @@ -86,18 +86,20 @@ public class IssueDefDomainKind extends AbstractIssuesListDefDomainKind new PropertyStorageSpec.ForeignKey(RESOLUTION_LOOKUP, "Lists", RESOLUTION_LOOKUP, "value", null, false) ))); - RESERVED_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet()))); - RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(Arrays.asList("RowId", "Name"))); - RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(REQUIRED_PROPERTIES + Set names = new HashSet<>(); + names.addAll(BASE_PROPERTIES.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())); + names.addAll(REQUIRED_PROPERTIES .stream() .map(PropertyStorageSpec::getName) .filter(name -> !OPTIONAL_NAMES.contains(name)) - .collect(Collectors.toSet()))); - + .collect(Collectors.toSet())); + names.add("RowId"); + names.add("Name"); // field names that are contained in the issues table that gets joined to the provisioned table - RESERVED_NAMES.addAll(DomainUtil.getNamesAndLabels(Arrays.asList("IssueId", "AssignedTo", "Modified", "ModifiedBy", - "Created", "CreatedBy", "Resolved", "ResolvedBy", "Status", "BuildFound", - "Tag", "Resolution", "Duplicate", "ClosedBy", "Closed", "LastIndexed", "IssueDefId"))); + names.addAll(Arrays.asList("IssueId", "AssignedTo", "Modified", "ModifiedBy", + "Created", "CreatedBy", "Resolved", "ResolvedBy", "Status", "BuildFound", + "Tag", "Resolution", "Duplicate", "ClosedBy", "Closed", "LastIndexed", "IssueDefId")); + RESERVED_NAMES = DomainUtil.getNamesAndLabels(names); MANDATORY_PROPERTIES = REQUIRED_PROPERTIES .stream() diff --git a/list/src/org/labkey/list/model/ListDomainKind.java b/list/src/org/labkey/list/model/ListDomainKind.java index 68df28deb16..6c38b91460a 100644 --- a/list/src/org/labkey/list/model/ListDomainKind.java +++ b/list/src/org/labkey/list/model/ListDomainKind.java @@ -107,8 +107,8 @@ public abstract class ListDomainKind extends AbstractDomainKind RESERVED_FIELD_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(List.of(COMMENTS, COLUMN))); + private static final Set RESERVED_FIELD_NAMES = DomainUtil.getNamesAndLabels(List.of(COMMENTS, COLUMN)); private static final String NAME = "Specimen"; private static final String NAMESPACE_PREFIX = "Specimen"; diff --git a/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java b/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java index 4c6e8115c10..b2cbf38da37 100644 --- a/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java +++ b/study/api-src/org/labkey/api/specimen/model/VialDomainKind.java @@ -48,7 +48,7 @@ public final class VialDomainKind extends AbstractSpecimenDomainKind { - private static final Set RESERVED_FIELD_NAMES = new CaseInsensitiveHashSet(DomainUtil.getNamesAndLabels(List.of(COMMENTS, COLUMN))); + private static final Set RESERVED_FIELD_NAMES = DomainUtil.getNamesAndLabels(List.of(COMMENTS, COLUMN)); private static final String NAME = "Vial"; private static final String NAMESPACE_PREFIX = "Vial"; diff --git a/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java b/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java index 8236d35a760..d5e4df0f9dd 100644 --- a/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java +++ b/study/api-src/org/labkey/api/studydesign/query/AbstractStudyDesignDomainKind.java @@ -65,9 +65,7 @@ public abstract class AbstractStudyDesignDomainKind extends BaseAbstractDomainKi baseFields.add(createFieldSpec("ModifiedBy", JdbcType.INTEGER)); BASE_FIELDS = Collections.unmodifiableSet(baseFields); - RESERVED_PROPERTY_NAMES = new CaseInsensitiveHashSet( - DomainUtil.getNamesAndLabels(baseFields.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())) - ); + RESERVED_PROPERTY_NAMES = DomainUtil.getNamesAndLabels(baseFields.stream().map(PropertyStorageSpec::getName).collect(Collectors.toSet())); } private final Set _standardFields = new LinkedHashSet<>(BASE_FIELDS); diff --git a/study/src/org/labkey/study/model/VisitDatasetDomainKind.java b/study/src/org/labkey/study/model/VisitDatasetDomainKind.java index 785e27e9fbd..a0ce687a04c 100644 --- a/study/src/org/labkey/study/model/VisitDatasetDomainKind.java +++ b/study/src/org/labkey/study/model/VisitDatasetDomainKind.java @@ -63,8 +63,8 @@ public Set getMandatoryPropertyNames(Domain domain) @Override public @NotNull Set getReservedPropertyNames(Domain domain, User user) { - HashSet fields = new CaseInsensitiveHashSet(getStudySubjectReservedName(domain)); - fields.addAll(DomainUtil.getNamesAndLabels(DatasetDefinition.DEFAULT_VISIT_FIELDS)); + Set fields = DomainUtil.getNamesAndLabels(DatasetDefinition.DEFAULT_VISIT_FIELDS); + fields.addAll(getStudySubjectReservedName(domain)); return Collections.unmodifiableSet(fields); }