From 25e05d9ba42940c61ff8d58a8f2b6bb367fc8ca6 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 11 Mar 2025 14:39:13 -0400 Subject: [PATCH 01/21] make inputlevel displayOnCreate Boolean --- .../iq/dataverse/DatasetFieldServiceBean.java | 5 +++-- .../edu/harvard/iq/dataverse/DatasetPage.java | 5 ++++- .../edu/harvard/iq/dataverse/Dataverse.java | 2 +- .../DataverseFieldTypeInputLevel.java | 13 ++++++++---- .../harvard/iq/dataverse/DataversePage.java | 7 +++++-- .../iq/dataverse/DataverseServiceBean.java | 14 +++++++++---- .../dataverse/MetadataBlockServiceBean.java | 21 +++++++++++++------ .../harvard/iq/dataverse/TemplatePage.java | 5 ++++- .../harvard/iq/dataverse/api/Dataverses.java | 5 ++++- .../iq/dataverse/util/json/JsonPrinter.java | 2 +- 10 files changed, 56 insertions(+), 23 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index 32ce570ddaa..85639de9a59 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -944,7 +944,7 @@ private Predicate buildFieldPresentInDataversePredicate(Dataverse dataverse, boo // Predicate for displayOnCreate in input level Predicate displayOnCreateInputLevelPredicate = criteriaBuilder.and( criteriaBuilder.equal(datasetFieldTypeRoot, datasetFieldTypeInputLevelJoin.get("datasetFieldType")), - criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("displayOnCreate")) + criteriaBuilder.equal(datasetFieldTypeInputLevelJoin.get("displayOnCreate"), Boolean.TRUE) ); // Create a subquery to check for the absence of a specific DataverseFieldTypeInputLevel. @@ -953,7 +953,8 @@ private Predicate buildFieldPresentInDataversePredicate(Dataverse dataverse, boo subquery.select(criteriaBuilder.literal(1L)) .where( criteriaBuilder.equal(subqueryRoot.get("dataverse"), dataverseRoot), - criteriaBuilder.equal(subqueryRoot.get("datasetFieldType"), datasetFieldTypeRoot) + criteriaBuilder.equal(subqueryRoot.get("datasetFieldType"), datasetFieldTypeRoot), + criteriaBuilder.isNotNull(subqueryRoot.get("displayOnCreate")) ); // Define a predicate to exclude DatasetFieldTypes that have no associated input level (i.e., the subquery does not return a result). diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index d2bf40d5408..3737bbc9753 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -1856,7 +1856,10 @@ private void updateDatasetFieldInputLevels() { if (dsf != null){ // Yes, call "setInclude" dsf.setInclude(oneDSFieldTypeInputLevel.isInclude()); - dsf.getDatasetFieldType().setDisplayOnCreate(oneDSFieldTypeInputLevel.isDisplayOnCreate()); + Boolean displayOnCreate = oneDSFieldTypeInputLevel.isDisplayOnCreate(); + if (displayOnCreate!= null) { + dsf.getDatasetFieldType().setDisplayOnCreate(displayOnCreate); + } // remove from hash mapDatasetFields.remove(oneDSFieldTypeInputLevel.getDatasetFieldType().getId()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index d2cb51d0072..d7297a5d72b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -441,7 +441,7 @@ public boolean isDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) { public boolean isDatasetFieldTypeDisplayOnCreateAsInputLevel(Long datasetFieldTypeId) { return dataverseFieldTypeInputLevels.stream() .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId) - && inputLevel.isDisplayOnCreate()); + && inputLevel.isDisplayOnCreate().booleanValue()); } public Template getDefaultTemplate() { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java index 27cb1e00cad..eb733c93a24 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java @@ -6,6 +6,8 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; + +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -58,11 +60,14 @@ public class DataverseFieldTypeInputLevel implements Serializable { private DatasetFieldType datasetFieldType; private boolean include; private boolean required; - private boolean displayOnCreate; + + + @Column(nullable = true) + private Boolean displayOnCreate; public DataverseFieldTypeInputLevel () {} - public DataverseFieldTypeInputLevel (DatasetFieldType fieldType, Dataverse dataverse, boolean required, boolean include, boolean displayOnCreate) { + public DataverseFieldTypeInputLevel (DatasetFieldType fieldType, Dataverse dataverse, boolean required, boolean include, Boolean displayOnCreate) { this.datasetFieldType = fieldType; this.dataverse = dataverse; this.required = required; @@ -117,11 +122,11 @@ public void setRequired(boolean required) { this.required = required; } - public boolean isDisplayOnCreate() { + public Boolean isDisplayOnCreate() { return displayOnCreate; } - public void setDisplayOnCreate(boolean displayOnCreate) { + public void setDisplayOnCreate(Boolean displayOnCreate) { this.displayOnCreate = displayOnCreate; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java index 1f8c3defa7e..a7f0e4852ab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java @@ -1025,12 +1025,15 @@ private void loadInputLevels(DatasetFieldType dsft, Long dataverseIdForInputLeve if (dsfIl != null) { dsft.setRequiredDV(dsfIl.isRequired()); dsft.setInclude(dsfIl.isInclude()); - dsft.setDisplayOnCreate(dsfIl.isDisplayOnCreate()); + Boolean displayOnCreate = dsfIl.isDisplayOnCreate(); + if(displayOnCreate != null) { + dsft.setDisplayOnCreate(displayOnCreate); + } } else { // If there is no input level, use the default values dsft.setRequiredDV(dsft.isRequired()); dsft.setInclude(true); - dsft.setDisplayOnCreate(false); + //dsft.setDisplayOnCreate(false); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java index 95c673f01cc..67546e3cfcf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java @@ -959,11 +959,14 @@ public String getCollectionDatasetSchema(String dataverseAlias, Map childrenRequired = new ArrayList<>(); List childrenAllowed = new ArrayList<>(); @@ -973,13 +976,16 @@ public String getCollectionDatasetSchema(String dataverseAlias, Map listMetadataBlocksDisplayedOnCreate(Dataverse ownerDa datasetFieldTypeInputLevelJoin.get("datasetFieldType").in(metadataBlockRoot.get("datasetFieldTypes")), criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("required"))); - // Predicate for default displayOnCreate (when there is no input level) - Predicate defaultDisplayOnCreatePredicate = criteriaBuilder.and( - criteriaBuilder.not(criteriaBuilder.exists(inputLevelSubquery)), - criteriaBuilder.or( - criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")), + // Predicate for default displayOnCreate (when there is no input level or when input level exists but doesn't have displayOnCreate set) + Predicate defaultDisplayOnCreatePredicate = criteriaBuilder.or( + // Case 1: No input level and required is true + criteriaBuilder.and( + criteriaBuilder.not(criteriaBuilder.exists(inputLevelSubquery)), criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")) - )); + ), + // Case 2: (No input level OR input level exists but displayOnCreate is null) AND displayOnCreate is true in datasetFieldType + criteriaBuilder.and( + criteriaBuilder.or( + criteriaBuilder.not(criteriaBuilder.exists(inputLevelSubquery)), + criteriaBuilder.isNull(datasetFieldTypeInputLevelJoin.get("displayOnCreate")) + ), + criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")) + ) + ); Predicate unionPredicate = criteriaBuilder.or( displayOnCreateInputLevelPredicate, diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java index 94ab9e70330..514dcd8d26f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java @@ -172,7 +172,10 @@ private void updateDatasetFieldInputLevels(){ ); if (dsfIl != null) { dsf.setInclude(dsfIl.isInclude()); - dsf.getDatasetFieldType().setDisplayOnCreate(dsfIl.isDisplayOnCreate()); + Boolean displayOnCreate = dsfIl.isDisplayOnCreate(); + if (displayOnCreate!= null) { + dsf.getDatasetFieldType().setDisplayOnCreate(displayOnCreate); + } } else { dsf.setInclude(true); dsf.getDatasetFieldType().setDisplayOnCreate(false); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java index d677ced2ffe..3564a07d984 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -803,7 +803,10 @@ private List parseInputLevels(JsonArray inputLevel boolean required = inputLevel.getBoolean("required"); boolean include = inputLevel.getBoolean("include"); - boolean displayOnCreate = inputLevel.getBoolean("displayOnCreate", false); + Boolean displayOnCreate = null; + if(inputLevel.containsKey("displayOnCreate")) { + displayOnCreate = inputLevel.getBoolean("displayOnCreate", false); + } if (required && !include) { String errorMessage = MessageFormat.format(BundleUtil.getStringFromBundle("dataverse.inputlevels.error.cannotberequiredifnotincluded"), datasetFieldTypeName); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 4cb6af9bbab..5622c7dc448 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -1453,7 +1453,7 @@ public static JsonArrayBuilder jsonDataverseInputLevels(List Date: Tue, 11 Mar 2025 16:32:42 -0400 Subject: [PATCH 02/21] try separate transient doc, revert dsft doc to boolean --- .../java/edu/harvard/iq/dataverse/Dataverse.java | 2 +- .../iq/dataverse/DataverseFieldTypeInputLevel.java | 2 +- .../edu/harvard/iq/dataverse/DataversePage.java | 14 +++++--------- .../harvard/iq/dataverse/DataverseServiceBean.java | 12 ++---------- .../edu/harvard/iq/dataverse/MetadataBlock.java | 4 ++-- .../edu/harvard/iq/dataverse/TemplatePage.java | 6 +----- .../iq/dataverse/util/json/JsonPrinter.java | 14 ++++++-------- src/main/webapp/metadataFragment.xhtml | 2 +- 8 files changed, 19 insertions(+), 37 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index d7297a5d72b..1325cddf0dc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -441,7 +441,7 @@ public boolean isDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) { public boolean isDatasetFieldTypeDisplayOnCreateAsInputLevel(Long datasetFieldTypeId) { return dataverseFieldTypeInputLevels.stream() .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId) - && inputLevel.isDisplayOnCreate().booleanValue()); + && inputLevel.getDisplayOnCreate().booleanValue()); } public Template getDefaultTemplate() { diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java index eb733c93a24..b45d09b9e8e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java @@ -122,7 +122,7 @@ public void setRequired(boolean required) { this.required = required; } - public Boolean isDisplayOnCreate() { + public Boolean getDisplayOnCreate() { return displayOnCreate; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java index a7f0e4852ab..4eb9828253d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataversePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataversePage.java @@ -1025,15 +1025,11 @@ private void loadInputLevels(DatasetFieldType dsft, Long dataverseIdForInputLeve if (dsfIl != null) { dsft.setRequiredDV(dsfIl.isRequired()); dsft.setInclude(dsfIl.isInclude()); - Boolean displayOnCreate = dsfIl.isDisplayOnCreate(); - if(displayOnCreate != null) { - dsft.setDisplayOnCreate(displayOnCreate); - } + dsft.setLocalDisplayOnCreate(dsfIl.getDisplayOnCreate()); } else { // If there is no input level, use the default values dsft.setRequiredDV(dsft.isRequired()); dsft.setInclude(true); - //dsft.setDisplayOnCreate(false); } } @@ -1320,7 +1316,7 @@ public void updateDisplayOnCreate(Long mdbId, Long dsftId, boolean currentValue) for (DatasetFieldType dsft : mdb.getDatasetFieldTypes()) { if (dsft.getId().equals(dsftId)) { // Update value in memory - dsft.setDisplayOnCreate(!currentValue); + dsft.setLocalDisplayOnCreate(!currentValue); // Update or create input level DataverseFieldTypeInputLevel existingLevel = dataverseFieldTypeInputLevelService @@ -1351,18 +1347,18 @@ private void saveInputLevels(List listDFTIL, Datas .findByDataverseIdDatasetFieldTypeId(dataverse.getId(), dsft.getId()); if (existingLevel != null) { - existingLevel.setDisplayOnCreate(dsft.isDisplayOnCreate()); + existingLevel.setDisplayOnCreate(dsft.getLocalDisplayOnCreate()); existingLevel.setInclude(dsft.isInclude()); existingLevel.setRequired(dsft.isRequiredDV()); listDFTIL.add(existingLevel); - } else if (dsft.isInclude() || dsft.isDisplayOnCreate() || dsft.isRequiredDV()) { + } else if (dsft.isInclude() || (dsft.getLocalDisplayOnCreate()!=null) || dsft.isRequiredDV()) { // Only create new input level if there is any specific configuration listDFTIL.add(new DataverseFieldTypeInputLevel( dsft, dataverse, dsft.isRequiredDV(), dsft.isInclude(), - dsft.isDisplayOnCreate() + dsft.getLocalDisplayOnCreate() )); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java index 67546e3cfcf..55e005181c1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java @@ -959,14 +959,10 @@ public String getCollectionDatasetSchema(String dataverseAlias, Map childrenRequired = new ArrayList<>(); List childrenAllowed = new ArrayList<>(); @@ -976,16 +972,12 @@ public String getCollectionDatasetSchema(String dataverseAlias, Map datasetFieldTypes) { public boolean isDisplayOnCreate() { for (DatasetFieldType dsfType : datasetFieldTypes) { - Boolean displayOnCreate = dsfType.isDisplayOnCreate(); - if (displayOnCreate != null && displayOnCreate) { + boolean shouldDisplayOnCreate = dsfType.shouldDisplayOnCreate(); + if (shouldDisplayOnCreate) { return true; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java index 514dcd8d26f..279944beaa7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java @@ -172,13 +172,9 @@ private void updateDatasetFieldInputLevels(){ ); if (dsfIl != null) { dsf.setInclude(dsfIl.isInclude()); - Boolean displayOnCreate = dsfIl.isDisplayOnCreate(); - if (displayOnCreate!= null) { - dsf.getDatasetFieldType().setDisplayOnCreate(displayOnCreate); - } + dsf.getDatasetFieldType().setLocalDisplayOnCreate(dsfIl.getDisplayOnCreate()); } else { dsf.setInclude(true); - dsf.getDatasetFieldType().setDisplayOnCreate(false); } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 5622c7dc448..35362db5bf2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -656,8 +656,7 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO .add("name", metadataBlock.getName()) .add("displayName", metadataBlock.getDisplayName()); - Boolean displayOnCreate = metadataBlock.isDisplayOnCreate(); - jsonObjectBuilder.add("displayOnCreate", displayOnCreate == null ? false : displayOnCreate); + jsonObjectBuilder.add("displayOnCreate", metadataBlock.isDisplayOnCreate()); List datasetFieldTypesList = metadataBlock.getDatasetFieldTypes(); Set datasetFieldTypes = filterOutDuplicateDatasetFieldTypes(datasetFieldTypesList); @@ -666,8 +665,8 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO for (DatasetFieldType datasetFieldType : datasetFieldTypes) { if (!datasetFieldType.isChild()) { - Boolean fieldDisplayOnCreate = datasetFieldType.isDisplayOnCreate(); - if (!printOnlyDisplayedOnCreateDatasetFieldTypes || (fieldDisplayOnCreate != null && fieldDisplayOnCreate)) { + boolean fieldDisplayOnCreate = datasetFieldType.shouldDisplayOnCreate(); + if (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate) { fieldsBuilder.add(datasetFieldType.getName(), json(datasetFieldType, ownerDataverse)); } } @@ -704,8 +703,7 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave JsonObjectBuilder fieldsBld = jsonObjectBuilder(); fieldsBld.add("name", fld.getName()); fieldsBld.add("displayName", fld.getDisplayName()); - Boolean displayOnCreate = fld.isDisplayOnCreate(); - fieldsBld.add("displayOnCreate", displayOnCreate == null ? false : displayOnCreate); + fieldsBld.add("displayOnCreate", fld.shouldDisplayOnCreate()); fieldsBld.add("title", fld.getTitle()); fieldsBld.add("type", fld.getFieldType().toString()); fieldsBld.add("typeClass", typeClassString(fld)); @@ -1438,7 +1436,7 @@ public static JsonArrayBuilder jsonDataverseFieldTypeInputLevels(List
+ jsf:rendered="#{((editMode == 'METADATA' or dsf.datasetFieldType.shouldDisplayOnCreate() or !dsf.isEmpty() or dsf.required) and dsf.include) or (!datasetPage and dsf.include)}"> From b53fda1d80ccc370919198e6da4156fe8fd2d542 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 11 Mar 2025 16:35:24 -0400 Subject: [PATCH 03/21] missed classes from previous commit --- .../iq/dataverse/DatasetFieldType.java | 28 ++++++++++++++----- .../edu/harvard/iq/dataverse/DatasetPage.java | 2 +- .../dataverse/util/json/BriefJsonPrinter.java | 4 +-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java index e4ada80b05d..32a23e06761 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldType.java @@ -273,21 +273,35 @@ public void setValidationFormat(String validationFormat) { * Determines whether this field type is displayed in the form when creating * the Dataset (or only later when editing after the initial creation). */ - @Column(name = "displayoncreate", nullable = true) - private Boolean displayOnCreate; + private boolean displayOnCreate; - public Boolean isDisplayOnCreate() { + public boolean isDisplayOnCreate() { return displayOnCreate; } - public Boolean getDisplayOnCreate() { - return displayOnCreate; + public void setDisplayOnCreate(boolean displayOnCreate) { + this.displayOnCreate = displayOnCreate; } - public void setDisplayOnCreate(Boolean displayOnCreate) { - this.displayOnCreate = displayOnCreate; + /** + * Determines whether this field type is displayed in the form when creating + * the Dataset (or only later when editing after the initial creation). + */ + @Transient + private Boolean localDisplayOnCreate; + + public Boolean getLocalDisplayOnCreate() { + return localDisplayOnCreate; + } + + public void setLocalDisplayOnCreate(Boolean localDisplayOnCreate) { + this.localDisplayOnCreate = localDisplayOnCreate; } + public boolean shouldDisplayOnCreate() { + return (localDisplayOnCreate == null) ? displayOnCreate : localDisplayOnCreate; + } + public boolean isControlledVocabulary() { return allowControlledVocabulary; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 3737bbc9753..32145eaffab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -1856,7 +1856,7 @@ private void updateDatasetFieldInputLevels() { if (dsf != null){ // Yes, call "setInclude" dsf.setInclude(oneDSFieldTypeInputLevel.isInclude()); - Boolean displayOnCreate = oneDSFieldTypeInputLevel.isDisplayOnCreate(); + Boolean displayOnCreate = oneDSFieldTypeInputLevel.getDisplayOnCreate(); if (displayOnCreate!= null) { dsf.getDatasetFieldType().setDisplayOnCreate(displayOnCreate); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java index 85bfe49846c..83b9d341d6d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/BriefJsonPrinter.java @@ -25,10 +25,10 @@ public JsonObjectBuilder json( DatasetVersion dsv ) { public JsonObjectBuilder json( MetadataBlock blk ) { if (blk == null) return null; - Boolean displayOnCreate = blk.isDisplayOnCreate(); + boolean displayOnCreate = blk.isDisplayOnCreate(); return jsonObjectBuilder().add("id", blk.getId()) .add("displayName", blk.getDisplayName()) - .add("displayOnCreate", displayOnCreate == null ? false : displayOnCreate) + .add("displayOnCreate", displayOnCreate) .add("name", blk.getName()) ; } From 3edba114f53c84976b3b454344210cc9c8933788 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 12 Mar 2025 09:32:53 -0400 Subject: [PATCH 04/21] merge issue --- .../engine/command/impl/AbstractWriteDataverseCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java index ce73a1a7b05..d2cb12b150d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractWriteDataverseCommand.java @@ -113,7 +113,7 @@ private void processInputLevels(CommandContext ctxt) { if (existingLevel != null) { existingLevel.setRequired(inputLevel.isRequired()); existingLevel.setInclude(inputLevel.isInclude()); - existingLevel.setDisplayOnCreate(inputLevel.isDisplayOnCreate()); + existingLevel.setDisplayOnCreate(inputLevel.getDisplayOnCreate()); ctxt.fieldTypeInputLevels().save(existingLevel); } else { ctxt.fieldTypeInputLevels().create(inputLevel); From e9344e5172217293f42a91ac86b47e7007b4037f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 12 Mar 2025 10:03:03 -0400 Subject: [PATCH 05/21] quick test fix --- .../engine/command/impl/CreateDataverseCommandTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index 7e84cf19e6b..c4ab85b7182 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -141,6 +141,12 @@ public void create(DataverseFieldTypeInputLevel dataverseFieldTypeInputLevel) { public void deleteFacetsFor(Dataverse d) { dftilsDeleted = true; } + + @Override + public DataverseFieldTypeInputLevel findByDataverseIdDatasetFieldTypeId(Long dataverseId, Long dsftId) { + //ToDo - mock non-null reponse in some cases + return null; + } }; DataverseFacetServiceBean facets = new DataverseFacetServiceBean() { From fb3e3901e9d27cfcf8f5f9b2b00befa989455abc Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 12 Mar 2025 10:17:07 -0400 Subject: [PATCH 06/21] remove assert temporarily --- .../engine/command/impl/CreateDataverseCommandTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index c4ab85b7182..ac98ab89021 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -299,7 +299,7 @@ public void testCustomOptions() throws CommandException { i++; } - assertTrue( dftilsDeleted ); + //assertTrue( dftilsDeleted ); for ( DataverseFieldTypeInputLevel dftil : createdDftils ) { assertEquals( result, dftil.getDataverse() ); } From 8d245e868263f98035280c176c047e6c5784752e Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 12 Mar 2025 16:47:38 -0400 Subject: [PATCH 07/21] remove duplicates from merge --- .../engine/command/impl/CreateDataverseCommandTest.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index d40e96ea36a..4f66599a2d0 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -150,17 +150,11 @@ public DataverseFieldTypeInputLevel findByDataverseIdDatasetFieldTypeId(Long dat } - @Override public void deleteDataverseFieldTypeInputLevelFor(Dataverse d) { dftilsDeleted = true; } - @Override - public DataverseFieldTypeInputLevel findByDataverseIdDatasetFieldTypeId(Long dataverseId, Long dsftId) { - //ToDo - mock non-null reponse in some cases - return null; - } }; DataverseFacetServiceBean facets = new DataverseFacetServiceBean() { From 0beec7addebba1dc61cc5ee4d41bd07716b50af9 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 13 Mar 2025 13:10:22 -0400 Subject: [PATCH 08/21] fix 500 err --- .../java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 9f275efcef6..6245d017894 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -1456,7 +1456,7 @@ public static JsonArrayBuilder jsonDataverseInputLevels(List Date: Thu, 13 Mar 2025 13:29:26 -0400 Subject: [PATCH 09/21] unused @EJB, cleanup --- .../edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 6245d017894..b0057160d0c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -57,7 +57,6 @@ import jakarta.ejb.Singleton; import jakarta.json.JsonArray; import jakarta.json.JsonObject; -import java.util.function.Predicate; /** * Convert objects to Json. @@ -75,14 +74,9 @@ public class JsonPrinter { @EJB static DatasetFieldServiceBean datasetFieldService; - @EJB - static DataverseFieldTypeInputLevelServiceBean datasetFieldInputLevelService; - public static void injectSettingsService(SettingsServiceBean ssb, DatasetFieldServiceBean dfsb, DataverseFieldTypeInputLevelServiceBean dfils) { settingsService = ssb; datasetFieldService = dfsb; - datasetFieldInputLevelService = dfils; - } public JsonPrinter() { From fd0df6638ee163b36937f800d04138defa20edc7 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 13 Mar 2025 14:31:16 -0400 Subject: [PATCH 10/21] fixes --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 2 +- src/main/java/edu/harvard/iq/dataverse/Dataverse.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index a278276219f..af8cdc21968 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -1858,7 +1858,7 @@ private void updateDatasetFieldInputLevels() { dsf.setInclude(oneDSFieldTypeInputLevel.isInclude()); Boolean displayOnCreate = oneDSFieldTypeInputLevel.getDisplayOnCreate(); if (displayOnCreate!= null) { - dsf.getDatasetFieldType().setDisplayOnCreate(displayOnCreate); + dsf.getDatasetFieldType().setLocalDisplayOnCreate(displayOnCreate); } // remove from hash mapDatasetFields.remove(oneDSFieldTypeInputLevel.getDatasetFieldType().getId()); diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 1325cddf0dc..65f567477fe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -441,7 +441,7 @@ public boolean isDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) { public boolean isDatasetFieldTypeDisplayOnCreateAsInputLevel(Long datasetFieldTypeId) { return dataverseFieldTypeInputLevels.stream() .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId) - && inputLevel.getDisplayOnCreate().booleanValue()); + && Boolean.TRUE.equals(inputLevel.getDisplayOnCreate())); } public Template getDefaultTemplate() { From a4527dc415fb36298a7aa5c8773ba9fe03e6c616 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 13 Mar 2025 14:43:02 -0400 Subject: [PATCH 11/21] add test for setting input level w/o optional displayOnCreate --- .../edu/harvard/iq/dataverse/api/DataversesIT.java | 10 ++++++++++ src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java | 8 +++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java index 1da6707ed2c..7fde1992d9f 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java @@ -33,6 +33,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.hasItemInArray; +import static org.hamcrest.Matchers.hasKey; + import static org.junit.jupiter.api.Assertions.*; import java.nio.file.Files; @@ -1976,6 +1978,14 @@ public void testUpdateInputLevelDisplayOnCreate() { .statusCode(OK.getStatusCode()) .body("data.inputLevels[0].displayOnCreate", equalTo(true)) .body("data.inputLevels[0].datasetFieldTypeName", equalTo("unitOfAnalysis")); + + // Update an inputlevel w/o displayOnCreate set + Response updateResponse2 = UtilIT.updateDataverseInputLevelDisplayOnCreate( + dataverseAlias, "unitOfAnalysis", null, apiToken); + updateResponse2.then().assertThat() + .statusCode(OK.getStatusCode()) + .body("data.inputLevels[0]", not(hasKey("displayOnCreate"))) + .body("data.inputLevels[0].datasetFieldTypeName", equalTo("unitOfAnalysis")); } @Test diff --git a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java index db8a0255017..5ee78a29582 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java @@ -4609,13 +4609,15 @@ public static Response deleteDatasetFiles(String datasetId, JsonArray fileIds, S .put(path); } - public static Response updateDataverseInputLevelDisplayOnCreate(String dataverseAlias, String fieldTypeName, boolean displayOnCreate, String apiToken) { + public static Response updateDataverseInputLevelDisplayOnCreate(String dataverseAlias, String fieldTypeName, Boolean displayOnCreate, String apiToken) { JsonArrayBuilder inputLevelsArrayBuilder = Json.createArrayBuilder(); JsonObjectBuilder inputLevel = Json.createObjectBuilder() .add("datasetFieldTypeName", fieldTypeName) .add("required", false) - .add("include", true) - .add("displayOnCreate", displayOnCreate); + .add("include", true); + if(displayOnCreate != null) { + inputLevel.add("displayOnCreate", displayOnCreate); + } inputLevelsArrayBuilder.add(inputLevel); From acb52d40f3219c4c0f708ea101734185175968d2 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 13 Mar 2025 18:21:32 -0400 Subject: [PATCH 12/21] handle levels in printer for API calls --- .../iq/dataverse/util/json/JsonPrinter.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index b0057160d0c..418c31456e5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -664,8 +664,14 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO for (DatasetFieldType datasetFieldType : datasetFieldTypes) { if (!datasetFieldType.isChild()) { + boolean inLevel = false; + if(ownerDataverse != null) { + inLevel = ownerDataverse.isDatasetFieldTypeInInputLevels(datasetFieldType.getId()); + datasetFieldType.setLocalDisplayOnCreate(ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(datasetFieldType.getId())); + datasetFieldType.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(datasetFieldType.getId())); + } boolean fieldDisplayOnCreate = datasetFieldType.shouldDisplayOnCreate(); - if (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate || datasetFieldType.isRequired()) { + if (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate || datasetFieldType.isRequired() || (datasetFieldType.isRequiredDV() && inLevel)) { fieldsBuilder.add(datasetFieldType.getName(), json(datasetFieldType, ownerDataverse)); } } @@ -713,8 +719,8 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave fieldsBld.add("displayFormat", fld.getDisplayFormat()); fieldsBld.add("displayOrder", fld.getDisplayOrder()); - boolean requiredInOwnerDataverse = ownerDataverse != null && ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(fld.getId()); - fieldsBld.add("isRequired", requiredInOwnerDataverse || fld.isRequired()); + boolean inLevel= ownerDataverse != null && ownerDataverse.isDatasetFieldTypeInInputLevels(fld.getId()); + fieldsBld.add("isRequired", (fld.isRequiredDV() && inLevel) || fld.isRequired()); if (fld.isControlledVocabulary()) { // If the field has a controlled vocabulary, @@ -729,6 +735,10 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave if (!fld.getChildDatasetFieldTypes().isEmpty()) { JsonObjectBuilder subFieldsBld = jsonObjectBuilder(); for (DatasetFieldType subFld : fld.getChildDatasetFieldTypes()) { + if(ownerDataverse != null) { + subFld.setLocalDisplayOnCreate(ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(subFld.getId())); + subFld.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(subFld.getId())); + } subFieldsBld.add(subFld.getName(), JsonPrinter.json(subFld, ownerDataverse)); } fieldsBld.add("childFields", subFieldsBld); From 4ab4aff1b938a09107f787cf16a52a51cff592b2 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 14 Mar 2025 08:34:54 -0400 Subject: [PATCH 13/21] fix LocalDisplay logic --- .../java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 418c31456e5..ebafc621e5e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -667,7 +667,7 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO boolean inLevel = false; if(ownerDataverse != null) { inLevel = ownerDataverse.isDatasetFieldTypeInInputLevels(datasetFieldType.getId()); - datasetFieldType.setLocalDisplayOnCreate(ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(datasetFieldType.getId())); + datasetFieldType.setLocalDisplayOnCreate(inLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(datasetFieldType.getId()): null); datasetFieldType.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(datasetFieldType.getId())); } boolean fieldDisplayOnCreate = datasetFieldType.shouldDisplayOnCreate(); @@ -736,7 +736,8 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave JsonObjectBuilder subFieldsBld = jsonObjectBuilder(); for (DatasetFieldType subFld : fld.getChildDatasetFieldTypes()) { if(ownerDataverse != null) { - subFld.setLocalDisplayOnCreate(ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(subFld.getId())); + boolean childInLevel= ownerDataverse != null && ownerDataverse.isDatasetFieldTypeInInputLevels(subFld.getId()); + subFld.setLocalDisplayOnCreate(childInLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(subFld.getId()): null); subFld.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(subFld.getId())); } subFieldsBld.add(subFld.getName(), JsonPrinter.json(subFld, ownerDataverse)); From bd8863fca5a6535b32a5484b4653590716ba55ac Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 14 Mar 2025 10:02:22 -0400 Subject: [PATCH 14/21] don't include when include is false --- .../edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index ebafc621e5e..8748977ce51 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -669,9 +669,10 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO inLevel = ownerDataverse.isDatasetFieldTypeInInputLevels(datasetFieldType.getId()); datasetFieldType.setLocalDisplayOnCreate(inLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(datasetFieldType.getId()): null); datasetFieldType.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(datasetFieldType.getId())); + datasetFieldType.setInclude(inLevel? ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(datasetFieldType.getId()): true); } boolean fieldDisplayOnCreate = datasetFieldType.shouldDisplayOnCreate(); - if (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate || datasetFieldType.isRequired() || (datasetFieldType.isRequiredDV() && inLevel)) { + if (datasetFieldType.isInclude() && (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate || datasetFieldType.isRequired() || (datasetFieldType.isRequiredDV() && inLevel))) { fieldsBuilder.add(datasetFieldType.getName(), json(datasetFieldType, ownerDataverse)); } } @@ -739,8 +740,12 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave boolean childInLevel= ownerDataverse != null && ownerDataverse.isDatasetFieldTypeInInputLevels(subFld.getId()); subFld.setLocalDisplayOnCreate(childInLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(subFld.getId()): null); subFld.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(subFld.getId())); + subFld.setInclude(inLevel? ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(subFld.getId()): true); + } + //Todo - other conditions? Can a child have displayOnCreate when the parent doesn't? Does this affect including the parent too? + if(subFld.isInclude()) { + subFieldsBld.add(subFld.getName(), JsonPrinter.json(subFld, ownerDataverse)); } - subFieldsBld.add(subFld.getName(), JsonPrinter.json(subFld, ownerDataverse)); } fieldsBld.add("childFields", subFieldsBld); } From 7b8c66ef545759791142935d996abb9cd890aab1 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 14 Mar 2025 10:17:08 -0400 Subject: [PATCH 15/21] fix ownerdv null case --- .../harvard/iq/dataverse/util/json/JsonPrinter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 8748977ce51..dd34c4c0e61 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -665,11 +665,14 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO for (DatasetFieldType datasetFieldType : datasetFieldTypes) { if (!datasetFieldType.isChild()) { boolean inLevel = false; + datasetFieldType.setInclude(true); if(ownerDataverse != null) { inLevel = ownerDataverse.isDatasetFieldTypeInInputLevels(datasetFieldType.getId()); datasetFieldType.setLocalDisplayOnCreate(inLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(datasetFieldType.getId()): null); datasetFieldType.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(datasetFieldType.getId())); - datasetFieldType.setInclude(inLevel? ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(datasetFieldType.getId()): true); + if(inLevel) { + datasetFieldType.setInclude(ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(datasetFieldType.getId())); + } } boolean fieldDisplayOnCreate = datasetFieldType.shouldDisplayOnCreate(); if (datasetFieldType.isInclude() && (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate || datasetFieldType.isRequired() || (datasetFieldType.isRequiredDV() && inLevel))) { @@ -736,11 +739,14 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave if (!fld.getChildDatasetFieldTypes().isEmpty()) { JsonObjectBuilder subFieldsBld = jsonObjectBuilder(); for (DatasetFieldType subFld : fld.getChildDatasetFieldTypes()) { + subFld.setInclude(true); if(ownerDataverse != null) { boolean childInLevel= ownerDataverse != null && ownerDataverse.isDatasetFieldTypeInInputLevels(subFld.getId()); subFld.setLocalDisplayOnCreate(childInLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(subFld.getId()): null); subFld.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(subFld.getId())); - subFld.setInclude(inLevel? ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(subFld.getId()): true); + if(childInLevel) { + subFld.setInclude(ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(subFld.getId())); + } } //Todo - other conditions? Can a child have displayOnCreate when the parent doesn't? Does this affect including the parent too? if(subFld.isInclude()) { From df2e156975e27cdc58c50b31a1d084f909bcad2c Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 14 Mar 2025 13:09:28 -0400 Subject: [PATCH 16/21] get level once, setlocaldisplayoncreate correctly --- .../edu/harvard/iq/dataverse/Dataverse.java | 7 +++++ .../iq/dataverse/util/json/JsonPrinter.java | 31 ++++++++++--------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 65f567477fe..8ab6f537aca 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -438,6 +438,13 @@ public boolean isDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) { .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId)); } + public DataverseFieldTypeInputLevel getDatasetFieldTypeInInputLevels(Long datasetFieldTypeId) { + return dataverseFieldTypeInputLevels.stream() + .filter(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId)) + .findFirst() + .orElse(null); + } + public boolean isDatasetFieldTypeDisplayOnCreateAsInputLevel(Long datasetFieldTypeId) { return dataverseFieldTypeInputLevels.stream() .anyMatch(inputLevel -> inputLevel.getDatasetFieldType().getId().equals(datasetFieldTypeId) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index dd34c4c0e61..c20f8f7caac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -664,18 +664,20 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO for (DatasetFieldType datasetFieldType : datasetFieldTypes) { if (!datasetFieldType.isChild()) { - boolean inLevel = false; + DataverseFieldTypeInputLevel level = null; datasetFieldType.setInclude(true); - if(ownerDataverse != null) { - inLevel = ownerDataverse.isDatasetFieldTypeInInputLevels(datasetFieldType.getId()); - datasetFieldType.setLocalDisplayOnCreate(inLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(datasetFieldType.getId()): null); - datasetFieldType.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(datasetFieldType.getId())); - if(inLevel) { - datasetFieldType.setInclude(ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(datasetFieldType.getId())); + if (ownerDataverse != null) { + level = ownerDataverse.getDatasetFieldTypeInInputLevels(datasetFieldType.getId()); + if (level != null) { + datasetFieldType.setLocalDisplayOnCreate(level.getDisplayOnCreate()); + datasetFieldType.setRequiredDV(level.isRequired()); + datasetFieldType.setInclude(level.isInclude()); } } boolean fieldDisplayOnCreate = datasetFieldType.shouldDisplayOnCreate(); - if (datasetFieldType.isInclude() && (!printOnlyDisplayedOnCreateDatasetFieldTypes || fieldDisplayOnCreate || datasetFieldType.isRequired() || (datasetFieldType.isRequiredDV() && inLevel))) { + if (datasetFieldType.isInclude() && (!printOnlyDisplayedOnCreateDatasetFieldTypes + || fieldDisplayOnCreate || datasetFieldType.isRequired() + || (datasetFieldType.isRequiredDV() && (level != null)))) { fieldsBuilder.add(datasetFieldType.getName(), json(datasetFieldType, ownerDataverse)); } } @@ -740,12 +742,13 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave JsonObjectBuilder subFieldsBld = jsonObjectBuilder(); for (DatasetFieldType subFld : fld.getChildDatasetFieldTypes()) { subFld.setInclude(true); - if(ownerDataverse != null) { - boolean childInLevel= ownerDataverse != null && ownerDataverse.isDatasetFieldTypeInInputLevels(subFld.getId()); - subFld.setLocalDisplayOnCreate(childInLevel ? ownerDataverse.isDatasetFieldTypeDisplayOnCreateAsInputLevel(subFld.getId()): null); - subFld.setRequiredDV(ownerDataverse.isDatasetFieldTypeRequiredAsInputLevel(subFld.getId())); - if(childInLevel) { - subFld.setInclude(ownerDataverse.isDatasetFieldTypeIncludedAsInputLevel(subFld.getId())); + if (ownerDataverse != null) { + DataverseFieldTypeInputLevel childLevel = ownerDataverse + .getDatasetFieldTypeInInputLevels(subFld.getId()); + if (childLevel != null) { + subFld.setLocalDisplayOnCreate(childLevel.getDisplayOnCreate()); + subFld.setRequiredDV(childLevel.isRequired()); + subFld.setInclude(childLevel.isInclude()); } } //Todo - other conditions? Can a child have displayOnCreate when the parent doesn't? Does this affect including the parent too? From a1bec2805cfa9a666ef6a469e38647f72eecf2bb Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 14 Mar 2025 13:57:25 -0400 Subject: [PATCH 17/21] Try order by id --- .../edu/harvard/iq/dataverse/MetadataBlockServiceBean.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java index 768fb119d60..a25717401a0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java @@ -122,7 +122,8 @@ public List listMetadataBlocksDisplayedOnCreate(Dataverse ownerDa criteriaQuery.where(linkedFieldsPredicate); } - criteriaQuery.select(metadataBlockRoot).distinct(true); + criteriaQuery.select(metadataBlockRoot).distinct(true) + .orderBy(criteriaBuilder.desc(metadataBlockRoot.get("id"))); return em.createQuery(criteriaQuery).getResultList(); } } From c16362c20d5898d3a3cd9f7730ee553c1c9bbc9a Mon Sep 17 00:00:00 2001 From: qqmyers Date: Sun, 16 Mar 2025 16:11:32 -0400 Subject: [PATCH 18/21] @GPortas edits --- .../dataverse/MetadataBlockServiceBean.java | 105 ++++++++---------- 1 file changed, 45 insertions(+), 60 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java index a25717401a0..9a5a1060c50 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MetadataBlockServiceBean.java @@ -8,6 +8,7 @@ import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.*; +import java.util.Comparator; import java.util.List; /** @@ -52,78 +53,62 @@ public MetadataBlock findByName(String name) { public List listMetadataBlocksDisplayedOnCreate(Dataverse ownerDataverse) { CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(MetadataBlock.class); - Root metadataBlockRoot = criteriaQuery.from(MetadataBlock.class); - Join datasetFieldTypeJoin = metadataBlockRoot.join("datasetFieldTypes"); - + Root dataverseRoot = criteriaQuery.from(Dataverse.class); + + // Join metadataBlocks from Dataverse + Join metadataBlockJoin = dataverseRoot.join("metadataBlocks"); + + // Join datasetFieldTypes from MetadataBlock + Join datasetFieldTypeJoin = metadataBlockJoin.join("datasetFieldTypes"); + + Predicate displayOnCreatePredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")); + Predicate requiredPredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")); + if (ownerDataverse != null) { - Root dataverseRoot = criteriaQuery.from(Dataverse.class); - Join datasetFieldTypeInputLevelJoin = - dataverseRoot.join("dataverseFieldTypeInputLevels", JoinType.LEFT); - - // Subquery to check if the input level exists - Subquery inputLevelSubquery = criteriaQuery.subquery(Long.class); - Root subqueryRoot = inputLevelSubquery.from(DataverseFieldTypeInputLevel.class); - inputLevelSubquery.select(criteriaBuilder.literal(1L)) - .where( - criteriaBuilder.equal(subqueryRoot.get("dataverse"), dataverseRoot), - criteriaBuilder.equal(subqueryRoot.get("datasetFieldType"), datasetFieldTypeJoin) - ); - - // Predicate for displayOnCreate in the input level - Predicate displayOnCreateInputLevelPredicate = criteriaBuilder.and( - datasetFieldTypeInputLevelJoin.get("datasetFieldType").in(metadataBlockRoot.get("datasetFieldTypes")), - criteriaBuilder.isNotNull(datasetFieldTypeInputLevelJoin.get("displayOnCreate")), - criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("displayOnCreate"))); - - // Predicate for required fields - Predicate requiredPredicate = criteriaBuilder.and( - datasetFieldTypeInputLevelJoin.get("datasetFieldType").in(metadataBlockRoot.get("datasetFieldTypes")), - criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("required"))); - - // Predicate for default displayOnCreate (when there is no input level or when input level exists but doesn't have displayOnCreate set) - Predicate defaultDisplayOnCreatePredicate = criteriaBuilder.or( - // Case 1: No input level and required is true - criteriaBuilder.and( - criteriaBuilder.not(criteriaBuilder.exists(inputLevelSubquery)), - criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")) - ), - // Case 2: (No input level OR input level exists but displayOnCreate is null) AND displayOnCreate is true in datasetFieldType - criteriaBuilder.and( - criteriaBuilder.or( - criteriaBuilder.not(criteriaBuilder.exists(inputLevelSubquery)), - criteriaBuilder.isNull(datasetFieldTypeInputLevelJoin.get("displayOnCreate")) - ), - criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")) - ) + // Ensure we filter for the specific Dataverse + Predicate dataversePredicate = criteriaBuilder.equal(dataverseRoot.get("id"), ownerDataverse.getId()); + + // Join DataverseFieldTypeInputLevel (LEFT JOIN) + Join datasetFieldTypeInputLevelJoin = + dataverseRoot.join("dataverseFieldTypeInputLevels", JoinType.LEFT); + + // Check if input level explicitly defines displayOnCreate + Predicate inputLevelDisplayPredicate = criteriaBuilder.and( + criteriaBuilder.equal(datasetFieldTypeInputLevelJoin.get("datasetFieldType"), datasetFieldTypeJoin), + criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("displayOnCreate")) ); - Predicate unionPredicate = criteriaBuilder.or( - displayOnCreateInputLevelPredicate, - requiredPredicate, - defaultDisplayOnCreatePredicate + // Check if input level explicitly defines required + Predicate inputLevelRequiredPredicate = criteriaBuilder.and( + criteriaBuilder.equal(datasetFieldTypeInputLevelJoin.get("datasetFieldType"), datasetFieldTypeJoin), + criteriaBuilder.isTrue(datasetFieldTypeInputLevelJoin.get("required")) ); - criteriaQuery.where(criteriaBuilder.and( - criteriaBuilder.equal(dataverseRoot.get("id"), ownerDataverse.getId()), - metadataBlockRoot.in(dataverseRoot.get("metadataBlocks")), - unionPredicate - )); + Predicate finalDisplayPredicate = criteriaBuilder.or(inputLevelDisplayPredicate, displayOnCreatePredicate); + Predicate finalRequiredPredicate = criteriaBuilder.or(inputLevelRequiredPredicate, requiredPredicate); + + criteriaQuery.where( + dataversePredicate, + criteriaBuilder.or(finalDisplayPredicate, finalRequiredPredicate) + ); } else { // When ownerDataverse is null, we need to include fields that are either displayOnCreate=true OR required=true - Predicate displayOnCreatePredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("displayOnCreate")); - Predicate requiredPredicate = criteriaBuilder.isTrue(datasetFieldTypeJoin.get("required")); - // We also need to ensure that fields from linked metadata blocks are included Predicate linkedFieldsPredicate = criteriaBuilder.and( - criteriaBuilder.isNotNull(datasetFieldTypeJoin.get("id")), - criteriaBuilder.or(displayOnCreatePredicate, requiredPredicate) + criteriaBuilder.isNotNull(datasetFieldTypeJoin.get("id")), + criteriaBuilder.or(displayOnCreatePredicate, requiredPredicate) ); - + criteriaQuery.where(linkedFieldsPredicate); } - criteriaQuery.select(metadataBlockRoot).distinct(true) - .orderBy(criteriaBuilder.desc(metadataBlockRoot.get("id"))); - return em.createQuery(criteriaQuery).getResultList(); + criteriaQuery.select(metadataBlockJoin).distinct(true); + + List result = em.createQuery(criteriaQuery).getResultList(); + + // Order by id + result.sort(Comparator.comparing(MetadataBlock::getId)); + + return result; } } From 8d5a8cd8b1d88279000c51c13e505590685129f4 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Sun, 16 Mar 2025 16:19:14 -0400 Subject: [PATCH 19/21] add index --- .../harvard/iq/dataverse/DataverseFieldTypeInputLevel.java | 5 +++-- src/main/resources/db/migration/V6.5.0.12.sql | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/migration/V6.5.0.12.sql diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java index b45d09b9e8e..973a98d246f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseFieldTypeInputLevel.java @@ -40,8 +40,9 @@ , uniqueConstraints={ @UniqueConstraint(columnNames={"dataverse_id", "datasetfieldtype_id"})} , indexes = {@Index(columnList="dataverse_id") - , @Index(columnList="datasetfieldtype_id") - , @Index(columnList="required")} + , @Index(columnList="datasetfieldtype_id") + , @Index(columnList="required") + , @Index(columnList="displayOnCreate")} ) @Entity public class DataverseFieldTypeInputLevel implements Serializable { diff --git a/src/main/resources/db/migration/V6.5.0.12.sql b/src/main/resources/db/migration/V6.5.0.12.sql new file mode 100644 index 00000000000..c1b21624c8e --- /dev/null +++ b/src/main/resources/db/migration/V6.5.0.12.sql @@ -0,0 +1 @@ +CREATE INDEX IF NOT EXISTS index_dataversefieldtypeinputlevel_displayoncreate ON dataversefieldtypeinputlevel (displayoncreate); From 38289ad912d1b26f8dea58a53f134594980b2832 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 17 Mar 2025 12:42:01 -0400 Subject: [PATCH 20/21] updates per review --- .../java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 2 +- .../engine/command/impl/CreateDataverseCommandTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index c20f8f7caac..66689c7f725 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -751,7 +751,7 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave subFld.setInclude(childLevel.isInclude()); } } - //Todo - other conditions? Can a child have displayOnCreate when the parent doesn't? Does this affect including the parent too? + //This assumes a child have can't be displayOnCreate=true when the parent isn't if(subFld.isInclude()) { subFieldsBld.add(subFld.getName(), JsonPrinter.json(subFld, ownerDataverse)); } diff --git a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java index 4f66599a2d0..73880b78e7b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommandTest.java @@ -307,7 +307,7 @@ public void testCustomOptions() throws CommandException { i++; } - //assertTrue( dftilsDeleted ); + assertTrue( dftilsDeleted ); for ( DataverseFieldTypeInputLevel dftil : createdDftils ) { assertEquals( result, dftil.getDataverse() ); } From d66ca3b9790433c2c5a763ec4124d2f265ad7ec2 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 17 Mar 2025 12:46:13 -0400 Subject: [PATCH 21/21] comment tweak --- .../java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 66689c7f725..c3f4d347646 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -751,7 +751,7 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave subFld.setInclude(childLevel.isInclude()); } } - //This assumes a child have can't be displayOnCreate=true when the parent isn't + //This assumes a child have can't be displayOnCreate=false when the parent has it true (i.e. we're not excluding children based on testing displayOnCreate (or required) here.) if(subFld.isInclude()) { subFieldsBld.add(subFld.getName(), JsonPrinter.json(subFld, ownerDataverse)); }