diff --git a/.github/workflows/maven_unit_test.yml b/.github/workflows/maven_unit_test.yml index a69d5c4ffe3..a0550cab06a 100644 --- a/.github/workflows/maven_unit_test.yml +++ b/.github/workflows/maven_unit_test.yml @@ -147,7 +147,7 @@ jobs: # Get the build output from the integration test job - uses: actions/download-artifact@v8 with: - name: java-reportdir + name: java-reportdir - run: tar -xvf java-reportdir.tar # Deposit Code Coverage @@ -159,10 +159,65 @@ jobs: continue-on-error: true run: > mvn -B - -DrepoToken=${COVERALLS_SECRET} -DpullRequest=${{ github.event.number }} + -DrepoToken="${COVERALLS_SECRET}" -DpullRequest=${{ github.event.number }} jacoco:report coveralls:report - # NOTE: this may be extended with adding a report to the build output, leave a comment, send to Sonarcloud, ... + # Note: The SONAR_TOKEN secret is required to push analysis results to Sonarcloud. + # We check for them here and subsequent jobs can rely on this to decide if they shall run. + check-secrets: + needs: integration-test + name: Check for Secrets Availability + runs-on: ubuntu-latest + outputs: + available: ${{ steps.secret-check.outputs.available }} + steps: + - id: secret-check + # perform secret check & put boolean result as an output + shell: bash + run: | + if [ "${{ secrets.SONAR_TOKEN }}" != '' ]; then + echo "available=true" >> "$GITHUB_OUTPUT"; + else + echo "available=false" >> "$GITHUB_OUTPUT"; + fi + + sonarcloud: + runs-on: ubuntu-latest + needs: check-secrets + name: SonarQube Analysis and Coverage + # Only run in upstream repo - avoid unnecessary runs in forks (they don't have access to SONAR_TOKEN) + if: needs.check-secrets.outputs.available == 'true' + steps: + # TODO: As part of #10618 change to setup-maven custom action + # Basic setup chores + - uses: actions/checkout@v7 + with: + # Sonarcube benefits from a full Git history in it's analysis (assign issues, etc) + fetch-depth: 0 + - uses: actions/setup-java@v5 + with: + java-version: '21' + distribution: temurin + cache: maven + + # Get the coverage output from the integration test job + - uses: actions/download-artifact@v8 + with: + name: java-reportdir + # Get the binary class files as Sonar needs them for analysis + - uses: actions/download-artifact@v8 + with: + name: java-artifacts + - run: | + tar -xvf java-builddir.tar + tar -xvf java-reportdir.tar + + # Run Sonarcube analysis + - name: Analyze and commit to SonarCloud + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: mvn -B org.sonarsource.scanner.maven:sonar-maven-plugin:sonar # TODO: Add a filter step here, that avoids calling the app image release workflow if there are changes to the base image. # Use https://github.com/dorny/paths-filter to solve this. Will require and additional job or adding to integration-test job. diff --git a/.github/workflows/reviewdog_checkstyle.yml b/.github/workflows/reviewdog_checkstyle.yml index 6e82489c2db..e66095b08e1 100644 --- a/.github/workflows/reviewdog_checkstyle.yml +++ b/.github/workflows/reviewdog_checkstyle.yml @@ -16,6 +16,6 @@ jobs: with: fail_on_error: true reporter: github-pr-review - checkstyle_config: checkstyle.xml + checkstyle_config: src/maven/checkstyle.xml github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/doc/release-notes/11161-do-not-assume-default-license.md b/doc/release-notes/11161-do-not-assume-default-license.md new file mode 100644 index 00000000000..5ac23b11584 --- /dev/null +++ b/doc/release-notes/11161-do-not-assume-default-license.md @@ -0,0 +1,8 @@ +### New Feature Flag: do-not-assume-default-license + +A new feature flag `do-not-assume-default-license` has been added. This flag controls the behavior when creating a dataset via API without providing a license or terms of use. + +- By default (flag disabled), the default license will be automatically assigned if no license and no terms are provided in the input JSON, regardless of whether custom terms are allowed. +- When enabled, no license (and no terms) will be assigned if none are provided. + +**Note:** Previously, if custom terms were allowed, the system would not assign a default license in this case. To retain that behavior, you must now enable this feature flag. diff --git a/doc/release-notes/12362-factory-method-for-JSONbuilders.md b/doc/release-notes/12362-factory-method-for-JSONbuilders.md new file mode 100644 index 00000000000..0a3cdfdf5a8 --- /dev/null +++ b/doc/release-notes/12362-factory-method-for-JSONbuilders.md @@ -0,0 +1,4 @@ +# Improved JSON Performance + +A Jakarta JSON-P provider is now reused for every builder or value creation. +This improves the performance of large JSON operations, especially large exports and API responses, without changing the existing behavior or the JSON output. diff --git a/doc/release-notes/12433-NPE-draft-prefiew b/doc/release-notes/12433-NPE-draft-prefiew new file mode 100644 index 00000000000..76b71932887 --- /dev/null +++ b/doc/release-notes/12433-NPE-draft-prefiew @@ -0,0 +1 @@ +This release fixes a null pointer exception when previewing a draft file with a retention period. \ No newline at end of file diff --git a/doc/release-notes/12483-gbr-req-question-fix.md b/doc/release-notes/12483-gbr-req-question-fix.md new file mode 100644 index 00000000000..1353fb93683 --- /dev/null +++ b/doc/release-notes/12483-gbr-req-question-fix.md @@ -0,0 +1 @@ +A bug that caused any required custom questions in guestbooks to still be optional has been fixed in the current UI. \ No newline at end of file diff --git a/doc/release-notes/12513-podman-md b/doc/release-notes/12513-podman.md similarity index 100% rename from doc/release-notes/12513-podman-md rename to doc/release-notes/12513-podman.md diff --git a/doc/sphinx-guides/source/api/changelog.rst b/doc/sphinx-guides/source/api/changelog.rst index 889c929de14..ca36d972326 100644 --- a/doc/sphinx-guides/source/api/changelog.rst +++ b/doc/sphinx-guides/source/api/changelog.rst @@ -25,6 +25,8 @@ v6.12 - **/api/admin/index/perms/{id}** +- Dataset creation API calls may now behave differently when neither a license nor terms are provided, depending on the new :ref:`dataverse.feature.do-not-assume-default-license` feature flag. + v6.11 ----- diff --git a/doc/sphinx-guides/source/developers/testing/fixtures.md b/doc/sphinx-guides/source/developers/testing/fixtures.md index 06f8edfc25a..a720bd57d81 100644 --- a/doc/sphinx-guides/source/developers/testing/fixtures.md +++ b/doc/sphinx-guides/source/developers/testing/fixtures.md @@ -128,7 +128,7 @@ DatasetFixture fixture = DatasetFixtureBuilder.builder() .populator(FixturePopulator.minimal()) .build(); -JsonArrayBuilder files = Json.createArrayBuilder(); +JsonArrayBuilder files = JsonUtil.createArrayBuilder(); for (FileMetadata fileMetadata : fixture.fileMetadatas()) { files.add(JsonPrinter.json(fileMetadata.getDataFile(), fileMetadata, true)); diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index e9ad3bdfe24..4abf80fcf88 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -3951,8 +3951,10 @@ Linked Data Notifications (LDN) Allowed Hosts +++++++++++++++++++++++++++++++++++++++++++++ Dataverse supports receiving LDN notifications via the /api/inbox endpoint. The dataverse.ldn.allowed-hosts allows you to specify the list of host IP addresses from which LDN notifications can be received, or ``*`` to receive messages from anywhere. +Note that since the Inbox endpoint does not require authentication, allowing un-trusted hosts via ``*`` is not recommended for production. Example: ``dataverse.ldn.allowed-hosts=*`` +Example: ``dataverse.ldn.allowed-hosts=172.16.234.56,172.16.234.57`` COAR Notify Relationship Announcement Notify Superusers Only ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -4055,6 +4057,15 @@ In a future Dataverse version, the (currently) experimental response message sty See also :ref:`dataverse.legacy.api-response-message-style`. +.. _dataverse.feature.do-not-assume-default-license: + +dataverse.feature.do-not-assume-default-license ++++++++++++++++++++++++++++++++++++++++++++++++ + +When creating a dataset via API, if neither a license nor any terms of use are provided, the system normally assigns the default license. If this feature flag is enabled, no license is assigned (and no terms) in this case. + +Defaults to ``false``. + .. _dataverse.feature.avoid-expensive-solr-join: dataverse.feature.avoid-expensive-solr-join diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index a31b01328ae..c5c746202d7 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -150,7 +150,7 @@ 7.2026.2 - 42.7.11 + 42.7.12 9.8.0 16 2.33.0 @@ -173,7 +173,6 @@ 3.7.1 5.10.2 5.11.0 - 0.8.11 9.3 @@ -198,9 +197,18 @@ 3.2.2 1.6.13 1.7.0 + 5.7.0.6970 + 0.8.14 0.48.0 + + + https://sonarcloud.io + iqss + IQSS_dataverse + ${project.groupId}:${project.artifactId} + jacoco @@ -318,6 +326,11 @@ pomchecker-maven-plugin ${pomchecker-maven-plugin.version} + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${sonar.version} + org.sonatype.plugins nexus-staging-maven-plugin diff --git a/pom.xml b/pom.xml index 50c44586ca3..136db4e76f2 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,9 @@ -Ddummy.jacoco.property=true -Ddummy.jacoco.property=true + ${project.reporting.outputDirectory}/jacoco-merged-test-coverage-report + ${jacoco.merged.outputdir}/jacoco.xml + war @@ -140,10 +143,10 @@ @@ -883,6 +886,59 @@ + + de.thetaphi + forbiddenapis + 3.10 + + + false + + true + + + jdk-non-portable + jdk-internal + + + + + + ${project.basedir}/src/maven/forbiddenapis.txt + + ${target.java.version} + + + + for-classes + process-classes + + check + + + + for-test-classes + process-test-classes + + testCheck + + + + org.apache.maven.plugins maven-compiler-plugin @@ -1031,7 +1087,7 @@ ${project.build.directory}/coverage-reports/merged.exec - ${project.reporting.outputDirectory}/jacoco-merged-test-coverage-report + ${jacoco.merged.outputdir} ${skipIntegrationTests} @@ -1103,7 +1159,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - checkstyle.xml + ${project.basedir}/src/maven/checkstyle.xml UTF-8 true diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 6e92f71547a..194343c1772 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -30,6 +30,8 @@ import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.persistence.*; @@ -446,7 +448,7 @@ public JsonArrayBuilder getTagLabelsAsJsonArrayBuilder(){ List currentDataTags = this.getTags(); - JsonArrayBuilder builder = Json.createArrayBuilder(); + JsonArrayBuilder builder = JsonUtil.createArrayBuilder(); if ( (currentDataTags == null)||(currentDataTags.isEmpty())){ return builder; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java index e6b2711b443..61821022301 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetFieldServiceBean.java @@ -20,6 +20,7 @@ import java.util.Set; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; import jakarta.inject.Named; @@ -645,7 +646,7 @@ private String tryToReplaceRetrievalUriParam(String retrievalUri, String paramNa */ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, String termUri) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); JsonObject filtering = cvocEntry.getJsonObject("retrieval-filtering"); logger.fine("RF: " + filtering.toString()); JsonObject managedFields = cvocEntry.getJsonObject("managed-fields"); @@ -658,7 +659,7 @@ private JsonObject filterResponse(JsonObject cvocEntry, JsonObject readObject, S logger.fine("F: " + filter.toString()); JsonArray params = filter.getJsonArray("params"); if (params == null) { - params = Json.createArrayBuilder().build(); + params = JsonUtil.createArrayBuilder().build(); } logger.fine("Params: " + params.toString()); List vals = new ArrayList(); @@ -790,7 +791,7 @@ Object processPathSegment(int index, String[] pathParts, JsonValue curPath, Stri } } } else { - JsonArrayBuilder parts = Json.createArrayBuilder(); + JsonArrayBuilder parts = JsonUtil.createArrayBuilder(); for (JsonValue subPath : arr) { if (subPath instanceof JsonObject) { JsonValue nextValue = ((JsonObject) subPath).get(keyVal[0]); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index e79de5c1d8d..2c78873fa71 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -3015,7 +3015,7 @@ public String updateCurrentVersion() { String status = updateVersion.getArchivalCopyLocationStatus(); if((status==null) || status.equals(DatasetVersion.ARCHIVAL_STATUS_FAILURE) || (JvmSettings.BAGIT_ARCHIVE_ON_VERSION_UPDATE.lookupOptional(Boolean.class).orElse(false) && archiveCommand.canDelete())){ // Delete the record of any existing copy since it is now out of date/incorrect - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_PENDING); updateVersion.setArchivalCopyLocation(JsonUtil.prettyPrint(job.build())); //Persist to db now @@ -6126,7 +6126,7 @@ public String getCroissant() { reviewsJsonObj = commandEngine.submit(new GetDatasetReviewsCommand(dvRequestService.getDataverseRequest(), dataset)); JsonObjectBuilder reviews = CroissantExportUtil.getReviews(reviewsJsonObj); JsonObject croissantJson = JsonUtil.getJsonObject(croissant); - String updatedContent = Json.createObjectBuilder(croissantJson) + String updatedContent = JsonUtil.createObjectBuilder(croissantJson) .add("reviews", reviews.build().getJsonArray("reviews")).build().toString(); return updatedContent; } catch (CommandException e) { @@ -6206,7 +6206,7 @@ public void archiveVersion(Long id, boolean force) { if (status == null || (force && cmd.canDelete())) { // Set initial pending status - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_PENDING); dv.setArchivalCopyLocation(JsonUtil.prettyPrint(job.build())); //Persist now diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index c45ddcd62cb..ef998bf9b30 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -390,7 +390,7 @@ public void setArchivalCopyLocation(String location) { // Convenience method to just change the status without changing the location public void setArchivalStatusOnly(String status) { populateArchivalStatus(false); - JsonObjectBuilder job = Json.createObjectBuilder(archivalCopyLocationJson); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(archivalCopyLocationJson); job.add(DatasetVersion.ARCHIVAL_STATUS, status); archivalCopyLocationJson = job.build(); archivalCopyLocation = JsonUtil.prettyPrint(archivalCopyLocationJson); @@ -1863,16 +1863,16 @@ public String getJsonLd() { if (jsonLd != null) { return jsonLd; } - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add("@context", "http://schema.org"); job.add("@type", "Dataset"); // Note that whenever you use "@id" you should also use "identifier" and vice versa. job.add("@id", this.getDataset().getPersistentURL()); job.add("identifier", this.getDataset().getPersistentURL()); job.add("name", this.getTitle()); - JsonArrayBuilder authors = Json.createArrayBuilder(); + JsonArrayBuilder authors = JsonUtil.createArrayBuilder(); for (DatasetAuthor datasetAuthor : this.getDatasetAuthors()) { - JsonObjectBuilder author = Json.createObjectBuilder(); + JsonObjectBuilder author = JsonUtil.createObjectBuilder(); String name = datasetAuthor.getName().getDisplayValue(); String identifierAsUrl = datasetAuthor.getIdentifierAsUrl(); DatasetField authorAffiliation = datasetAuthor.getAffiliation(); @@ -1894,7 +1894,7 @@ public String getJsonLd() { author.add("familyName", familyName); } if (!StringUtil.isEmpty(affiliation)) { - author.add("affiliation", Json.createObjectBuilder().add("@type", "Organization").add("name", affiliation)); + author.add("affiliation", JsonUtil.createObjectBuilder().add("@type", "Organization").add("name", affiliation)); } //Currently all possible identifier URLs are for people not Organizations if(identifierAsUrl != null) { @@ -1908,7 +1908,7 @@ public String getJsonLd() { // Organization author.add("@type", "Organization"); if (!StringUtil.isEmpty(affiliation)) { - author.add("parentOrganization", Json.createObjectBuilder().add("@type", "Organization").add("name", affiliation)); + author.add("parentOrganization", JsonUtil.createObjectBuilder().add("@type", "Organization").add("name", affiliation)); } } // Both cases @@ -1963,7 +1963,7 @@ public String getJsonLd() { * metadata fields for the version. -- L.A. * (see #2243 for details/discussion/feedback from Google) */ - JsonArrayBuilder keywords = Json.createArrayBuilder(); + JsonArrayBuilder keywords = JsonUtil.createArrayBuilder(); for (String subject : this.getDatasetSubjects()) { keywords.add(subject); @@ -1993,7 +1993,7 @@ public String getJsonLd() { */ List relatedPublications = getRelatedPublications(); if (!relatedPublications.isEmpty()) { - JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder jsonArrayBuilder = JsonUtil.createArrayBuilder(); for (DatasetRelPublication relatedPub : relatedPublications) { boolean addToArray = false; String pubCitation = relatedPub.getText(); @@ -2001,7 +2001,7 @@ public String getJsonLd() { if (pubCitation != null || pubUrl != null) { addToArray = true; } - JsonObjectBuilder citationEntry = Json.createObjectBuilder(); + JsonObjectBuilder citationEntry = JsonUtil.createObjectBuilder(); citationEntry.add("@type", "CreativeWork"); if (pubCitation != null) { citationEntry.add("name", pubCitation); @@ -2028,7 +2028,7 @@ public String getJsonLd() { List timePeriodsCovered = this.getTimePeriodsCovered(); if (timePeriodsCovered.size() > 0) { - JsonArrayBuilder temporalCoverage = Json.createArrayBuilder(); + JsonArrayBuilder temporalCoverage = JsonUtil.createArrayBuilder(); for (String timePeriod : timePeriodsCovered) { temporalCoverage.add(timePeriod); } @@ -2053,7 +2053,7 @@ public String getJsonLd() { String installationBrandName = BrandingUtil.getInstallationBrandName(); - job.add("includedInDataCatalog", Json.createObjectBuilder() + job.add("includedInDataCatalog", JsonUtil.createObjectBuilder() .add("@type", "DataCatalog") .add("name", installationBrandName) .add("url", SystemConfig.getDataverseSiteUrlStatic()) @@ -2063,18 +2063,18 @@ public String getJsonLd() { * Both "publisher" and "provider" are included but they have the same * values. Some services seem to prefer one over the other. */ - job.add("publisher", Json.createObjectBuilder() + job.add("publisher", JsonUtil.createObjectBuilder() .add("@type", "Organization") .add("name", installationBrandName) ); - job.add("provider", Json.createObjectBuilder() + job.add("provider", JsonUtil.createObjectBuilder() .add("@type", "Organization") .add("name", installationBrandName) ); List funderNames = getFunders(); if (!funderNames.isEmpty()) { - JsonArrayBuilder funderArray = Json.createArrayBuilder(); + JsonArrayBuilder funderArray = JsonUtil.createArrayBuilder(); for (String funderName : funderNames) { JsonObjectBuilder funder = NullSafeJsonBuilder.jsonObjectBuilder(); funder.add("@type", "Organization"); @@ -2087,7 +2087,7 @@ public String getJsonLd() { boolean commaSeparated = true; List spatialCoverages = getSpatialCoverages(commaSeparated); if (!spatialCoverages.isEmpty()) { - JsonArrayBuilder spatialArray = Json.createArrayBuilder(); + JsonArrayBuilder spatialArray = JsonUtil.createArrayBuilder(); for (String spatialCoverage : spatialCoverages) { spatialArray.add(spatialCoverage); } @@ -2096,7 +2096,7 @@ public String getJsonLd() { List fileMetadatasSorted = getFileMetadatasSorted(); if (fileMetadatasSorted != null && !fileMetadatasSorted.isEmpty()) { - JsonArrayBuilder fileArray = Json.createArrayBuilder(); + JsonArrayBuilder fileArray = JsonUtil.createArrayBuilder(); String dataverseSiteUrl = SystemConfig.getDataverseSiteUrlStatic(); for (FileMetadata fileMetadata : fileMetadatasSorted) { JsonObjectBuilder fileObject = NullSafeJsonBuilder.jsonObjectBuilder(); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java index 09762d8d9df..fd52e0c4df4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionDifference.java @@ -14,6 +14,7 @@ import java.util.Set; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; @@ -1794,10 +1795,10 @@ public JsonObjectBuilder compareVersionsAsJson() { job.add("newVersion", jobVersion); if (!this.detailDataByBlock.isEmpty()) { - JsonArrayBuilder jabMetadata = Json.createArrayBuilder(); + JsonArrayBuilder jabMetadata = JsonUtil.createArrayBuilder(); for (List blocks : detailDataByBlock) { JsonObjectBuilder jobMetadata = new NullSafeJsonBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); String blockDisplay = blocks.get(0)[0].getDatasetFieldType().getMetadataBlock().getDisplayName(); for (DatasetField[] dsfArray : blocks) { JsonObjectBuilder jb = new NullSafeJsonBuilder(); @@ -1822,23 +1823,23 @@ public JsonObjectBuilder compareVersionsAsJson() { } // Format added, removed, and modified files - JsonArrayBuilder jabDiffFiles = Json.createArrayBuilder(); + JsonArrayBuilder jabDiffFiles = JsonUtil.createArrayBuilder(); if (!addedFiles.isEmpty()) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); addedFiles.forEach(f -> { jab.add(filesDiffJson(f)); }); job.add("filesAdded", jab); } if (!removedFiles.isEmpty()) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); removedFiles.forEach(f -> { jab.add(filesDiffJson(f)); }); job.add("filesRemoved", jab); } if (!replacedFiles.isEmpty()) { - JsonArrayBuilder jabReplaced = Json.createArrayBuilder(); + JsonArrayBuilder jabReplaced = JsonUtil.createArrayBuilder(); replacedFiles.forEach(fm -> { if (fm.length == 2) { JsonObjectBuilder jobReplaced = new NullSafeJsonBuilder(); @@ -1851,7 +1852,7 @@ public JsonObjectBuilder compareVersionsAsJson() { } if (!changedFileMetadata.isEmpty()) { changedFileMetadataDiff.entrySet().forEach(entry -> { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); JsonObjectBuilder jobChanged = new NullSafeJsonBuilder(); jobChanged.add("fileName", entry.getKey().getDataFile().getDisplayName()); jobChanged.add(entry.getKey().getDataFile().getChecksumType().name(), entry.getKey().getDataFile().getChecksumValue()); @@ -1872,7 +1873,7 @@ public JsonObjectBuilder compareVersionsAsJson() { // Format Terms Of Access changes if (!changedTermsAccess.isEmpty()) { JsonObjectBuilder jobTOA = new NullSafeJsonBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); changedTermsAccess.forEach(toa -> { JsonObjectBuilder jobValue = new NullSafeJsonBuilder(); jobValue.add("fieldName",toa[0]); @@ -1897,12 +1898,12 @@ private JsonObjectBuilder filesDiffJson(FileMetadata fileMetadata) { .add("description", fileMetadata.getDescription()) .add("isRestricted", df.isRestricted()); if (fileMetadata.getCategories() != null && !fileMetadata.getCategories().isEmpty()) { - JsonArrayBuilder jabCategories = Json.createArrayBuilder(); + JsonArrayBuilder jabCategories = JsonUtil.createArrayBuilder(); fileMetadata.getCategories().forEach(c -> jabCategories.add(c.getName())); job.add("categories", jabCategories); } if (df.getTags() != null && !df.getTags().isEmpty()) { - JsonArrayBuilder jabTags = Json.createArrayBuilder(); + JsonArrayBuilder jabTags = JsonUtil.createArrayBuilder(); df.getTags().forEach(t -> jabTags.add(t.getTypeLabel())); job.add("tags", jabTags); } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index 95443c35e05..15a5ca0873d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -25,6 +25,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.EJBException; import jakarta.ejb.Stateless; @@ -1159,7 +1161,7 @@ public HashMap getFileMetadataHistory(DataFile df){ } public JsonObjectBuilder fixMissingUnf(String datasetVersionId, boolean forceRecalculate) { - JsonObjectBuilder info = Json.createObjectBuilder(); + JsonObjectBuilder info = JsonUtil.createObjectBuilder(); if (datasetVersionId == null || datasetVersionId.isEmpty()) { info.add("message", "datasetVersionId was null or empty!"); return info; diff --git a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java index 1816a76ed5c..d06ca2cb5de 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataverseServiceBean.java @@ -30,6 +30,7 @@ import java.util.*; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.validation.JSONDataValidation; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; @@ -879,11 +880,11 @@ public String addRoleAssignmentsToChildren(Dataverse owner, ArrayList ro // Set up to track the set of users/groups that get assigned a role and those // that don't - JsonArrayBuilder usedNames = Json.createArrayBuilder(); - JsonArrayBuilder unusedNames = Json.createArrayBuilder(); + JsonArrayBuilder usedNames = JsonUtil.createArrayBuilder(); + JsonArrayBuilder unusedNames = JsonUtil.createArrayBuilder(); // Set up to track the list of dataverses, by id and alias, that are traversed. - JsonArrayBuilder dataverseIds = Json.createArrayBuilder(); - JsonArrayBuilder dataverseAliases = Json.createArrayBuilder(); + JsonArrayBuilder dataverseIds = JsonUtil.createArrayBuilder(); + JsonArrayBuilder dataverseAliases = JsonUtil.createArrayBuilder(); // Get the Dataverses for the returned ids List children = new ArrayList(); @@ -988,7 +989,7 @@ public String addRoleAssignmentsToChildren(Dataverse owner, ArrayList ro * entities that had an admin role on the specified dataverse which were not * handled. Add this to the log and the API return message. */ - String result = Json.createObjectBuilder().add("Dataverses Updated", dataverseIds) + String result = JsonUtil.createObjectBuilder().add("Dataverses Updated", dataverseIds) .add("Updated Dataverse Aliases", dataverseAliases).add("Assignments added for", usedNames) .add("Assignments not added for", unusedNames).build().toString(); logger.info(result); diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java index 0fc43d391ce..5891586744d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java @@ -221,7 +221,7 @@ public void setPidGeneratorId(String pidGeneratorId) { public void setPidGenerator(PidProvider pidGenerator) { this.pidGenerator = pidGenerator; if (pidGenerator != null) { - JsonObjectBuilder job = jakarta.json.Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); this.pidGeneratorSpecs = job.add("protocol", pidGenerator.getProtocol()) .add("authority", pidGenerator.getAuthority()).add("shoulder", pidGenerator.getShoulder()) .add("separator", pidGenerator.getSeparator()).build().toString(); diff --git a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java index 3bcb31970a7..438d889dc7f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java +++ b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.persistence.Column; @@ -333,7 +335,7 @@ public List getCategoriesByName() { public JsonArrayBuilder getCategoryNamesAsJsonArrayBuilder() { - JsonArrayBuilder builder = Json.createArrayBuilder(); + JsonArrayBuilder builder = JsonUtil.createArrayBuilder(); if (fileCategories == null) { return builder; diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index be80bc57f73..5082db5e736 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -441,7 +441,7 @@ public void setInstructionsFor(String fieldType, String instructionString) { //Keep instructions up-to-date on any change public void updateInstructions() { - JsonObjectBuilder builder = Json.createObjectBuilder(); + JsonObjectBuilder builder = JsonUtil.createObjectBuilder(); getInstructionsMap().forEach((key, value) -> { if (value != null) builder.add(key, value); diff --git a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java index 9e48c6c0165..c1e76aee2ab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java +++ b/src/main/java/edu/harvard/iq/dataverse/TermsOfUseAndAccess.java @@ -151,6 +151,7 @@ public License getLicense() { public void setLicense(License license) { this.license = license; if(license!=null) { + //Enforce restriction that customTerms can't be used with a license clearCustomTermsVariables(); } } @@ -161,6 +162,10 @@ public String getTermsOfUse() { public void setTermsOfUse(String termsOfUse) { this.termsOfUse = termsOfUse; + if (termsOfUse != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getTermsOfAccess() { @@ -177,6 +182,10 @@ public String getConfidentialityDeclaration() { public void setConfidentialityDeclaration(String confidentialityDeclaration) { this.confidentialityDeclaration = confidentialityDeclaration; + if (confidentialityDeclaration != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getSpecialPermissions() { @@ -185,6 +194,10 @@ public String getSpecialPermissions() { public void setSpecialPermissions(String specialPermissions) { this.specialPermissions = specialPermissions; + if (specialPermissions != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getRestrictions() { @@ -193,6 +206,10 @@ public String getRestrictions() { public void setRestrictions(String restrictions) { this.restrictions = restrictions; + if (restrictions != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getCitationRequirements() { @@ -201,6 +218,10 @@ public String getCitationRequirements() { public void setCitationRequirements(String citationRequirements) { this.citationRequirements = citationRequirements; + if (citationRequirements != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getDepositorRequirements() { @@ -209,6 +230,10 @@ public String getDepositorRequirements() { public void setDepositorRequirements(String depositorRequirements) { this.depositorRequirements = depositorRequirements; + if (depositorRequirements != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getConditions() { @@ -217,6 +242,10 @@ public String getConditions() { public void setConditions(String conditions) { this.conditions = conditions; + if (conditions != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getDisclaimer() { @@ -225,6 +254,10 @@ public String getDisclaimer() { public void setDisclaimer(String disclaimer) { this.disclaimer = disclaimer; + if (disclaimer != null) { + //Enforce restriction that customTerms can't be used with a license + this.license = null; + } } public String getDataAccessPlace() { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java index 562e5bb2c6f..4eccb16f2b3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/AbstractApiBean.java @@ -851,9 +851,9 @@ protected Response getRoleAssignmentHistoryResponse(DvObject dvObject, Authentic } // Or Json by default - JsonArrayBuilder jsonArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonArray = JsonUtil.createArrayBuilder(); for (DataverseRoleServiceBean.RoleAssignmentHistoryConsolidatedEntry entry : history) { - JsonObjectBuilder job = Json.createObjectBuilder() + JsonObjectBuilder job = JsonUtil.createObjectBuilder() .add("definedOn", entry.getDefinitionPointIdsAsString()) .add("assigneeIdentifier", entry.getAssigneeIdentifier()) .add("roleName", entry.getRoleName()); @@ -1016,7 +1016,7 @@ private Response handleDataverseRequestHandlerException(Exception ex) { String incidentId = UUID.randomUUID().toString(); logger.log(Level.SEVERE, "API internal error " + incidentId +": " + ex.getMessage(), ex); return Response.status(500) - .entity(Json.createObjectBuilder() + .entity(JsonUtil.createObjectBuilder() .add("status", "ERROR") .add("code", 500) .add("message", "Internal server error. More details available at the server logs.") @@ -1067,9 +1067,9 @@ protected Response ok(String msg) { // This is a highly used response builder, which is why this is an experimental opt-in change! // TODO: This will be removed in a future version. if (FeatureFlags.UNIFY_API_RESPONSE_MESSAGE_STYLE.enabled()) { - return ok(null, Json.createValue(msg), null); + return ok(null, JsonUtil.createValue(msg), null); } else { - return ok(Json.createObjectBuilder().add("message", msg).build(), null, null); + return ok(JsonUtil.createObjectBuilder().add("message", msg).build(), null, null); } } @@ -1078,9 +1078,9 @@ protected Response ok(String msg, JsonObjectBuilder bld) { // This is a scarcely used way to build a response, mostly relevant to admins, which is why we make it opt-out. // TODO: This will be removed in a future version. if (JvmSettings.LEGACY_API_RESPONSE_MESSAGE_STYLE.lookupOptional(Boolean.class).orElse(false)) { - return ok(bld.build(), Json.createObjectBuilder().add(ApiConstants.MESSAGE_FIELD, msg).build(), null); + return ok(bld.build(), JsonUtil.createObjectBuilder().add(ApiConstants.MESSAGE_FIELD, msg).build(), null); } else { - return ok(bld.build(), Json.createValue(msg), null); + return ok(bld.build(), JsonUtil.createValue(msg), null); } } @@ -1089,7 +1089,7 @@ protected Response ok( boolean value ) { } protected Response ok(long value) { - return ok(Json.createValue(value), null, null); + return ok(JsonUtil.createValue(value), null, null); } /** @@ -1113,7 +1113,7 @@ protected Response ok(InputStream inputStream) { protected Response created( String uri, JsonObjectBuilder bld ) { return Response.created( URI.create(uri) ) - .entity( Json.createObjectBuilder() + .entity( JsonUtil.createObjectBuilder() .add(ApiConstants.STATUS_FIELD, ApiConstants.STATUS_OK) .add(ApiConstants.DATA_FIELD, bld).build()) .type(MediaType.APPLICATION_JSON) @@ -1122,7 +1122,7 @@ protected Response created( String uri, JsonObjectBuilder bld ) { protected Response accepted(JsonObjectBuilder bld) { return Response.accepted() - .entity(Json.createObjectBuilder() + .entity(JsonUtil.createObjectBuilder() .add(ApiConstants.STATUS_FIELD, ApiConstants.STATUS_WF_IN_PROGRESS) .add(ApiConstants.DATA_FIELD, bld).build() ).build(); @@ -1130,7 +1130,7 @@ protected Response accepted(JsonObjectBuilder bld) { protected Response accepted() { return Response.accepted() - .entity(Json.createObjectBuilder() + .entity(JsonUtil.createObjectBuilder() .add(ApiConstants.STATUS_FIELD, ApiConstants.STATUS_WF_IN_PROGRESS).build() ).build(); } @@ -1148,7 +1148,7 @@ protected Response badRequest(String msg, Map fieldErrors) { .entity(NullSafeJsonBuilder.jsonObjectBuilder() .add(ApiConstants.STATUS_FIELD, ApiConstants.STATUS_ERROR) .add(ApiConstants.MESSAGE_FIELD, msg) - .add("fieldErrors", Json.createObjectBuilder(fieldErrors).build()) + .add("fieldErrors", JsonUtil.createObjectBuilder(fieldErrors).build()) .build() ) .type(MediaType.APPLICATION_JSON_TYPE) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Access.java b/src/main/java/edu/harvard/iq/dataverse/api/Access.java index 7d12e5e8b3f..9b6beb999ae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Access.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Access.java @@ -619,7 +619,7 @@ private Response returnSignedUrl(ContainerRequestContext crc, UriInfo uriInfo, U baseUrl = baseUrl.replace(":persistentId", id); key = JvmSettings.API_SIGNING_SECRET.lookupOptional().orElse("") + key; String signedUrl = UrlSignerUtil.signUrl(baseUrl, GUESTBOOK_RESPONSE_SIGNEDURL_TIMEOUT_MINUTES, userIdentifier, "GET", key); - return ok(Json.createObjectBuilder().add(URLTokenUtil.SIGNED_URL, signedUrl)); + return ok(JsonUtil.createObjectBuilder().add(URLTokenUtil.SIGNED_URL, signedUrl)); } /* @@ -782,7 +782,7 @@ private Response listAuxiliaryFiles(User user, String fileId, String origin, Uri throw new NotFoundException("No Auxiliary files exist for datafile " + fileId + (origin==null ? "": " and the specified origin")); } boolean isAccessAllowed = isAccessAuthorized(user, df); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); auxFileList.forEach(auxFile -> { if (isAccessAllowed || auxFile.getIsPublic()) { NullSafeJsonBuilder job = NullSafeJsonBuilder.jsonObjectBuilder(); @@ -1951,7 +1951,7 @@ public Response listFileAccessRequests(@Context ContainerRequestContext crc, return error(NOT_FOUND, BundleUtil.getStringFromBundle("access.api.requestList.noRequestsFound", args)); } - JsonArrayBuilder userArray = Json.createArrayBuilder(); + JsonArrayBuilder userArray = JsonUtil.createArrayBuilder(); for (FileAccessRequest fileAccessRequest : requests) { userArray.add(json(fileAccessRequest)); @@ -1959,7 +1959,7 @@ public Response listFileAccessRequests(@Context ContainerRequestContext crc, // Check for pagination request if (includeHistory && numResultsPerPageRequested > 0 && paginationStart > 0) { - JsonObjectBuilder builder = Json.createObjectBuilder() + JsonObjectBuilder builder = JsonUtil.createObjectBuilder() .add("status", ApiConstants.STATUS_OK) .add("data", userArray); @@ -2226,7 +2226,7 @@ public Response getUserPermissionsOnFile(@Context ContainerRequestContext crc, } catch (WrappedResponse wr) { return wr.getResponse(); } - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); User requestUser = getRequestUser(crc); jsonObjectBuilder.add("canDownloadFile", permissionService.userOn(requestUser, dataFile).has(Permission.DownloadFile)); jsonObjectBuilder.add("canManageFilePermissions", permissionService.userOn(requestUser, dataFile).has(Permission.ManageFilePermissions)); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java index d4b0daa04e1..38209ebdd94 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java @@ -22,6 +22,7 @@ import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.cache.CacheFactoryBean; import edu.harvard.iq.dataverse.util.json.JsonPrinter; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import edu.harvard.iq.dataverse.validation.EMailValidator; import edu.harvard.iq.dataverse.EjbDataverseEngine; @@ -414,9 +415,9 @@ public Response findTemplates(@Parameter(description = "Dataverse alias whose te } } - JsonArrayBuilder container = Json.createArrayBuilder(); + JsonArrayBuilder container = JsonUtil.createArrayBuilder(); for (Template t : templates) { - JsonObjectBuilder bld = Json.createObjectBuilder(); + JsonObjectBuilder bld = JsonUtil.createObjectBuilder(); bld.add("templateId", t.getId()); bld.add("templateName", t.getName()); Dataverse loopowner = t.getDataverse(); @@ -717,7 +718,7 @@ public Response listAuthenticatedUsers(@Context ContainerRequestContext crc) { } catch (WrappedResponse ex) { return error(Response.Status.FORBIDDEN, "Superusers only."); } - JsonArrayBuilder userArray = Json.createArrayBuilder(); + JsonArrayBuilder userArray = JsonUtil.createArrayBuilder(); authSvc.findAllAuthenticatedUsers().stream().forEach((user) -> { userArray.add(json(user)); }); @@ -823,7 +824,7 @@ public Response convertShibUserToBuiltin(@Context ContainerRequestContext crc, + " could not be converted from Shibboleth to BuiltIn. An Exception was not thrown."); } AuthenticatedUser authUser = authSvc.getAuthenticatedUser(builtinUser.getUserName()); - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("email", authUser.getEmail()); output.add("username", builtinUser.getUserName()); return ok(output); @@ -867,7 +868,7 @@ public Response convertOAuthUserToBuiltin(@Context ContainerRequestContext crc, + " could not be converted from remote to BuiltIn. An Exception was not thrown."); } AuthenticatedUser authUser = authSvc.getAuthenticatedUser(builtinUser.getUserName()); - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("email", authUser.getEmail()); output.add("username", builtinUser.getUserName()); return ok(output); @@ -978,8 +979,8 @@ public Response builtin2shib(@Context ContainerRequestContext crc, String overwritePosition = "staff;student"; AuthenticatedUserDisplayInfo displayInfo = new AuthenticatedUserDisplayInfo(overwriteFirstName, overwriteLastName, overwriteEmail, overwriteAffiliation, overwritePosition); - JsonObjectBuilder response = Json.createObjectBuilder(); - JsonArrayBuilder problems = Json.createArrayBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); + JsonArrayBuilder problems = JsonUtil.createArrayBuilder(); if (password != null) { response.add("password supplied", password); boolean knowsExistingPassword = false; @@ -1141,8 +1142,8 @@ public Response builtin2oauth(@Context ContainerRequestContext crc, String overwritePosition = "staff;student"; AuthenticatedUserDisplayInfo displayInfo = new AuthenticatedUserDisplayInfo(overwriteFirstName, overwriteLastName, overwriteEmail, overwriteAffiliation, overwritePosition); - JsonObjectBuilder response = Json.createObjectBuilder(); - JsonArrayBuilder problems = Json.createArrayBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); + JsonArrayBuilder problems = JsonUtil.createArrayBuilder(); if (password != null) { response.add("password supplied", password); boolean knowsExistingPassword = false; @@ -1356,7 +1357,7 @@ public void write(OutputStream os) throws IOException, boolean success = false; boolean constraintViolationDetected = false; - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("datasetId", datasetId); @@ -1453,7 +1454,7 @@ public Response validateDataset(@Parameter(description = "Dataset id or persiste if (constraintViolation.getInvalidValue() != null) { invalidValue = constraintViolation.getInvalidValue().toString(); } - JsonObjectBuilder violation = Json.createObjectBuilder(); + JsonObjectBuilder violation = JsonUtil.createObjectBuilder(); violation.add("entityClassDatabaseTableRowId", databaseRow); violation.add("field", field); violation.add("invalidValue", invalidValue == null ? "NULL" : invalidValue); @@ -1501,7 +1502,7 @@ public void write(OutputStream os) throws IOException, boolean success = false; - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("datafileId", dataFile.getId()); output.add("storageIdentifier", dataFile.getStorageIdentifier()); @@ -1545,7 +1546,7 @@ public void write(OutputStream os) throws IOException, public Response getAssignmentsFor(@Parameter(description = "Role assignee identifier.", required = true) @PathParam("raIdtf") String raIdtf) { - JsonArrayBuilder arr = Json.createArrayBuilder(); + JsonArrayBuilder arr = JsonUtil.createArrayBuilder(); roleAssigneeSvc.getAssignmentsFor(raIdtf).forEach(a -> arr.add(json(a))); return ok(arr); @@ -1568,7 +1569,7 @@ public Response getConfirmEmailToken(@Parameter(description = "Authenticated use if (user != null) { ConfirmEmailData confirmEmailData = confirmEmailSvc.findSingleConfirmEmailDataByUser(user); if (confirmEmailData != null) { - return ok(Json.createObjectBuilder().add("token", confirmEmailData.getToken())); + return ok(JsonUtil.createObjectBuilder().add("token", confirmEmailData.getToken())); } } return error(Status.BAD_REQUEST, "Could not find confirm email token for user " + userId); @@ -1591,7 +1592,7 @@ public Response startConfirmEmailProcess(@Parameter(description = "Authenticated try { ConfirmEmailInitResponse confirmEmailInitResponse = confirmEmailSvc.beginConfirm(user); ConfirmEmailData confirmEmailData = confirmEmailInitResponse.getConfirmEmailData(); - return ok(Json.createObjectBuilder().add("tokenCreated", confirmEmailData.getCreated().toString()) + return ok(JsonUtil.createObjectBuilder().add("tokenCreated", confirmEmailData.getCreated().toString()) .add("identifier", user.getUserIdentifier())); } catch (ConfirmEmailException ex) { return error(Status.BAD_REQUEST, @@ -1633,7 +1634,7 @@ public Response findPermissonsOn(@Context final ContainerRequestContext crc, try { final DvObject dvObj = findDvo(dvo); final User aUser = getRequestUser(crc); - final JsonObjectBuilder bld = Json.createObjectBuilder(); + final JsonObjectBuilder bld = JsonUtil.createObjectBuilder(); bld.add("user", aUser.getIdentifier()); bld.add("permissions", json(permissionSvc.permissionsFor(createDataverseRequest(aUser), dvObj))); return ok(bld); @@ -1672,7 +1673,7 @@ public Response fixUnf(@Parameter(description = "Dataset version database id.", @Operation(summary = "Repair missing original file types", description = "Starts a background repair for tabular files missing original file type metadata.") public Response fixMissingOriginalTypes() { - JsonObjectBuilder info = Json.createObjectBuilder(); + JsonObjectBuilder info = JsonUtil.createObjectBuilder(); List affectedFileIds = fileService.selectFilesWithMissingOriginalTypes(); @@ -1698,7 +1699,7 @@ public Response fixMissingOriginalTypes() { description = "Starts a background repair for tabular files missing original file size metadata.") public Response fixMissingOriginalSizes(@Parameter(description = "Maximum number of affected files to repair.") @QueryParam("limit") Integer limit) { - JsonObjectBuilder info = Json.createObjectBuilder(); + JsonObjectBuilder info = JsonUtil.createObjectBuilder(); List affectedFileIds = fileService.selectFilesWithMissingOriginalSizes(); @@ -1736,7 +1737,7 @@ public Response getDatasetThumbnailMetadata(@Parameter(description = "Dataset da if (dataset == null) { return error(Response.Status.NOT_FOUND, "Could not find dataset based on id supplied: " + idSupplied + "."); } - JsonObjectBuilder data = Json.createObjectBuilder(); + JsonObjectBuilder data = JsonUtil.createObjectBuilder(); DatasetThumbnail datasetThumbnail = dataset.getDatasetThumbnail(ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE); data.add("isUseGenericThumbnail", dataset.isUseGenericThumbnail()); data.add("datasetLogoPresent", DatasetUtil.isDatasetLogoPresent(dataset, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)); @@ -1770,9 +1771,9 @@ public Response validatePassword(@RequestBody(description = "Password text to va String password) { final List errors = passwordValidatorService.validate(password, new Date(), false); - final JsonArrayBuilder errorArray = Json.createArrayBuilder(); + final JsonArrayBuilder errorArray = JsonUtil.createArrayBuilder(); errors.forEach(errorArray::add); - return ok(Json.createObjectBuilder().add("password", password).add("errors", errorArray)); + return ok(JsonUtil.createObjectBuilder().add("password", password).add("errors", errorArray)); } @GET @@ -2369,7 +2370,7 @@ public Response archiveAllUnarchivedDatasetVersions(@Context ContainerRequestCon List dsl = datasetversionService.getUnarchivedDatasetVersions(); if (dsl != null) { if (listonly) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); logger.fine("Unarchived versions found: "); int current = 0; for (DatasetVersion dv : dsl) { @@ -2597,10 +2598,10 @@ public Response listCurationLabelSets(@Context ContainerRequestContext crc) thro } catch (WrappedResponse wr) { return wr.getResponse(); } - JsonObjectBuilder bld = Json.createObjectBuilder(); + JsonObjectBuilder bld = JsonUtil.createObjectBuilder(); systemConfig.getCurationLabels().entrySet().forEach(s -> { - JsonArrayBuilder labels = Json.createArrayBuilder(); + JsonArrayBuilder labels = JsonUtil.createArrayBuilder(); Arrays.asList(s.getValue()).forEach(l -> labels.add(l)); bld.add(s.getKey(), labels); }); @@ -2639,7 +2640,7 @@ public Response addBannerMessage(@RequestBody(description = "Banner message JSON } bannerMessageService.save(toAdd); - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder() + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder() .add("message", "Banner Message added successfully.") .add("id", toAdd.getId()); @@ -2756,7 +2757,7 @@ public Response getSignedUrl(@Context ContainerRequestContext crc, String signedUrl = UrlSignerUtil.signUrl(baseUrl, timeout, userId, method, key); - return ok(Json.createObjectBuilder().add(URLTokenUtil.SIGNED_URL, signedUrl)); + return ok(JsonUtil.createObjectBuilder().add(URLTokenUtil.SIGNED_URL, signedUrl)); } @DELETE @@ -2825,7 +2826,7 @@ public Response getFeatureFlags() { for (FeatureFlags flag : FeatureFlags.values()) { map.put(flag.name(), flag.enabled() ? "enabled" : "disabled"); } - return ok(Json.createObjectBuilder(map)); + return ok(JsonUtil.createObjectBuilder(map)); } @GET @@ -2836,7 +2837,7 @@ public Response getFeatureFlag(@Parameter(description = "Feature flag enum name. @PathParam("flag") String flagIn) { try { FeatureFlags flag = FeatureFlags.valueOf(flagIn); - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add("enabled", flag.enabled()); return ok(job); } catch (IllegalArgumentException ex) { @@ -2882,8 +2883,8 @@ public Response getAuditFiles(@Context ContainerRequestContext crc, } NullSafeJsonBuilder jsonObjectBuilder = NullSafeJsonBuilder.jsonObjectBuilder(); - JsonArrayBuilder jsonDatasetsArrayBuilder = Json.createArrayBuilder(); - JsonArrayBuilder jsonFailuresArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder jsonDatasetsArrayBuilder = JsonUtil.createArrayBuilder(); + JsonArrayBuilder jsonFailuresArrayBuilder = JsonUtil.createArrayBuilder(); if (startId > 0) { jsonObjectBuilder.add("firstId", startId); @@ -2898,7 +2899,7 @@ public Response getAuditFiles(@Context ContainerRequestContext crc, datasetIds = datasetService.findAllLocalDatasetIds(); } else { datasetIds = new ArrayList<>(datasetIdentifiers.size()); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); datasetIdentifiers.forEach(id -> { String dId = id.trim(); jab.add(dId); @@ -2967,13 +2968,13 @@ public Response getAuditFiles(@Context ContainerRequestContext crc, jsonFailuresArrayBuilder.add(job); } - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); if (!missingFiles.isEmpty() || !missingFileMetadata.isEmpty()) { job.add("id", dataset.getId()); job.add("pid", dataset.getProtocol() + ":" + dataset.getAuthority() + "/" + dataset.getIdentifier()); job.add("persistentURL", dataset.getPersistentURL()); if (!missingFileMetadata.isEmpty()) { - JsonArrayBuilder jabMissingFileMetadata = Json.createArrayBuilder(); + JsonArrayBuilder jabMissingFileMetadata = JsonUtil.createArrayBuilder(); missingFileMetadata.forEach(mm -> { String[] missingMetadata = mm.split(","); NullSafeJsonBuilder jobj = NullSafeJsonBuilder.jsonObjectBuilder() @@ -2984,7 +2985,7 @@ public Response getAuditFiles(@Context ContainerRequestContext crc, job.add("missingFileMetadata", jabMissingFileMetadata); } if (!missingFiles.isEmpty()) { - JsonArrayBuilder jabMissingFiles = Json.createArrayBuilder(); + JsonArrayBuilder jabMissingFiles = JsonUtil.createArrayBuilder(); missingFiles.forEach(mf -> { String[] missingFile = mf.split(","); NullSafeJsonBuilder jobj = NullSafeJsonBuilder.jsonObjectBuilder() diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java index fda698d6f5c..815b73f97f5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BatchServiceBean.java @@ -14,6 +14,8 @@ import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.Asynchronous; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; @@ -41,7 +43,7 @@ public void processFilePath(String fileDir, String parentIdtf, DataverseRequest PrintWriter validationLog = null; PrintWriter cleanupLog = null; try { - JsonArrayBuilder status = Json.createArrayBuilder(); + JsonArrayBuilder status = JsonUtil.createArrayBuilder(); Date timestamp = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss"); @@ -84,7 +86,7 @@ public void processFilePath(String fileDir, String parentIdtf, DataverseRequest } public JsonArrayBuilder handleDirectory(DataverseRequest dataverseRequest, File dir, ImportUtil.ImportType importType, PrintWriter validationLog, PrintWriter cleanupLog, Boolean createDV) throws ImportException{ - JsonArrayBuilder status = Json.createArrayBuilder(); + JsonArrayBuilder status = JsonUtil.createArrayBuilder(); Dataverse owner = dataverseService.findByAlias(dir.getName()); if (owner == null ) { if (createDV) { @@ -100,7 +102,7 @@ public JsonArrayBuilder handleDirectory(DataverseRequest dataverseRequest, File JsonObjectBuilder fileStatus = importService.handleFile(dataverseRequest, owner, file, importType, validationLog, cleanupLog); status.add(fileStatus); } catch (ImportException | IOException e) { - status.add(Json.createObjectBuilder().add("importStatus", "Exception importing " + file.getName() + ", message = " + e.getMessage())); + status.add(JsonUtil.createObjectBuilder().add("importStatus", "Exception importing " + file.getName() + ", message = " + e.getMessage())); } } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java b/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java index de1e0e1fdc0..40e82b2963d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/BuiltinUsers.java @@ -16,6 +16,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.EJBException; import jakarta.json.Json; @@ -218,7 +219,7 @@ private Response internalSave(BuiltinUser user, String password, String key, Boo ApiToken token = authSvc.generateApiTokenForUser(au); authSvc.save(token); - JsonObjectBuilder resp = Json.createObjectBuilder(); + JsonObjectBuilder resp = JsonUtil.createObjectBuilder(); resp.add("user", json(user)); resp.add("authenticatedUser", json(au)); resp.add("apiToken", token.getTokenString()); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java index 20dc70d4833..6dd7a684c42 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/DatasetFieldServiceApi.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.EJBException; import jakarta.json.Json; @@ -99,7 +101,7 @@ public Response getAll() { for ( DatasetFieldType dt : requiredFields ) { requiredFieldNames.add( dt.getName() ); } - return ok( Json.createObjectBuilder().add("haveParents", asJsonArray(listOfIsHasParentsTrue)) + return ok( JsonUtil.createObjectBuilder().add("haveParents", asJsonArray(listOfIsHasParentsTrue)) .add("noParents", asJsonArray(listOfIsHasParentsFalse)) .add("allowsMultiples", asJsonArray(listOfIsAllowsMultiplesTrue)) .add("allowsMultiples", asJsonArray(listOfIsAllowsMultiplesTrue)) @@ -149,7 +151,7 @@ public Response getByName( parentAllowsMultiplesBoolean = parent.isAllowMultiples(); parentAllowsMultiplesDisplay = Boolean.toString(parentAllowsMultiplesBoolean); } - JsonArrayBuilder controlledVocabularyValues = Json.createArrayBuilder(); + JsonArrayBuilder controlledVocabularyValues = JsonUtil.createArrayBuilder(); for (ControlledVocabularyValue controlledVocabularyValue : dsf.getControlledVocabularyValues()) { controlledVocabularyValues.add(NullSafeJsonBuilder.jsonObjectBuilder() .add("id", controlledVocabularyValue.getId()) @@ -205,7 +207,7 @@ public Response getByName( description = "Returns the configured controlled vocabulary display values for the subject dataset field.") public Response showControlledVocabularyForSubject() { DatasetFieldType subjectDatasetField = datasetFieldService.findByName(DatasetFieldConstant.subject); - JsonArrayBuilder possibleSubjects = Json.createArrayBuilder(); + JsonArrayBuilder possibleSubjects = JsonUtil.createArrayBuilder(); for (ControlledVocabularyValue subjectValue : controlledVocabularyValueService.findByDatasetFieldTypeId(subjectDatasetField.getId())) { String subject = subjectValue.getStrValue(); if (subject != null) { @@ -257,7 +259,7 @@ public Response loadDatasetFields( String splitBy = "\t"; int lineNumber = 0; HeaderType header = null; - JsonArrayBuilder responseArr = Json.createArrayBuilder(); + JsonArrayBuilder responseArr = JsonUtil.createArrayBuilder(); String[] values = null; try { br = new BufferedReader(new FileReader("/" + file)); @@ -283,19 +285,19 @@ public Response loadDatasetFields( } else { switch (header) { case METADATABLOCK: - responseArr.add( Json.createObjectBuilder() + responseArr.add( JsonUtil.createObjectBuilder() .add("name", parseMetadataBlock(values)) .add("type", "MetadataBlock")); break; case DATASETFIELD: - responseArr.add( Json.createObjectBuilder() + responseArr.add( JsonUtil.createObjectBuilder() .add("name", parseDatasetField(values)) .add("type", "DatasetField") ); break; case CONTROLLEDVOCABULARY: - responseArr.add( Json.createObjectBuilder() + responseArr.add( JsonUtil.createObjectBuilder() .add("name", parseControlledVocabulary(values)) .add("type", "Controlled Vocabulary") ); break; @@ -336,7 +338,7 @@ public Response loadDatasetFields( actionLogSvc.log(alr); } - return ok( Json.createObjectBuilder().add("added", responseArr) ); + return ok( JsonUtil.createObjectBuilder().add("added", responseArr) ); } /** diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 56ed1b88cb0..1061eae6f30 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -296,7 +296,7 @@ public Response exportDataset(@Context ContainerRequestContext crc, @Parameter(d .getReviews(commandEngine.submit(new GetDatasetReviewsCommand(req, dataset))); String content = new String(is.readAllBytes(), StandardCharsets.UTF_8); JsonObject croissantJson = JsonUtil.getJsonObject(content); - String updatedContent = Json.createObjectBuilder(croissantJson) + String updatedContent = JsonUtil.createObjectBuilder(croissantJson) .add("reviews", reviews.build().getJsonArray("reviews")).build().toString(); is = new ByteArrayInputStream(updatedContent.getBytes(StandardCharsets.UTF_8)); } @@ -649,7 +649,7 @@ public Response getVersionFileCounts(@Context ContainerRequestContext crc, return badRequest(BundleUtil.getStringFromBundle("datasets.api.version.files.invalid.access.status", List.of(accessStatus))); } DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetUserCanSeeOrDie(datasetId, req, false), uriInfo, headers, includeDeaccessioned, false); - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); jsonObjectBuilder.add("total", datasetVersionFilesServiceBean.getFileMetadataCount(datasetVersion, fileSearchCriteria)); jsonObjectBuilder.add("perContentType", json(datasetVersionFilesServiceBean.getFileMetadataCountPerContentType(datasetVersion, fileSearchCriteria))); jsonObjectBuilder.add("perCategoryName", json(datasetVersionFilesServiceBean.getFileMetadataCountPerCategoryName(datasetVersion, fileSearchCriteria))); @@ -678,7 +678,7 @@ public Response getDownloadCountByDatasetId(@Context ContainerRequestContext crc } catch (WrappedResponse wr) { return wr.getResponse(); } - JsonObjectBuilder job = Json.createObjectBuilder() + JsonObjectBuilder job = JsonUtil.createObjectBuilder() .add("id", id) .add("downloadCount", count); if (date != null) { @@ -799,7 +799,7 @@ public Response getLinkset(@Context ContainerRequestContext crc, try { DatasetVersion dsv = getDatasetVersionOrDie(req, versionId, findDatasetUserCanSeeOrDie(datasetId, req, false), uriInfo, headers); return Response - .ok(Json.createObjectBuilder() + .ok(JsonUtil.createObjectBuilder() .add("linkset", new SignpostingResources(systemConfig, dsv, JvmSettings.SIGNPOSTING_LEVEL1_AUTHOR_LIMIT.lookupOptional().orElse(""), @@ -1039,7 +1039,7 @@ public Response updateVersionMetadata(@Context ContainerRequestContext crc, Dataset managedDataset = execCommand(new UpdateDatasetVersionCommand(ds, req)); managedVersion = managedDataset.getLatestVersion(); String info = updateDraft ? "Version Updated" : "Version Created"; - return ok(Json.createObjectBuilder().add(info, managedVersion.getVersionDate())); + return ok(JsonUtil.createObjectBuilder().add(info, managedVersion.getVersionDate())); } catch (WrappedResponse ex) { return ex.getResponse(); @@ -1074,7 +1074,7 @@ public Response deleteMetadata(@Context ContainerRequestContext crc, Dataset managedDataset = execCommand(new UpdateDatasetVersionCommand(ds, req)); managedVersion = managedDataset.getLatestVersion(); String info = updateDraft ? "Version Updated" : "Version Created"; - return ok(Json.createObjectBuilder().add(info, managedVersion.getVersionDate())); + return ok(JsonUtil.createObjectBuilder().add(info, managedVersion.getVersionDate())); } catch (WrappedResponse ex) { ex.printStackTrace(); @@ -1441,7 +1441,7 @@ public Response publishDataset(@Context ContainerRequestContext crc, if ((status == null) || status.equals(DatasetVersion.ARCHIVAL_STATUS_FAILURE)) { // Delete the record of any existing copy since it is now out of // date/incorrect - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_PENDING); updateVersion.setArchivalCopyLocation(JsonUtil.prettyPrint(job.build())); datasetVersionSvc.persistArchivalCopyLocation(updateVersion); @@ -1475,7 +1475,7 @@ public Response publishDataset(@Context ContainerRequestContext crc, if (errorMsg != null) { return error(Response.Status.INTERNAL_SERVER_ERROR, errorMsg); } else { - return Response.ok(Json.createObjectBuilder() + return Response.ok(JsonUtil.createObjectBuilder() .add("status", ApiConstants.STATUS_OK) .add("status_details", successMsg) .add("data", json(ds)).build()) @@ -1737,7 +1737,7 @@ public Response createFileEmbargo(@Context ContainerRequestContext crc, @Paramet List orphanedEmbargoes = new ArrayList(); // check if files belong to dataset if (datasetFiles.containsAll(filesToEmbargo)) { - JsonArrayBuilder restrictedFiles = Json.createArrayBuilder(); + JsonArrayBuilder restrictedFiles = JsonUtil.createArrayBuilder(); boolean badFiles = false; for (DataFile datafile : filesToEmbargo) { // superuser can overrule an existing embargo, even on released files @@ -1787,7 +1787,7 @@ public Response createFileEmbargo(@Context ContainerRequestContext crc, @Paramet .setUserIdentifier(authenticatedUser.getIdentifier())); } } - return ok(Json.createObjectBuilder().add("message", "Files were embargoed")); + return ok(JsonUtil.createObjectBuilder().add("message", "Files were embargoed")); } else { return error(BAD_REQUEST, "Not all files belong to dataset"); } @@ -1863,7 +1863,7 @@ public Response removeFileEmbargo(@Context ContainerRequestContext crc, @Paramet List orphanedEmbargoes = new ArrayList(); // check if files belong to dataset if (datasetFiles.containsAll(embargoFilesToUnset)) { - JsonArrayBuilder restrictedFiles = Json.createArrayBuilder(); + JsonArrayBuilder restrictedFiles = JsonUtil.createArrayBuilder(); boolean badFiles = false; for (DataFile datafile : embargoFilesToUnset) { // superuser can overrule an existing embargo, even on released files @@ -1904,7 +1904,7 @@ public Response removeFileEmbargo(@Context ContainerRequestContext crc, @Paramet removeRecord.setUserIdentifier(authenticatedUser.getIdentifier()); actionLogSvc.log(removeRecord); } - return ok(Json.createObjectBuilder().add("message", "Embargo(es) were removed from files")); + return ok(JsonUtil.createObjectBuilder().add("message", "Embargo(es) were removed from files")); } else { return error(BAD_REQUEST, "Not all files belong to dataset"); } @@ -2039,7 +2039,7 @@ public Response createFileRetention(@Context ContainerRequestContext crc, @Param List orphanedRetentions = new ArrayList(); // check if files belong to dataset if (datasetFiles.containsAll(filesToRetention)) { - JsonArrayBuilder restrictedFiles = Json.createArrayBuilder(); + JsonArrayBuilder restrictedFiles = JsonUtil.createArrayBuilder(); boolean badFiles = false; for (DataFile datafile : filesToRetention) { // superuser can overrule an existing retention, even on released files @@ -2089,7 +2089,7 @@ public Response createFileRetention(@Context ContainerRequestContext crc, @Param .setUserIdentifier(authenticatedUser.getIdentifier())); } } - return ok(Json.createObjectBuilder().add("message", "File(s) retention period has been set or updated")); + return ok(JsonUtil.createObjectBuilder().add("message", "File(s) retention period has been set or updated")); } else { return error(BAD_REQUEST, "Not all files belong to dataset"); } @@ -2174,7 +2174,7 @@ public Response removeFileRetention(@Context ContainerRequestContext crc, @Param List orphanedRetentions = new ArrayList(); // check if files belong to dataset if (datasetFiles.containsAll(retentionFilesToUnset)) { - JsonArrayBuilder restrictedFiles = Json.createArrayBuilder(); + JsonArrayBuilder restrictedFiles = JsonUtil.createArrayBuilder(); boolean badFiles = false; for (DataFile datafile : retentionFilesToUnset) { // superuser can overrule an existing retention, even on released files @@ -2215,7 +2215,7 @@ public Response removeFileRetention(@Context ContainerRequestContext crc, @Param removeRecord.setUserIdentifier(authenticatedUser.getIdentifier()); actionLogSvc.log(removeRecord); } - return ok(Json.createObjectBuilder().add("message", "Retention periods were removed from file(s)")); + return ok(JsonUtil.createObjectBuilder().add("message", "Retention periods were removed from file(s)")); } else { return error(BAD_REQUEST, "Not all files belong to dataset"); } @@ -2351,17 +2351,17 @@ public Response getLinks(@Context ContainerRequestContext crc, @Parameter(descri long datasetId = dataset.getId(); List dvsThatLinkToThisDatasetId = dataverseSvc.findDataversesThatLinkToThisDatasetId(datasetId); - JsonArrayBuilder dataversesThatLinkToThisDatasetIdBuilder = Json.createArrayBuilder(); + JsonArrayBuilder dataversesThatLinkToThisDatasetIdBuilder = JsonUtil.createArrayBuilder(); for (Dataverse dataverse : dvsThatLinkToThisDatasetId) { if (dataverse.isReleased() || this.permissionService.hasPermissionsFor(u, dataverse, EnumSet.of(Permission.ViewUnpublishedDataverse))) { - JsonObjectBuilder datasetBuilder = Json.createObjectBuilder(); + JsonObjectBuilder datasetBuilder = JsonUtil.createObjectBuilder(); datasetBuilder.add("id", dataverse.getId()); datasetBuilder.add("alias", dataverse.getAlias()); datasetBuilder.add("displayName", dataverse.getDisplayName()); dataversesThatLinkToThisDatasetIdBuilder.add(datasetBuilder.build()); } } - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); response.add("id", datasetId); response.add("identifier", dataset.getIdentifier()); response.add("linked-dataverses", dataversesThatLinkToThisDatasetIdBuilder); @@ -2551,10 +2551,10 @@ public Response getDatasetThumbnailCandidates(@Context ContainerRequestContext c if (!canUpdateThumbnail) { return error(Response.Status.FORBIDDEN, "You are not permitted to list dataset thumbnail candidates."); } - JsonArrayBuilder data = Json.createArrayBuilder(); + JsonArrayBuilder data = JsonUtil.createArrayBuilder(); boolean considerDatasetLogoAsCandidate = true; for (DatasetThumbnail datasetThumbnail : DatasetUtil.getThumbnailCandidates(dataset, considerDatasetLogoAsCandidate, ImageThumbConverter.DEFAULT_CARDIMAGE_SIZE)) { - JsonObjectBuilder candidate = Json.createObjectBuilder(); + JsonObjectBuilder candidate = JsonUtil.createObjectBuilder(); String base64image = datasetThumbnail.getBase64image(); if (base64image != null) { logger.fine("found a candidate!"); @@ -2747,7 +2747,7 @@ public Response receiveChecksumValidationResults(@Context ContainerRequestContex JsonObject jsonFromImportJobKickoff = execCommand(new ImportFromFileSystemCommand(createDataverseRequest(getRequestUser(crc)), dataset, uploadFolder, new Long(totalSize), importMode)); long jobId = jsonFromImportJobKickoff.getInt("executionId"); String message = jsonFromImportJobKickoff.getString("message"); - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add("jobId", jobId); job.add("message", message); return ok(job); @@ -2791,7 +2791,7 @@ public Response receiveChecksumValidationResults(@Context ContainerRequestContex logger.log(Level.SEVERE, constraintError); } - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); return ok(job); } catch (IOException e) { @@ -2830,7 +2830,7 @@ public Response receiveChecksumValidationResults(@Context ContainerRequestContex public Response submitForReview(@Context ContainerRequestContext crc, @Parameter(description = "Resource id or persistent identifier.") @PathParam("id") String idSupplied) { try { Dataset updatedDataset = execCommand(new SubmitDatasetForReviewCommand(createDataverseRequest(getRequestUser(crc)), findDatasetOrDie(idSupplied))); - JsonObjectBuilder result = Json.createObjectBuilder(); + JsonObjectBuilder result = JsonUtil.createObjectBuilder(); boolean inReview = updatedDataset.isLockedFor(DatasetLock.Reason.InReview); @@ -2867,7 +2867,7 @@ public Response returnToAuthor(@Context ContainerRequestContext crc, @Parameter( AuthenticatedUser authenticatedUser = getRequestAuthenticatedUserOrDie(crc); Dataset updatedDataset = execCommand(new ReturnDatasetToAuthorCommand(createDataverseRequest(authenticatedUser), dataset, reasonForReturn )); - JsonObjectBuilder result = Json.createObjectBuilder(); + JsonObjectBuilder result = JsonUtil.createObjectBuilder(); result.add("inReview", false); result.add("message", "Dataset id " + updatedDataset.getId() + " has been sent back to the author(s)."); return ok(result); @@ -2888,7 +2888,7 @@ public Response getAvailableFileCategories(@Context ContainerRequestContext crc, DataverseRequest req = createDataverseRequest(getRequestUser(crc)); Dataset ds = findDatasetUserCanSeeOrDie(idSupplied, req, false); List datasetFileCategories = dataFileCategoryService.mergeDatasetFileCategories(ds.getCategories()); - JsonArrayBuilder fileCategoriesArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder fileCategoriesArrayBuilder = JsonUtil.createArrayBuilder(); for (String fieldName : datasetFileCategories) { fileCategoriesArrayBuilder.add(fieldName); } @@ -2931,7 +2931,7 @@ public Response getCurationStatus(@Context ContainerRequestContext crc, if (canSeeStatus) { List statuses = includeHistory ? dsv.getCurationStatuses() : Collections.singletonList(dsv.getCurrentCurationStatus()); if (includeHistory) { - JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder arrayBuilder = JsonUtil.createArrayBuilder(); for (CurationStatus status : statuses) { arrayBuilder.add(curationStatusToJson(status)); } @@ -2949,7 +2949,7 @@ public Response getCurationStatus(@Context ContainerRequestContext crc, private JsonObject curationStatusToJson(CurationStatus status) { if (status == null) { - return Json.createObjectBuilder().build(); + return JsonUtil.createObjectBuilder().build(); } return NullSafeJsonBuilder.jsonObjectBuilder() .add("label", status.getLabel()) @@ -3788,10 +3788,10 @@ public Response getMakeDataCountCitations(@Context ContainerRequestContext crc, try { DataverseRequest req = createDataverseRequest(getRequestUser(crc)); Dataset dataset = findDatasetUserCanSeeOrDie(idSupplied, req, false); - JsonArrayBuilder datasetsCitations = Json.createArrayBuilder(); + JsonArrayBuilder datasetsCitations = JsonUtil.createArrayBuilder(); List externalCitations = datasetExternalCitationsService.getDatasetExternalCitationsByDataset(dataset); for (DatasetExternalCitations citation : externalCitations) { - JsonObjectBuilder candidateObj = Json.createObjectBuilder(); + JsonObjectBuilder candidateObj = JsonUtil.createObjectBuilder(); /** * In the future we can imagine storing and presenting more * information about the citation such as the title of the paper @@ -3870,7 +3870,7 @@ public Response getDownloadSize(@Context ContainerRequestContext crc, DatasetVersion datasetVersion = getDatasetVersionOrDie(req, version, findDatasetUserCanSeeOrDie(dvIdtf, req, false), uriInfo, headers, includeDeaccessioned, false); long datasetStorageSize = datasetVersionFilesServiceBean.getFilesDownloadSize(datasetVersion, fileSearchCriteria, fileDownloadSizeMode); String message = MessageFormat.format(BundleUtil.getStringFromBundle("datasets.api.datasize.download"), datasetStorageSize); - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); jsonObjectBuilder.add("message", message); jsonObjectBuilder.add("storageSize", datasetStorageSize); return ok(jsonObjectBuilder); @@ -4241,7 +4241,7 @@ public Response getTimestamps(@Context ContainerRequestContext crc, @Parameter(d Set perms = new HashSet(); perms.add(Permission.ViewUnpublishedDataset); boolean canSeeDraft = permissionSvc.hasPermissionsFor(u, dataset, perms); - JsonObjectBuilder timestamps = Json.createObjectBuilder(); + JsonObjectBuilder timestamps = JsonUtil.createObjectBuilder(); logger.fine("CSD: " + canSeeDraft); logger.fine("IT: " + dataset.getIndexTime()); logger.fine("MT: " + dataset.getModificationTime()); @@ -4386,15 +4386,15 @@ public Response getGlobusUploadParams(@Context ContainerRequestContext crc, @Par referenceEndpointsWithPaths = GlobusAccessibleStore.getReferenceEndpointsWithPaths(storeId); } - JsonObjectBuilder queryParams = Json.createObjectBuilder(); + JsonObjectBuilder queryParams = JsonUtil.createObjectBuilder(); queryParams.add("queryParameters", - Json.createArrayBuilder().add(Json.createObjectBuilder().add("datasetId", "{datasetId}")) - .add(Json.createObjectBuilder().add("siteUrl", "{siteUrl}")) - .add(Json.createObjectBuilder().add("datasetVersion", "{datasetVersion}")) - .add(Json.createObjectBuilder().add("dvLocale", "{localeCode}")) - .add(Json.createObjectBuilder().add("datasetPid", "{datasetPid}"))); + JsonUtil.createArrayBuilder().add(JsonUtil.createObjectBuilder().add("datasetId", "{datasetId}")) + .add(JsonUtil.createObjectBuilder().add("siteUrl", "{siteUrl}")) + .add(JsonUtil.createObjectBuilder().add("datasetVersion", "{datasetVersion}")) + .add(JsonUtil.createObjectBuilder().add("dvLocale", "{localeCode}")) + .add(JsonUtil.createObjectBuilder().add("datasetPid", "{datasetPid}"))); JsonObject substitutedParams = tokenUtil.getParams(queryParams.build()); - JsonObjectBuilder params = Json.createObjectBuilder(); + JsonObjectBuilder params = JsonUtil.createObjectBuilder(); substitutedParams.keySet().forEach((key) -> { params.add(key, substitutedParams.get(key)); }); @@ -4415,29 +4415,29 @@ public Response getGlobusUploadParams(@Context ContainerRequestContext crc, @Par params.add("referenceEndpointsWithPaths", referenceEndpointsWithPaths); } int timeoutSeconds = JvmSettings.GLOBUS_CACHE_MAXAGE.lookup(Integer.class); - JsonArrayBuilder allowedApiCalls = Json.createArrayBuilder(); + JsonArrayBuilder allowedApiCalls = JsonUtil.createArrayBuilder(); String requestCallName = managed ? "requestGlobusTransferPaths" : "requestGlobusReferencePaths"; allowedApiCalls.add( - Json.createObjectBuilder().add(URLTokenUtil.NAME, requestCallName).add(URLTokenUtil.HTTP_METHOD, "POST") + JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, requestCallName).add(URLTokenUtil.HTTP_METHOD, "POST") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/requestGlobusUploadPaths") .add(URLTokenUtil.TIMEOUT, timeoutSeconds)); if(managed) { - allowedApiCalls.add(Json.createObjectBuilder().add(URLTokenUtil.NAME, "addGlobusFiles") + allowedApiCalls.add(JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "addGlobusFiles") .add(URLTokenUtil.HTTP_METHOD, "POST") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/addGlobusFiles") .add(URLTokenUtil.TIMEOUT, timeoutSeconds)); } else { - allowedApiCalls.add(Json.createObjectBuilder().add(URLTokenUtil.NAME, "addFiles") + allowedApiCalls.add(JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "addFiles") .add(URLTokenUtil.HTTP_METHOD, "POST") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/addFiles") .add(URLTokenUtil.TIMEOUT, timeoutSeconds)); } - allowedApiCalls.add(Json.createObjectBuilder().add(URLTokenUtil.NAME, "getDatasetMetadata") + allowedApiCalls.add(JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "getDatasetMetadata") .add(URLTokenUtil.HTTP_METHOD, "GET") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/versions/{datasetVersion}") .add(URLTokenUtil.TIMEOUT, 5)); allowedApiCalls.add( - Json.createObjectBuilder().add(URLTokenUtil.NAME, "getFileListing").add(URLTokenUtil.HTTP_METHOD, "GET") + JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "getFileListing").add(URLTokenUtil.HTTP_METHOD, "GET") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/versions/{datasetVersion}/files") .add(URLTokenUtil.TIMEOUT, 5)); @@ -4724,15 +4724,15 @@ public Response getGlobusDownloadParams(@Context ContainerRequestContext crc, @P boolean managed = GlobusAccessibleStore.isDataverseManaged(storeId); String transferEndpoint = null; - JsonObjectBuilder queryParams = Json.createObjectBuilder(); + JsonObjectBuilder queryParams = JsonUtil.createObjectBuilder(); queryParams.add("queryParameters", - Json.createArrayBuilder().add(Json.createObjectBuilder().add("datasetId", "{datasetId}")) - .add(Json.createObjectBuilder().add("siteUrl", "{siteUrl}")) - .add(Json.createObjectBuilder().add("datasetVersion", "{datasetVersion}")) - .add(Json.createObjectBuilder().add("dvLocale", "{localeCode}")) - .add(Json.createObjectBuilder().add("datasetPid", "{datasetPid}"))); + JsonUtil.createArrayBuilder().add(JsonUtil.createObjectBuilder().add("datasetId", "{datasetId}")) + .add(JsonUtil.createObjectBuilder().add("siteUrl", "{siteUrl}")) + .add(JsonUtil.createObjectBuilder().add("datasetVersion", "{datasetVersion}")) + .add(JsonUtil.createObjectBuilder().add("dvLocale", "{localeCode}")) + .add(JsonUtil.createObjectBuilder().add("datasetPid", "{datasetPid}"))); JsonObject substitutedParams = tokenUtil.getParams(queryParams.build()); - JsonObjectBuilder params = Json.createObjectBuilder(); + JsonObjectBuilder params = JsonUtil.createObjectBuilder(); substitutedParams.keySet().forEach((key) -> { params.add(key, substitutedParams.get(key)); }); @@ -4743,22 +4743,22 @@ public Response getGlobusDownloadParams(@Context ContainerRequestContext crc, @P } params.add("files", files); int timeoutSeconds = JvmSettings.GLOBUS_CACHE_MAXAGE.lookup(Integer.class); - JsonArrayBuilder allowedApiCalls = Json.createArrayBuilder(); - allowedApiCalls.add(Json.createObjectBuilder().add(URLTokenUtil.NAME, "monitorGlobusDownload") + JsonArrayBuilder allowedApiCalls = JsonUtil.createArrayBuilder(); + allowedApiCalls.add(JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "monitorGlobusDownload") .add(URLTokenUtil.HTTP_METHOD, "POST") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/monitorGlobusDownload") .add(URLTokenUtil.TIMEOUT, timeoutSeconds)); - allowedApiCalls.add(Json.createObjectBuilder().add(URLTokenUtil.NAME, "requestGlobusDownload") + allowedApiCalls.add(JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "requestGlobusDownload") .add(URLTokenUtil.HTTP_METHOD, "POST") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/requestGlobusDownload?downloadId=" + downloadId) .add(URLTokenUtil.TIMEOUT, timeoutSeconds)); - allowedApiCalls.add(Json.createObjectBuilder().add(URLTokenUtil.NAME, "getDatasetMetadata") + allowedApiCalls.add(JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "getDatasetMetadata") .add(URLTokenUtil.HTTP_METHOD, "GET") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/versions/{datasetVersion}") .add(URLTokenUtil.TIMEOUT, 5)); allowedApiCalls.add( - Json.createObjectBuilder().add(URLTokenUtil.NAME, "getFileListing").add(URLTokenUtil.HTTP_METHOD, "GET") + JsonUtil.createObjectBuilder().add(URLTokenUtil.NAME, "getFileListing").add(URLTokenUtil.HTTP_METHOD, "GET") .add(URLTokenUtil.URL_TEMPLATE, "/api/v1/datasets/{datasetId}/versions/{datasetVersion}/files") .add(URLTokenUtil.TIMEOUT, 5)); @@ -5645,7 +5645,7 @@ public Response getDatasetExternalToolUrl(@Context ContainerRequestContext crc, } // Return the URL in a JSON response - return ok(Json.createObjectBuilder().add("toolUrl", toolUrl).add("displayName", externalTool.getDisplayName()) + return ok(JsonUtil.createObjectBuilder().add("toolUrl", toolUrl).add("displayName", externalTool.getDisplayName()) .add("datasetId", dataset.getId()).add("preview", preview)); } catch (Exception ex) { @@ -5703,7 +5703,7 @@ public Response getExternalToolDVParams(@Context ContainerRequestContext crc, public Response getDatasetSummaryFieldNames() { String customFieldNames = settingsService.getValueForKey(SettingsServiceBean.Key.CustomDatasetSummaryFields); String[] fieldNames = DatasetUtil.getDatasetSummaryFieldNames(customFieldNames); - JsonArrayBuilder fieldNamesArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder fieldNamesArrayBuilder = JsonUtil.createArrayBuilder(); for (String fieldName : fieldNames) { fieldNamesArrayBuilder.add(fieldName); } @@ -6007,7 +6007,7 @@ public Response getUserPermissionsOnDataset(@Context ContainerRequestContext crc return wr.getResponse(); } - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); jsonObjectBuilder.add("canViewUnpublishedDataset", permissionService.userOn(requestUser, dataset).has(Permission.ViewUnpublishedDataset)); jsonObjectBuilder.add("canEditDataset", permissionService.userOn(requestUser, dataset).has(Permission.EditDataset)); jsonObjectBuilder.add("canPublishDataset", permissionService.userOn(requestUser, dataset).has(Permission.PublishDataset)); @@ -6173,7 +6173,7 @@ public Response resetPidGenerator(@Context ContainerRequestContext crc, @Paramet public Response getDatasetTypes(@Parameter(description = "Language preference for localized dataset type labels.") @HeaderParam(ACCEPT_LANGUAGE) String acceptLanguage) { Locale locale = I18nUtil.parseAcceptLanguageHeader(acceptLanguage); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (DatasetType datasetType : datasetTypeSvc.listAll()) { jab.add(datasetType.toJson(locale)); } @@ -6235,7 +6235,7 @@ public Response addDatasetType(@Context ContainerRequestContext crc, String displayNameIn = null; String descriptionIn = null; - JsonArrayBuilder datasetTypesAfter = Json.createArrayBuilder(); + JsonArrayBuilder datasetTypesAfter = JsonUtil.createArrayBuilder(); List metadataBlocksToSave = new ArrayList<>(); List licensesToSave = new ArrayList<>(); @@ -6379,11 +6379,11 @@ public Response updateDatasetTypeLinksWithMetadataBlocks(@Context ContainerReque } else { datasetType = datasetTypeSvc.getByName(idOrName); } - JsonArrayBuilder datasetTypesBefore = Json.createArrayBuilder(); + JsonArrayBuilder datasetTypesBefore = JsonUtil.createArrayBuilder(); for (MetadataBlock metadataBlock : datasetType.getMetadataBlocks()) { datasetTypesBefore.add(metadataBlock.getName()); } - JsonArrayBuilder datasetTypesAfter = Json.createArrayBuilder(); + JsonArrayBuilder datasetTypesAfter = JsonUtil.createArrayBuilder(); List metadataBlocksToSave = new ArrayList<>(); if (jsonBody != null && !jsonBody.isEmpty()) { JsonArray json = JsonUtil.getJsonArray(jsonBody); @@ -6401,8 +6401,8 @@ public Response updateDatasetTypeLinksWithMetadataBlocks(@Context ContainerReque } try { execCommand(new UpdateDatasetTypeLinksToMetadataBlocksCommand(createDataverseRequest(getRequestUser(crc)), datasetType, metadataBlocksToSave)); - return ok(Json.createObjectBuilder() - .add("linkedMetadataBlocks", Json.createObjectBuilder() + return ok(JsonUtil.createObjectBuilder() + .add("linkedMetadataBlocks", JsonUtil.createObjectBuilder() .add("before", datasetTypesBefore) .add("after", datasetTypesAfter)) ); @@ -6433,11 +6433,11 @@ public Response updateDatasetTypeWithLicenses(@Context ContainerRequestContext c } else { datasetType = datasetTypeSvc.getByName(idOrName); } - JsonArrayBuilder licensesBefore = Json.createArrayBuilder(); + JsonArrayBuilder licensesBefore = JsonUtil.createArrayBuilder(); for (License license : datasetType.getLicenses()) { licensesBefore.add(license.getName()); } - JsonArrayBuilder licensesAfter = Json.createArrayBuilder(); + JsonArrayBuilder licensesAfter = JsonUtil.createArrayBuilder(); List licensesToSave = new ArrayList<>(); if (jsonBody != null && !jsonBody.isEmpty()) { JsonArray json = JsonUtil.getJsonArray(jsonBody); @@ -6455,8 +6455,8 @@ public Response updateDatasetTypeWithLicenses(@Context ContainerRequestContext c } try { execCommand(new UpdateDatasetTypeAvailableLicensesCommand(createDataverseRequest(getRequestUser(crc)), datasetType, licensesToSave)); - return ok(Json.createObjectBuilder() - .add("availableLicenses", Json.createObjectBuilder() + return ok(JsonUtil.createObjectBuilder() + .add("availableLicenses", JsonUtil.createObjectBuilder() .add("before", licensesBefore) .add("after", licensesAfter)) ); @@ -6609,7 +6609,7 @@ public Response getVersionCreationNote(@Context ContainerRequestContext crc, DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetUserCanSeeOrDie(datasetId, req, false), uriInfo, headers); String note = datasetVersion.getVersionNote(); if(note == null) { - return ok(Json.createObjectBuilder()); + return ok(JsonUtil.createObjectBuilder()); } return ok(note); }, getRequestUser(crc)); 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 b3c35771ce6..28a67237af1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java @@ -477,7 +477,7 @@ public Response createDataset(@Context ContainerRequestContext crc, } return created("/datasets/" + managedDs.getId(), - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("id", managedDs.getId()) .add("persistentId", managedDs.getGlobalId().asString()) ); @@ -526,7 +526,7 @@ public Response createDatasetFromJsonLd(@Context ContainerRequestContext crc, Dataset managedDs = execCommand(new CreateNewDatasetCommand(ds, createDataverseRequest(u))); return created("/datasets/" + managedDs.getId(), - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("id", managedDs.getId()) .add("persistentId", managedDs.getGlobalId().asString()) ); @@ -612,7 +612,7 @@ public Response importDataset(@Context ContainerRequestContext crc, } Dataset managedDs = execCommand(new ImportDatasetCommand(ds, request)); - JsonObjectBuilder responseBld = Json.createObjectBuilder() + JsonObjectBuilder responseBld = JsonUtil.createObjectBuilder() .add("id", managedDs.getId()) .add("persistentId", managedDs.getGlobalId().asString()); @@ -688,7 +688,7 @@ public Response importDatasetDdi(@Context ContainerRequestContext crc, managedDs = execCommand(new CreateNewDatasetCommand(ds, request)); } - JsonObjectBuilder responseBld = Json.createObjectBuilder() + JsonObjectBuilder responseBld = JsonUtil.createObjectBuilder() .add("id", managedDs.getId()) .add("persistentId", managedDs.getGlobalId().toString()); @@ -763,7 +763,7 @@ public Response recreateDataset(@Context ContainerRequestContext crc, DataverseRequest request = createDataverseRequest(u); Dataset managedDs = execCommand(new ImportDatasetCommand(ds, request)); - JsonObjectBuilder responseBld = Json.createObjectBuilder() + JsonObjectBuilder responseBld = JsonUtil.createObjectBuilder() .add("id", managedDs.getId()) .add("persistentId", managedDs.getGlobalId().toString()); @@ -1127,7 +1127,7 @@ public Response listFacets(@Context ContainerRequestContext crc, if (returnDetails) { return ok(jsonDataverseFacets(dataverseFacets)); } else { - JsonArrayBuilder facetsBuilder = Json.createArrayBuilder(); + JsonArrayBuilder facetsBuilder = JsonUtil.createArrayBuilder(); for (DataverseFacet facet : dataverseFacets) { facetsBuilder.add(facet.getDatasetFieldType().getName()); } @@ -1157,7 +1157,7 @@ public Response getFeaturedDataverses(@Context ContainerRequestContext crc, User u = getRequestUser(crc); DataverseRequest r = createDataverseRequest(u); Dataverse dataverse = findDataverseUserCanSeeOrDie(dvIdtf, r); - JsonArrayBuilder fs = Json.createArrayBuilder(); + JsonArrayBuilder fs = JsonUtil.createArrayBuilder(); for (Dataverse f : execCommand(new ListFeaturedCollectionsCommand(r, dataverse))) { fs.add(f.getAlias()); } @@ -1403,7 +1403,7 @@ public Response listContent(@Context ContainerRequestContext crc, DvObject.Visitor ser = new DvObject.Visitor() { @Override public JsonObjectBuilder visit(Dataverse dv) { - return Json.createObjectBuilder().add("type", "dataverse") + return JsonUtil.createObjectBuilder().add("type", "dataverse") .add("id", dv.getId()) .add("title", dv.getName()); } @@ -1943,9 +1943,9 @@ public Response listLinks(@Context ContainerRequestContext crc, } List dvsThisDvHasLinkedToList = dataverseSvc.findDataversesThisIdHasLinkedTo(dv.getId()); - JsonArrayBuilder dvsThisDvHasLinkedToBuilder = Json.createArrayBuilder(); + JsonArrayBuilder dvsThisDvHasLinkedToBuilder = JsonUtil.createArrayBuilder(); for (Dataverse dataverse : dvsThisDvHasLinkedToList) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add("id", dataverse.getId()); job.add("alias", dataverse.getAlias()); job.add("displayName", dataverse.getDisplayName()); @@ -1953,9 +1953,9 @@ public Response listLinks(@Context ContainerRequestContext crc, } List dvsThatLinkToThisDvList = dataverseSvc.findDataversesThatLinkToThisDvId(dv.getId()); - JsonArrayBuilder dvsThatLinkToThisDvBuilder = Json.createArrayBuilder(); + JsonArrayBuilder dvsThatLinkToThisDvBuilder = JsonUtil.createArrayBuilder(); for (Dataverse dataverse : dvsThatLinkToThisDvList) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add("id", dataverse.getId()); job.add("alias", dataverse.getAlias()); job.add("displayName", dataverse.getDisplayName()); @@ -1963,7 +1963,7 @@ public Response listLinks(@Context ContainerRequestContext crc, } List datasetsThisDvHasLinkedToList = dataverseSvc.findDatasetsThisIdHasLinkedTo(dv.getId()); - JsonArrayBuilder datasetsThisDvHasLinkedToBuilder = Json.createArrayBuilder(); + JsonArrayBuilder datasetsThisDvHasLinkedToBuilder = JsonUtil.createArrayBuilder(); for (Dataset dataset : datasetsThisDvHasLinkedToList) { JsonObjectBuilder ds = new NullSafeJsonBuilder(); ds.add("title", dataset.getLatestVersion().getTitle()); @@ -1971,7 +1971,7 @@ public Response listLinks(@Context ContainerRequestContext crc, datasetsThisDvHasLinkedToBuilder.add(ds); } - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); response.add("linkedDataverses", dvsThisDvHasLinkedToBuilder); response.add("dataversesLinkingToThis", dvsThatLinkToThisDvBuilder); response.add("linkedDatasets", datasetsThisDvHasLinkedToBuilder); @@ -2065,7 +2065,7 @@ public Response getLinkingDataverseList(@Context ContainerRequestContext crc, alreadyLinking )); - JsonArrayBuilder dvBuilder = Json.createArrayBuilder(); + JsonArrayBuilder dvBuilder = JsonUtil.createArrayBuilder(); if (dataversesForLinking != null && !dataversesForLinking.isEmpty()) { for (Dataverse dv : dataversesForLinking) { dvBuilder.add(json(dv, true)); @@ -2094,7 +2094,7 @@ public Response getUserPermissionsOnDataverse(@Context ContainerRequestContext c return wr.getResponse(); } User requestUser = getRequestUser(crc); - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); jsonObjectBuilder.add("canAddDataverse", permissionService.userOn(requestUser, dataverse).has(Permission.AddDataverse)); jsonObjectBuilder.add("canAddDataset", permissionService.userOn(requestUser, dataverse).has(Permission.AddDataset)); jsonObjectBuilder.add("canViewUnpublishedDataverse", permissionService.userOn(requestUser, dataverse).has(Permission.ViewUnpublishedDataverse)); @@ -2724,7 +2724,7 @@ public Response listLocallyFairRoleAssignees(@Context ContainerRequestContext cr } Dataverse dataverse = findDataverseOrDie(dvIdtf); - JsonArrayBuilder assignees = Json.createArrayBuilder(); + JsonArrayBuilder assignees = JsonUtil.createArrayBuilder(); dataverse.getLocallyFAIRRoleAssigneeIdentifiers().stream() .sorted() .forEach(assignees::add); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java b/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java index 9d094360681..61de83cb8cd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ExternalTools.java @@ -4,6 +4,8 @@ import edu.harvard.iq.dataverse.externaltools.ExternalTool; import edu.harvard.iq.dataverse.externaltools.ExternalToolServiceBean; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.ws.rs.DELETE; @@ -28,7 +30,7 @@ public class ExternalTools extends AbstractApiBean { @Operation(summary = "Lists external tools", description = "Returns all registered external tools as JSON.") public Response getExternalTools() { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); externalToolService.findAll().forEach((externalTool) -> { jab.add(externalTool.toJson()); }); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java b/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java index 9d180096228..b8e63a2b3c6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/FeedbackApi.java @@ -8,6 +8,7 @@ import edu.harvard.iq.dataverse.feedback.Feedback; import edu.harvard.iq.dataverse.feedback.FeedbackUtil; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; @@ -62,7 +63,7 @@ public Response submitFeedback( String baseUrl = systemConfig.getDataverseSiteUrl(); String installationBrandName = BrandingUtil.getInstallationBrandName(); String supportTeamName = BrandingUtil.getSupportTeamName(systemAddress); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); Feedback feedback = FeedbackUtil.gatherFeedback(feedbackTarget, dataverseSession, messageSubject, userMessage, systemAddress, userEmail, baseUrl, installationBrandName, supportTeamName, SendFeedbackDialog.ccSupport(feedbackTarget)); jab.add(feedback.toJsonObjectBuilder()); mailService.sendMail(feedback.getFromEmail(), feedback.getToEmail(), feedback.getCcEmail(), feedback.getSubject(), feedback.getBody()); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Files.java b/src/main/java/edu/harvard/iq/dataverse/api/Files.java index 687ccadc36f..6983a06d07a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Files.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Files.java @@ -634,7 +634,7 @@ public Command handleLatestPublished() { mdcLogService.logEntry(entry); } - return Response.ok(Json.createObjectBuilder() + return Response.ok(JsonUtil.createObjectBuilder() .add("status", ApiConstants.STATUS_OK) .add("data", json(fileMetadata, returnOwners, returnDatasetVersion)).build()) .type(MediaType.APPLICATION_JSON) @@ -1036,7 +1036,7 @@ public Response getExternalToolUrl(@Context ContainerRequestContext crc, @Parame } // Return the URL in a JSON response - return ok(Json.createObjectBuilder().add("toolUrl", toolUrl).add("displayName", externalTool.getDisplayName()) + return ok(JsonUtil.createObjectBuilder().add("toolUrl", toolUrl).add("displayName", externalTool.getDisplayName()) .add("fileId", dataFile.getId()).add("preview", preview)); } catch (Exception ex) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Groups.java b/src/main/java/edu/harvard/iq/dataverse/api/Groups.java index 55fb68857f3..5e2b40d6329 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Groups.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Groups.java @@ -9,6 +9,7 @@ import edu.harvard.iq.dataverse.util.json.JsonParseException; import edu.harvard.iq.dataverse.util.json.JsonParser; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.Stateless; import jakarta.interceptor.Interceptors; import jakarta.ws.rs.GET; @@ -190,7 +191,7 @@ public Response deleteIpGroup( @Operation(summary = "Lists Shibboleth groups", description = "Returns all global Shibboleth groups as JSON.") public Response listShibGroups() { - JsonArrayBuilder arrBld = Json.createArrayBuilder(); + JsonArrayBuilder arrBld = JsonUtil.createArrayBuilder(); for (ShibGroup g : shibGroupPrv.findGlobalGroups()) { arrBld.add(json(g)); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java b/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java index 1867b0b515b..2bc18c16a2e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Guestbooks.java @@ -86,7 +86,7 @@ public Response getGuestbooks(@Context ContainerRequestContext crc, guestbookService.findEffectiveGuestbooksForGivenDataverse(dataverse): guestbookService.findGuestbooksForGivenDataverse(dataverse); - JsonArrayBuilder guestbookArray = Json.createArrayBuilder(); + JsonArrayBuilder guestbookArray = JsonUtil.createArrayBuilder(); JsonPrinter jsonPrinter = new JsonPrinter(); for (Guestbook gb : guestbooks) { if (includeStats) { @@ -200,7 +200,7 @@ public Response getResponses(@Context ContainerRequestContext crc, JsonObjectBuilder guestbookResponseObject = jsonObjectBuilder(); guestbookResponseObject.add("guestbook", JsonPrinter.json(guestbook)); - JsonArrayBuilder responseObjects = Json.createArrayBuilder(); + JsonArrayBuilder responseObjects = JsonUtil.createArrayBuilder(); for (GuestbookResponse gr : responses) { responseObjects.add(JsonPrinter.json(gr)); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java index 24dbfd3e532..33549608331 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingClients.java @@ -83,7 +83,7 @@ public Response harvestingClients(@Context ContainerRequestContext crc, return ok(jsonObjectBuilder().add("harvestingClients","")); } - JsonArrayBuilder hcArr = Json.createArrayBuilder(); + JsonArrayBuilder hcArr = JsonUtil.createArrayBuilder(); for (HarvestingClient harvestingClient : harvestingClients) { // We already have this harvestingClient - wny do we need to diff --git a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java index 0598210d50a..989ab160d27 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/HarvestingServer.java @@ -11,6 +11,7 @@ import edu.harvard.iq.dataverse.harvest.server.OAISetServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.json.JsonParseException; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.JsonObjectBuilder; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; import java.io.IOException; @@ -76,7 +77,7 @@ public Response oaiSets( return ok(jsonObjectBuilder().add("oaisets", "")); } - JsonArrayBuilder hcArr = Json.createArrayBuilder(); + JsonArrayBuilder hcArr = JsonUtil.createArrayBuilder(); for (OAISet set : oaiSets) { hcArr.add(oaiSetAsJson(set)); @@ -325,7 +326,7 @@ public Response oaiSetListDatasets( /* Auxiliary, helper methods: */ public static JsonArrayBuilder oaiSetsAsJsonArray(List oaiSets) { - JsonArrayBuilder hdArr = Json.createArrayBuilder(); + JsonArrayBuilder hdArr = JsonUtil.createArrayBuilder(); for (OAISet set : oaiSets) { hdArr.add(oaiSetAsJson(set)); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Index.java b/src/main/java/edu/harvard/iq/dataverse/api/Index.java index 5d2dce16528..7f34fbc1aeb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Index.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Index.java @@ -38,6 +38,7 @@ import edu.harvard.iq.dataverse.search.SolrIndexServiceBean; import edu.harvard.iq.dataverse.search.SortBy; import edu.harvard.iq.dataverse.util.ConstraintViolationUtil; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import static edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder.jsonObjectBuilder; import java.io.IOException; @@ -167,10 +168,10 @@ private Response indexAllOrSubset(Long numPartitionsSelected, Long partitionIdTo } - JsonObjectBuilder args = Json.createObjectBuilder(); + JsonObjectBuilder args = JsonUtil.createObjectBuilder(); args.add("numPartitions", numPartitions); args.add("partitionIdToProcess", partitionIdToProcess); - JsonArrayBuilder availablePartitionIdsBuilder = Json.createArrayBuilder(); + JsonArrayBuilder availablePartitionIdsBuilder = JsonUtil.createArrayBuilder(); for (long i : availablePartitionIds) { availablePartitionIdsBuilder.add(i); } @@ -182,7 +183,7 @@ private Response indexAllOrSubset(Long numPartitionsSelected, Long partitionIdTo return ok(preview); } - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); response.add("availablePartitionIds", availablePartitionIdsBuilder); response.add("args", args); /** @@ -342,13 +343,13 @@ public Response indexDatasetByPersistentId( if (dataset != null) { boolean doNormalSolrDocCleanUp = true; indexService.asyncIndexDataset(dataset, doNormalSolrDocCleanUp); - JsonObjectBuilder data = Json.createObjectBuilder(); + JsonObjectBuilder data = JsonUtil.createObjectBuilder(); data.add("message", "Reindexed dataset " + persistentId); data.add("id", dataset.getId()); data.add("persistentId", dataset.getGlobalId().asString()); - JsonArrayBuilder versions = Json.createArrayBuilder(); + JsonArrayBuilder versions = JsonUtil.createArrayBuilder(); for (DatasetVersion version : dataset.getVersions()) { - JsonObjectBuilder versionObject = Json.createObjectBuilder(); + JsonObjectBuilder versionObject = JsonUtil.createObjectBuilder(); versionObject.add("semanticVersion", version.getSemanticVersion()); versionObject.add("id", version.getId()); versions.add(versionObject); @@ -401,7 +402,7 @@ public Response indexMod(@Parameter(description = "Number of indexing partitions dvObjectsIds.add(i); } List mine = IndexUtil.findDvObjectIdsToProcessMod(dvObjectsIds, partitions, which); - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); response.add("partitions", partitions); response.add("which", which); response.add("mine", mine.toString()); @@ -601,7 +602,7 @@ public String getSolrSchema() { } static String error(String message) { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); response.add("status", "ERROR"); response.add("message", message); @@ -641,7 +642,7 @@ public Response searchDebug( return error(Response.Status.INTERNAL_SERVER_ERROR, ex.getLocalizedMessage() + ": " + ex.getCause().getLocalizedMessage()); } - JsonArrayBuilder itemsArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder itemsArrayBuilder = JsonUtil.createArrayBuilder(); List solrSearchResults = solrQueryResponse.getSolrSearchResults(); for (SolrSearchResult solrSearchResult : solrSearchResults) { itemsArrayBuilder.add(solrSearchResult.getType() + ":" + solrSearchResult.getNameSort()); @@ -672,15 +673,15 @@ public Response searchPermsDebug( } List solrDocs = SolrIndexService.determineSolrDocs(dvObjectToLookUp); - JsonObjectBuilder data = Json.createObjectBuilder(); + JsonObjectBuilder data = JsonUtil.createObjectBuilder(); - JsonArrayBuilder permissionsData = Json.createArrayBuilder(); + JsonArrayBuilder permissionsData = JsonUtil.createArrayBuilder(); for (DvObjectSolrDoc solrDoc : solrDocs) { - JsonObjectBuilder dataDoc = Json.createObjectBuilder(); + JsonObjectBuilder dataDoc = JsonUtil.createObjectBuilder(); dataDoc.add(SearchFields.ID, solrDoc.getSolrId()); dataDoc.add(SearchFields.NAME_SORT, solrDoc.getNameOrTitle()); - JsonArrayBuilder perms = Json.createArrayBuilder(); + JsonArrayBuilder perms = JsonUtil.createArrayBuilder(); for (String perm : solrDoc.getPermissions()) { perms.add(perm); } @@ -696,7 +697,7 @@ public Response searchPermsDebug( timestamps.add(permsChanged, SearchUtil.getTimestampOrNull(dvObject.getPermissionModificationTime())); timestamps.add(permsIndexed, SearchUtil.getTimestampOrNull(dvObject.getPermissionIndexTime())); Set roleAssignments = rolesSvc.rolesAssignments(dvObject); - JsonArrayBuilder roleAssignmentsData = Json.createArrayBuilder(); + JsonArrayBuilder roleAssignmentsData = JsonUtil.createArrayBuilder(); for (RoleAssignment roleAssignment : roleAssignments) { roleAssignmentsData.add(roleAssignment.getRole() + " has been granted to " + roleAssignment.getAssigneeIdentifier() + " on " + roleAssignment.getDefinitionPoint()); } @@ -751,32 +752,32 @@ public Response filesearch(@Context ContainerRequestContext crc, @Parameter(desc if (fileView == null) { return error(Status.BAD_REQUEST, "Problem searching for files. Null returned from getFileView."); } - JsonArrayBuilder filesFound = Json.createArrayBuilder(); - JsonArrayBuilder cards = Json.createArrayBuilder(); - JsonArrayBuilder fileIds = Json.createArrayBuilder(); + JsonArrayBuilder filesFound = JsonUtil.createArrayBuilder(); + JsonArrayBuilder cards = JsonUtil.createArrayBuilder(); + JsonArrayBuilder fileIds = JsonUtil.createArrayBuilder(); for (SolrSearchResult result : fileView.getSolrSearchResults()) { cards.add(result.getNameSort()); fileIds.add(result.getEntityId()); - JsonObjectBuilder fileFound = Json.createObjectBuilder(); + JsonObjectBuilder fileFound = JsonUtil.createObjectBuilder(); fileFound.add("name", result.getNameSort()); fileFound.add("entityId", result.getEntityId().toString()); fileFound.add("datasetVersionId", result.getDatasetVersionId()); fileFound.add("datasetId", result.getParent().get(SearchFields.ID)); filesFound.add(fileFound); } - JsonArrayBuilder facets = Json.createArrayBuilder(); + JsonArrayBuilder facets = JsonUtil.createArrayBuilder(); for (FacetCategory facetCategory : fileView.getFacetCategoryList()) { facets.add(facetCategory.getFriendlyName()); } - JsonArrayBuilder filterQueries = Json.createArrayBuilder(); + JsonArrayBuilder filterQueries = JsonUtil.createArrayBuilder(); for (String filterQuery : fileView.getFilterQueries()) { filterQueries.add(filterQuery); } - JsonArrayBuilder allDatasetVersionIds = Json.createArrayBuilder(); + JsonArrayBuilder allDatasetVersionIds = JsonUtil.createArrayBuilder(); for (DatasetVersion dsVersion : dataset.getVersions()) { allDatasetVersionIds.add(dsVersion.getId()); } - JsonObjectBuilder data = Json.createObjectBuilder(); + JsonObjectBuilder data = JsonUtil.createObjectBuilder(); data.add("filesFound", filesFound); data.add("cards", cards); data.add("fileIds", fileIds); @@ -800,7 +801,7 @@ public Response getFileMetadataByDatasetId( @Parameter(description = "Sort field.") @QueryParam("sort") String sortField, @Parameter(description = "Sort order.") @QueryParam("order") String sortOrder ) { - JsonArrayBuilder data = Json.createArrayBuilder(); + JsonArrayBuilder data = JsonUtil.createArrayBuilder(); List fileMetadatasFound = new ArrayList<>(); try { fileMetadatasFound = dataFileService.findFileMetadataByDatasetVersionId(datasetIdToLookUp, maxResults, sortField, sortOrder); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Info.java b/src/main/java/edu/harvard/iq/dataverse/api/Info.java index 78edf67ad5a..b3cc69837f8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Info.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Info.java @@ -2,6 +2,7 @@ import java.util.logging.Logger; import edu.harvard.iq.dataverse.customization.CustomizationConstants; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ws.rs.*; import jakarta.ws.rs.client.Client; import jakarta.ws.rs.client.ClientBuilder; @@ -88,8 +89,8 @@ public Response getInfo() { String versionStr = systemConfig.getVersion(true); String[] comps = versionStr.split("build",2); String version = comps[0].trim(); - JsonValue build = comps.length > 1 ? Json.createArrayBuilder().add(comps[1].trim()).build().get(0) : JsonValue.NULL; - return ok(Json.createObjectBuilder() + JsonValue build = comps.length > 1 ? JsonUtil.createArrayBuilder().add(comps[1].trim()).build().get(0) : JsonValue.NULL; + return ok(JsonUtil.createObjectBuilder() .add("version", version) .add("build", build)); } @@ -147,12 +148,12 @@ public Response getZipDownloadLimit() { @Operation(summary = "Lists export formats", description = "Returns dataset export formats with display name, media type, harvestability, user-interface visibility, and XML metadata when available.") public Response getExportFormats() { - JsonObjectBuilder responseModel = Json.createObjectBuilder(); + JsonObjectBuilder responseModel = JsonUtil.createObjectBuilder(); ExportService instance = ExportService.getInstance(); for (String[] labels : instance.getExportersLabels()) { try { Exporter exporter = instance.getExporter(labels[1]); - JsonObjectBuilder exporterObject = Json.createObjectBuilder().add("displayName", labels[0]) + JsonObjectBuilder exporterObject = JsonUtil.createObjectBuilder().add("displayName", labels[0]) .add("mediaType", exporter.getMediaType()).add("isHarvestable", exporter.isHarvestable()) .add("isVisibleInUserInterface", exporter.isAvailableToUsers()); if (exporter instanceof XMLExporter xmlExporter) { @@ -197,7 +198,7 @@ public Response getCustomizationFile( private Response getSettingResponseByKey(SettingsServiceBean.Key key) { String setting = settingsService.getValueForKey(key); if (setting != null) { - return ok(Json.createObjectBuilder().add("message", setting)); + return ok(JsonUtil.createObjectBuilder().add("message", setting)); } else { return notFound("Setting " + key + " not found"); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java b/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java index 73031bebc1e..d169f8798c1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Licenses.java @@ -2,6 +2,7 @@ import edu.harvard.iq.dataverse.actionlogging.ActionLogRecord; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.ws.rs.DELETE; @@ -48,7 +49,7 @@ public class Licenses extends AbstractApiBean { @Operation(summary = "Lists licenses", description = "Returns all configured licenses as JSON.") public Response getLicenses() { - JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder arrayBuilder = JsonUtil.createArrayBuilder(); for (License license : licenseSvc.listAll()) { arrayBuilder.add(JsonPrinter.json(license)); } @@ -95,7 +96,7 @@ public Response addLicense(@Context ContainerRequestContext crc, actionLogSvc.log(new ActionLogRecord(ActionLogRecord.ActionType.Admin, "licenseAdded") .setInfo("License " + l.getName() + "(" + l.getUri() + ") as id: " + l.getId() + ".") .setUserIdentifier(authenticatedUser.getIdentifier())); - return created("/api/licenses/" + l.getId(), Json.createObjectBuilder().add("message", "License created")); + return created("/api/licenses/" + l.getId(), JsonUtil.createObjectBuilder().add("message", "License created")); } catch (WrappedResponse e) { Throwable cause = e.getCause(); if (cause instanceof IllegalArgumentException) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java b/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java index 709d403c568..5b03a1fee72 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/MakeDataCountApi.java @@ -199,7 +199,7 @@ public Response updateCitationsForDataset( } }); - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("status", "queued"); output.add("message", "Citation update for dataset " + datasetId + " has been queued for processing"); return ok(output); @@ -263,7 +263,7 @@ private boolean processCitationUpdate(Dataset dataset, GlobalId pid, PidProvider logger.fine("Retrieving Citations from " + url.toString()); boolean nextPage = true; - JsonArrayBuilder dataBuilder = Json.createArrayBuilder(); + JsonArrayBuilder dataBuilder = JsonUtil.createArrayBuilder(); try { do { @@ -359,7 +359,7 @@ public Response getProcessingState( return error(Status.BAD_REQUEST,e.getMessage()); } if (mdcps != null) { - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("yearMonth", mdcps.getYearMonth()); output.add("state", mdcps.getState().name()); output.add("stateChangeTimestamp", mdcps.getStateChangeTime().toString()); @@ -390,7 +390,7 @@ public Response updateProcessingState( return badRequest(e.getMessage()); } - JsonObjectBuilder output = Json.createObjectBuilder(); + JsonObjectBuilder output = JsonUtil.createObjectBuilder(); output.add("yearMonth", mdcps.getYearMonth()); output.add("state", mdcps.getState().name()); output.add("stateChangeTimestamp", mdcps.getStateChangeTime().toString()); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java b/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java index 972411e2296..c9a61c0bde8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Notifications.java @@ -8,6 +8,7 @@ import java.util.Optional; import java.util.Set; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.Stateless; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; @@ -61,7 +62,7 @@ public Response getUnreadNotificationsCountForUser(@Context ContainerRequestCont try { AuthenticatedUser au = getRequestAuthenticatedUserOrDie(crc); long unreadCount = userNotificationSvc.getUnreadNotificationCountByUser(au.getId()); - return ok(Json.createObjectBuilder() + return ok(JsonUtil.createObjectBuilder() .add("unreadCount", unreadCount)); } catch (WrappedResponse wr) { return wr.getResponse(); @@ -127,11 +128,11 @@ public Response deleteNotificationForUser(@Context ContainerRequestContext crc, public Response getMutedEmailsForUser(@Context ContainerRequestContext crc) { try { AuthenticatedUser authenticatedUser = getRequestAuthenticatedUserOrDie(crc); - JsonArrayBuilder mutedEmails = Json.createArrayBuilder(); + JsonArrayBuilder mutedEmails = JsonUtil.createArrayBuilder(); authenticatedUser.getMutedEmails().stream().forEach( x -> mutedEmails.add(jsonObjectBuilder().add("name", x.name()).add("description", x.getDescription())) ); - JsonObjectBuilder result = Json.createObjectBuilder().add("mutedEmails", mutedEmails); + JsonObjectBuilder result = JsonUtil.createObjectBuilder().add("mutedEmails", mutedEmails); return ok(result); } catch (WrappedResponse wr) { return wr.getResponse(); @@ -198,11 +199,11 @@ public Response unmuteEmailsForUser(@Context ContainerRequestContext crc, public Response getMutedNotificationsForUser(@Context ContainerRequestContext crc) { try { AuthenticatedUser authenticatedUser = getRequestAuthenticatedUserOrDie(crc); - JsonArrayBuilder mutedNotifications = Json.createArrayBuilder(); + JsonArrayBuilder mutedNotifications = JsonUtil.createArrayBuilder(); authenticatedUser.getMutedNotifications().stream().forEach( x -> mutedNotifications.add(jsonObjectBuilder().add("name", x.name()).add("description", x.getDescription())) ); - JsonObjectBuilder result = Json.createObjectBuilder().add("mutedNotifications", mutedNotifications); + JsonObjectBuilder result = JsonUtil.createObjectBuilder().add("mutedNotifications", mutedNotifications); return ok(result); } catch (WrappedResponse wr) { return wr.getResponse(); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Pids.java b/src/main/java/edu/harvard/iq/dataverse/api/Pids.java index 4a543ba32d3..db47de7bbed 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Pids.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Pids.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.Stateless; import jakarta.json.Json; import jakarta.json.JsonArray; @@ -91,13 +92,13 @@ public Response getUnreserved(@Context ContainerRequestContext crc, return error(Response.Status.FORBIDDEN, BundleUtil.getStringFromBundle("admin.api.auth.mustBeSuperUser")); } - JsonArrayBuilder unreserved = Json.createArrayBuilder(); + JsonArrayBuilder unreserved = JsonUtil.createArrayBuilder(); for (Dataset dataset : datasetSvc.findAll()) { if (dataset.isReleased()) { continue; } if (dataset.getGlobalIdCreateTime() == null) { - unreserved.add(Json.createObjectBuilder() + unreserved.add(JsonUtil.createObjectBuilder() .add("id", dataset.getId()) .add("pid", dataset.getGlobalId().asString()) ); @@ -105,7 +106,7 @@ public Response getUnreserved(@Context ContainerRequestContext crc, } JsonArray finalUnreserved = unreserved.build(); int size = finalUnreserved.size(); - return ok(Json.createObjectBuilder() + return ok(JsonUtil.createObjectBuilder() .add("numUnreserved", size) .add("count", finalUnreserved) ); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Prov.java b/src/main/java/edu/harvard/iq/dataverse/api/Prov.java index e398f8bc921..b9355958ae7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Prov.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Prov.java @@ -87,7 +87,7 @@ public Response addProvJson(@Context ContainerRequestContext crc, } execCommand(new PersistProvJsonCommand(createDataverseRequest(getRequestUser(crc)), dataFile , body, entityName, true)); - JsonObjectBuilder jsonResponse = Json.createObjectBuilder(); + JsonObjectBuilder jsonResponse = JsonUtil.createObjectBuilder(); jsonResponse.add("message", BundleUtil.getStringFromBundle("api.prov.provJsonSaved") + " " + dataFile.getDisplayName()); return ok(jsonResponse); } catch (WrappedResponse ex) { @@ -157,7 +157,7 @@ public Response addProvFreeForm(@Context ContainerRequestContext crc, execCommand(new PersistProvFreeFormCommand(dr, dataFile, provFreeForm)); execCommand(new UpdateDatasetVersionCommand(dataFile.getOwner(), dr)); dataFile = findDataFileOrDie(idSupplied); - JsonObjectBuilder jsonResponse = Json.createObjectBuilder(); + JsonObjectBuilder jsonResponse = JsonUtil.createObjectBuilder(); jsonResponse.add("message", "Free-form provenance data saved for Data File : " + dataFile.getFileMetadata().getProvFreeForm()); return ok(jsonResponse); } catch (WrappedResponse ex) { @@ -184,7 +184,7 @@ public Response getProvFreeForm(@Context ContainerRequestContext crc, if(null == freeFormText) { return error(BAD_REQUEST, BundleUtil.getStringFromBundle("api.prov.error.freeformNoText")); } - JsonObjectBuilder jsonResponse = Json.createObjectBuilder(); + JsonObjectBuilder jsonResponse = JsonUtil.createObjectBuilder(); jsonResponse.add("text", freeFormText); return ok(jsonResponse); } catch (WrappedResponse ex) { @@ -210,7 +210,7 @@ public Response getProvJson(@Context ContainerRequestContext crc, if(null == jsonText) { return error(BAD_REQUEST, BundleUtil.getStringFromBundle("api.prov.error.jsonNoContent")); } - JsonObjectBuilder jsonResponse = Json.createObjectBuilder(); + JsonObjectBuilder jsonResponse = JsonUtil.createObjectBuilder(); jsonResponse.add("json", jsonText.toString()); return ok(jsonResponse); } catch (WrappedResponse ex) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java b/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java index cb4de9090dc..6a494a82fc2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/SavedSearches.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJBException; import jakarta.json.Json; import jakarta.json.JsonArray; @@ -43,7 +45,7 @@ public class SavedSearches extends AbstractApiBean { @Operation(summary = "Lists saved-search endpoints", description = "Returns a simple list of supported saved-search administration endpoint patterns.") public Response meta() { - JsonArrayBuilder endpoints = Json.createArrayBuilder(); + JsonArrayBuilder endpoints = JsonUtil.createArrayBuilder(); endpoints.add("GET"); endpoints.add("GET /list"); endpoints.add("GET /id"); @@ -57,13 +59,13 @@ public Response meta() { @Operation(summary = "Lists saved searches", description = "Returns all saved searches with query, filter queries, id, definition point, and creator id.") public Response list() { - JsonArrayBuilder savedSearchesBuilder = Json.createArrayBuilder(); + JsonArrayBuilder savedSearchesBuilder = JsonUtil.createArrayBuilder(); List savedSearches = savedSearchSvc.findAll(); for (SavedSearch savedSearch : savedSearches) { JsonObjectBuilder thisSavedSearch = toJson(savedSearch); savedSearchesBuilder.add(thisSavedSearch); } - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); response.add("savedSearches", savedSearchesBuilder); return ok(response); } @@ -85,10 +87,10 @@ public Response show( } private JsonObjectBuilder toJson(SavedSearch savedSearch) { - JsonObjectBuilder savedSearchJson = Json.createObjectBuilder(); + JsonObjectBuilder savedSearchJson = JsonUtil.createObjectBuilder(); long savedSearchId = savedSearch.getId(); Dataverse definitionPoint = savedSearch.getDefinitionPoint(); - JsonArrayBuilder fqBuilder = Json.createArrayBuilder(); + JsonArrayBuilder fqBuilder = JsonUtil.createArrayBuilder(); for (SavedSearchFilterQuery fq : savedSearch.getSavedSearchFilterQueries()) { fqBuilder.add(fq.getFilterQuery()); } @@ -175,7 +177,7 @@ public Response add( try { SavedSearch persistedSavedSearch = savedSearchSvc.add(toPersist); - return ok("Added: " + persistedSavedSearch, Json.createObjectBuilder().add("id", persistedSavedSearch.getId())); + return ok("Added: " + persistedSavedSearch, JsonUtil.createObjectBuilder().add("id", persistedSavedSearch.getId())); } catch (EJBException ex) { StringBuilder errors = new StringBuilder(); Throwable throwable = ex.getCause(); @@ -208,7 +210,7 @@ public Response delete( } if (wasDeleted) { - return ok(Json.createObjectBuilder().add("Deleted", doomedId)); + return ok(JsonUtil.createObjectBuilder().add("Deleted", doomedId)); } else { return error(INTERNAL_SERVER_ERROR, "Problem deleting id " + doomedId); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Search.java b/src/main/java/edu/harvard/iq/dataverse/api/Search.java index a3fcd950994..ce20ee76abe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Search.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Search.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.util.*; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.inject.Inject; import jakarta.json.Json; @@ -222,18 +224,18 @@ public Response search( return error(Response.Status.INTERNAL_SERVER_ERROR, message); } - JsonArrayBuilder itemsArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder itemsArrayBuilder = JsonUtil.createArrayBuilder(); List solrSearchResults = solrQueryResponse.getSolrSearchResults(); for (SolrSearchResult solrSearchResult : solrSearchResults) { itemsArrayBuilder.add(solrSearchResult.json(showRelevance, showEntityIds, showApiUrls, metadataFields)); } - JsonObjectBuilder spelling_alternatives = Json.createObjectBuilder(); + JsonObjectBuilder spelling_alternatives = JsonUtil.createObjectBuilder(); for (Map.Entry> entry : solrQueryResponse.getSpellingSuggestionsByToken().entrySet()) { spelling_alternatives.add(entry.getKey(), entry.getValue().toString()); } - JsonObjectBuilder value = Json.createObjectBuilder() + JsonObjectBuilder value = JsonUtil.createObjectBuilder() .add("q", query) .add("total_count", solrQueryResponse.getNumResultsFound()) .add("start", solrQueryResponse.getResultsStart()) @@ -241,13 +243,13 @@ public Response search( .add("items", itemsArrayBuilder.build()); if (showFacets) { - JsonArrayBuilder facets = Json.createArrayBuilder(); - JsonObjectBuilder facetCategoryBuilder = Json.createObjectBuilder(); + JsonArrayBuilder facets = JsonUtil.createArrayBuilder(); + JsonObjectBuilder facetCategoryBuilder = JsonUtil.createObjectBuilder(); for (FacetCategory facetCategory : solrQueryResponse.getFacetCategoryList()) { - JsonObjectBuilder facetCategoryBuilderFriendlyPlusData = Json.createObjectBuilder(); - JsonArrayBuilder facetLabelBuilderData = Json.createArrayBuilder(); + JsonObjectBuilder facetCategoryBuilderFriendlyPlusData = JsonUtil.createObjectBuilder(); + JsonArrayBuilder facetLabelBuilderData = JsonUtil.createArrayBuilder(); for (FacetLabel facetLabel : facetCategory.getFacetLabel()) { - JsonObjectBuilder countBuilder = Json.createObjectBuilder(); + JsonObjectBuilder countBuilder = JsonUtil.createObjectBuilder(); countBuilder.add(facetLabel.getName(), facetLabel.getCount()); facetLabelBuilderData.add(countBuilder); } @@ -269,7 +271,7 @@ public Response search( } } } - JsonObjectBuilder objectTypeCounts = Json.createObjectBuilder(); + JsonObjectBuilder objectTypeCounts = JsonUtil.createObjectBuilder(); objectTypeCountsMap.forEach((k,v) -> objectTypeCounts.add(k,v)); value.add("total_count_per_object_type", objectTypeCounts); } @@ -301,15 +303,15 @@ public Response getSearchEngines() { Map availableEngines = searchServiceFactory.getAvailableServices(); String defaultServiceName = JvmSettings.DEFAULT_SEARCH_SERVICE.lookupOptional().orElse(SearchServiceFactory.INTERNAL_SOLR_SERVICE_NAME); - JsonArrayBuilder enginesArray = Json.createArrayBuilder(); + JsonArrayBuilder enginesArray = JsonUtil.createArrayBuilder(); for (String engine : availableEngines.keySet()) { - JsonObjectBuilder engineObject = Json.createObjectBuilder() + JsonObjectBuilder engineObject = JsonUtil.createObjectBuilder() .add("name", engine) .add("displayName", availableEngines.get(engine).getDisplayName()); enginesArray.add(engineObject); } - JsonObjectBuilder response = Json.createObjectBuilder() + JsonObjectBuilder response = JsonUtil.createObjectBuilder() .add("services", enginesArray) .add("defaultService", defaultServiceName); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/SendFeedbackAPI.java b/src/main/java/edu/harvard/iq/dataverse/api/SendFeedbackAPI.java index ac1d2ca432a..6ebaff01a2b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/SendFeedbackAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/SendFeedbackAPI.java @@ -90,7 +90,7 @@ public Response submitFeedback(@Context ContainerRequestContext crc, String baseUrl = systemConfig.getDataverseSiteUrl(); String installationBrandName = BrandingUtil.getInstallationBrandName(); String supportTeamName = BrandingUtil.getSupportTeamName(systemAddress); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); Feedback feedback = FeedbackUtil.gatherFeedback(feedbackTarget, dataverseSession, messageSubject, userMessage, systemAddress, userEmail, baseUrl, installationBrandName, supportTeamName, SendFeedbackDialog.ccSupport(feedbackTarget)); jab.add(feedback.toLimitedJsonObjectBuilder()); mailService.sendMail(feedback.getFromEmail(), feedback.getToEmail(), feedback.getCcEmail(), feedback.getSubject(), feedback.getBody()); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java b/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java index 3ee77683d90..449a372000a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/StorageSites.java @@ -3,6 +3,8 @@ import edu.harvard.iq.dataverse.locality.StorageSite; import edu.harvard.iq.dataverse.locality.StorageSiteUtil; import java.util.List; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; @@ -28,7 +30,7 @@ public class StorageSites extends AbstractApiBean { public Response listAll() { List storageSites = storageSiteSvc.findAll(); if (storageSites != null && !storageSites.isEmpty()) { - JsonArrayBuilder sites = Json.createArrayBuilder(); + JsonArrayBuilder sites = JsonUtil.createArrayBuilder(); storageSites.forEach((storageSite) -> { sites.add(storageSite.toJsonObjectBuilder()); }); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java b/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java index 21b82505616..924de3704a0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/WorkflowsAdmin.java @@ -8,6 +8,8 @@ import static edu.harvard.iq.dataverse.util.json.JsonPrinter.brief; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.json; import static edu.harvard.iq.dataverse.util.json.JsonPrinter.toJsonArray; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.workflow.Workflow; import edu.harvard.iq.dataverse.workflow.WorkflowContext.TriggerType; import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; @@ -100,7 +102,7 @@ public Response setDefault( @Operation(summary = "Lists default workflows", description = "Returns each workflow trigger type with its configured default workflow or null when no default is set.") public Response listDefaults() { - JsonObjectBuilder bld = Json.createObjectBuilder(); + JsonObjectBuilder bld = JsonUtil.createObjectBuilder(); for ( TriggerType tp : TriggerType.values() ) { bld.add(tp.name(), workflows.getDefaultWorkflow(tp) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java b/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java index 8e48f09bcac..1b4141f858a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/batchjob/FileRecordJobResource.java @@ -6,6 +6,7 @@ import edu.harvard.iq.dataverse.api.auth.AuthRequired; import edu.harvard.iq.dataverse.batch.jobs.importer.ImportMode; import edu.harvard.iq.dataverse.engine.command.impl.ImportFromFileSystemCommand; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; import jakarta.ws.rs.DefaultValue; @@ -64,7 +65,7 @@ public Response getFilesystemImport(@Context ContainerRequestContext crc, if (!returnString.equals("FileSystemImportJob in progress")) { return error(Response.Status.INTERNAL_SERVER_ERROR, returnString); } - return ok(Json.createObjectBuilder() + return ok(JsonUtil.createObjectBuilder() .add("message", returnString) .add("executionId", jsonObject.getInt("executionId")) ); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java index bb57059a99a..0531b0117d1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/errorhandlers/ConstraintViolationExceptionHandler.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.api.errorhandlers; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; @@ -34,7 +35,7 @@ public Response toResponse(ConstraintViolationException exception) { .collect(Collectors.toList()); return Response.status(Response.Status.BAD_REQUEST) - .entity( Json.createObjectBuilder() + .entity( JsonUtil.createObjectBuilder() .add("status", "ERROR") .add("code", Response.Status.BAD_REQUEST.getStatusCode()) .add("message", "JPA validation constraints failed persistence. See list of violations for details.") @@ -51,10 +52,10 @@ private ValidationError toValidationError(ConstraintViolation constraintViolatio } private JsonArray toJsonArray(List list) { - JsonArrayBuilder builder = Json.createArrayBuilder(); + JsonArrayBuilder builder = JsonUtil.createArrayBuilder(); list.stream() .forEach(error -> builder.add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("path", error.getPath()) .add("message", error.getMessage()))); return builder.build(); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/filter/ApiBlockingFilter.java b/src/main/java/edu/harvard/iq/dataverse/api/filter/ApiBlockingFilter.java index 39efbb97aaa..84497b479d4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/filter/ApiBlockingFilter.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/filter/ApiBlockingFilter.java @@ -4,6 +4,7 @@ import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.validation.PasswordValidatorServiceBean; import jakarta.annotation.PostConstruct; import jakarta.inject.Inject; @@ -211,7 +212,7 @@ private void updateBlockedPoints(String endpointList) { String currentErrorMessage = POLICY_ERROR_MESSAGES.getOrDefault(policy, "Endpoint blocked. Please contact the dataverse administrator."); - errorJson = Json.createObjectBuilder().add("status", "error").add("message", currentErrorMessage).build(); + errorJson = JsonUtil.createObjectBuilder().add("status", "error").add("message", currentErrorMessage).build(); for (String endpoint : endpointList.split(",")) { String endpointPrefix = canonicalize(endpoint); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java index bbd8260e3fe..3a39400a598 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/imports/ImportServiceBean.java @@ -164,7 +164,7 @@ public JsonObjectBuilder handleFile(DataverseRequest dataverseRequest, Dataverse if (validationLog!=null) { validationLog.println(msg); } - return Json.createObjectBuilder().add("message", "Import Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + ex.getMessage()); + return JsonUtil.createObjectBuilder().add("message", "Import Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + ex.getMessage()); } catch (IOException e) { Throwable causedBy =e.getCause(); while (causedBy != null && causedBy.getCause()!=null) { @@ -189,7 +189,7 @@ public JsonObjectBuilder handleFile(DataverseRequest dataverseRequest, Dataverse validationLog.println(msg); e.printStackTrace(); - return Json.createObjectBuilder().add("message", "Unexpected Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + e.getMessage()); + return JsonUtil.createObjectBuilder().add("message", "Unexpected Exception processing file " + file.getParentFile().getName() + "/" + file.getName() + ", msg:" + e.getMessage()); } } @@ -560,7 +560,7 @@ public JsonObjectBuilder doImport(DataverseRequest dataverseRequest, Dataverse o logger.log(Level.INFO, "Error excuting Create dataset command: {0}", ex.getMessage()); throw new ImportException("Error excuting dataverse command: " + ex.getMessage(), ex); } - return Json.createObjectBuilder().add("message", status); + return JsonUtil.createObjectBuilder().add("message", status); } private boolean processMigrationValidationError(DatasetFieldValue f, PrintWriter cleanupLog, String fileName) { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/ldn/COARNotifyRelationshipAnnouncement.java b/src/main/java/edu/harvard/iq/dataverse/api/ldn/COARNotifyRelationshipAnnouncement.java index 84f5702cf40..5682a93dc3d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/ldn/COARNotifyRelationshipAnnouncement.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/ldn/COARNotifyRelationshipAnnouncement.java @@ -9,8 +9,9 @@ import edu.harvard.iq.dataverse.UserNotificationServiceBean; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.pidproviders.PidProvider; +import edu.harvard.iq.dataverse.pidproviders.doi.AbstractDOIProvider; +import edu.harvard.iq.dataverse.pidproviders.doi.UnmanagedDOIProvider; import edu.harvard.iq.dataverse.settings.JvmSettings; -import edu.harvard.iq.dataverse.util.json.JsonLDNamespace; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; import edu.harvard.iq.dataverse.util.json.JsonUtil; @@ -70,7 +71,6 @@ public COARNotifyRelationshipAnnouncement( * Process a COAR Notify Relationship Announcement message. * * @param msgObject The JSON-LD message object - * @return true if the message was successfully processed, false otherwise */ public void processMessage(JsonObject msgObject) { // Extract subject, object, and relationship from the message @@ -168,7 +168,11 @@ private ResourceMetadata retrieveResourceMetadata(String subjectId) { // Step 3: Retrieve and parse DataCite XML if (dataciteXmlUrl != null) { - parseDataCiteXml(dataciteXmlUrl, client, metadata); + if (isTrustedDataCiteUrl(dataciteXmlUrl)) { + parseDataCiteXml(dataciteXmlUrl, client, metadata); + } else { + logger.warning("DataCite XML URL is not from a trusted source: " + dataciteXmlUrl); + } } else { logger.fine("No DataCite XML URL found in Signposting links"); } @@ -189,10 +193,6 @@ private ResourceMetadata retrieveResourceMetadata(String subjectId) { return metadata; } - /** - * Extract DataCite XML URL from Signposting Link headers. - */ - /** * Extract DataCite XML URL from Signposting Link headers. */ @@ -232,6 +232,33 @@ private String extractDataCiteXmlUrl(CloseableHttpResponse headResponse) { return null; } + /** + * Validate that the URL is a trusted source for DataCite XML. + * Supports standard DOI resolvers and DataCite API. + */ + boolean isTrustedDataCiteUrl(String url) { + if (url == null || url.isBlank()) { + return false; + } + url = url.toLowerCase(); + + String doiPart = null; + if (url.startsWith(AbstractDOIProvider.DOI_RESOLVER_URL)) { + doiPart = url.substring(AbstractDOIProvider.DOI_RESOLVER_URL.length()); + } else if (url.startsWith(AbstractDOIProvider.HTTP_DOI_RESOLVER_URL)) { + doiPart = url.substring(AbstractDOIProvider.HTTP_DOI_RESOLVER_URL.length()); + } else if (url.startsWith(AbstractDOIProvider.DXDOI_RESOLVER_URL)) { + doiPart = url.substring(AbstractDOIProvider.DXDOI_RESOLVER_URL.length()); + } else if (url.startsWith(AbstractDOIProvider.HTTP_DXDOI_RESOLVER_URL)) { + doiPart = url.substring(AbstractDOIProvider.HTTP_DXDOI_RESOLVER_URL.length()); + } + + if (doiPart != null) { + return (new UnmanagedDOIProvider()).parsePersistentId(AbstractDOIProvider.DOI_PROTOCOL, doiPart) != null; + } + return false; + } + /** * Parse DataCite XML to extract title and resource type. */ @@ -305,7 +332,7 @@ private String extractRelationshipLabel(String relationshipId) { * Build the JSON object representing the citing resource. */ private JsonObject buildCitingResourceJson(String subjectId, String relationship, ResourceMetadata metadata) { - JsonObjectBuilder citingResourceBuilder = Json.createObjectBuilder() + JsonObjectBuilder citingResourceBuilder = JsonUtil.createObjectBuilder() .add("@id", subjectId) .add("relationship", relationship); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java b/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java index 287a99270e9..f16afdbda06 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/util/JsonResponseBuilder.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.api.util; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonValue; @@ -22,7 +23,7 @@ public class JsonResponseBuilder { - private JsonObjectBuilder entityBuilder = Json.createObjectBuilder(); + private JsonObjectBuilder entityBuilder = JsonUtil.createObjectBuilder(); private Response.ResponseBuilder jerseyResponseBuilder; private boolean alreadyLogged = false; @@ -121,7 +122,7 @@ public JsonResponseBuilder request(HttpServletRequest request) { */ public JsonResponseBuilder requestContentType(HttpServletRequest request) { String type = request.getContentType(); - this.entityBuilder.add("requestContentType", ((type==null) ? JsonValue.NULL : Json.createValue(type))); + this.entityBuilder.add("requestContentType", ((type==null) ? JsonValue.NULL : JsonUtil.createValue(type))); return this; } @@ -220,7 +221,7 @@ public JsonResponseBuilder log(Logger logger, Level level, Optional e // This is necessary because we need to build in two places: logging and response creation. // Without cloning the object builder, we'd end up with an empty entity in the response when logging before that. JsonObject entity = this.entityBuilder.build(); - this.entityBuilder = Json.createObjectBuilder(entity); + this.entityBuilder = JsonUtil.createObjectBuilder(entity); StringBuilder metadata = new StringBuilder(); entity.forEach((k,v) -> metadata.append("_").append(k).append("=").append(v.toString()).append(";")); diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java b/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java index 123155f06e0..b799575818d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/users/AuthenticatedUser.java @@ -6,6 +6,7 @@ import edu.harvard.iq.dataverse.FileAccessRequest; import edu.harvard.iq.dataverse.UserNotification.Type; import edu.harvard.iq.dataverse.UserNotification; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.validation.ValidateEmail; import edu.harvard.iq.dataverse.authorization.AuthenticatedUserDisplayInfo; import edu.harvard.iq.dataverse.authorization.AuthenticatedUserLookup; @@ -454,7 +455,7 @@ public void setShibIdentityProvider(String shibIdentityProvider) { } public JsonObjectBuilder toJson() { - //JsonObjectBuilder authenicatedUserJson = Json.createObjectBuilder(); + //JsonObjectBuilder authenicatedUserJson = JsonUtil.createObjectBuilder(); NullSafeJsonBuilder authenicatedUserJson = NullSafeJsonBuilder.jsonObjectBuilder(); authenicatedUserJson.add("id", this.id); @@ -490,7 +491,7 @@ public JsonObjectBuilder toJson() { */ public static JsonObjectBuilder getBundleStrings(){ - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add("userId", BundleUtil.getStringFromBundle("dashboard.list_users.tbl_header.userId")) .add("userIdentifier", BundleUtil.getStringFromBundle("dashboard.list_users.tbl_header.userIdentifier")) .add("lastName", BundleUtil.getStringFromBundle("dashboard.list_users.tbl_header.lastName")) diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusAccessibleStore.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusAccessibleStore.java index 032ec1cfe48..55bc9f65312 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusAccessibleStore.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusAccessibleStore.java @@ -1,6 +1,7 @@ package edu.harvard.iq.dataverse.dataaccess; import edu.harvard.iq.dataverse.util.ListSplitUtil; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; @@ -39,7 +40,7 @@ public static String getTransferPath(String driverId) { } public static JsonArray getReferenceEndpointsWithPaths(String driverId) { - JsonArrayBuilder builder = Json.createArrayBuilder(); + JsonArrayBuilder builder = JsonUtil.createArrayBuilder(); for (String endpoint : ListSplitUtil.split(StorageIO.getConfigParamForDriver(driverId, AbstractRemoteOverlayAccessIO.REFERENCE_ENDPOINTS_WITH_BASEPATHS))) { builder.add(endpoint); diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusOverlayAccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusOverlayAccessIO.java index b0728390c55..e0734d841c4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusOverlayAccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/GlobusOverlayAccessIO.java @@ -276,9 +276,9 @@ public void delete() throws IOException { logger.fine("submission_id for delete is: " + submissionId); absoluteURI = new URI("https://transfer.api.globusonline.org/v0.10/delete"); HttpPost post = new HttpPost(absoluteURI); - JsonObjectBuilder taskJsonBuilder = Json.createObjectBuilder(); + JsonObjectBuilder taskJsonBuilder = JsonUtil.createObjectBuilder(); taskJsonBuilder.add("submission_id", submissionId).add("DATA_TYPE", "delete").add("endpoint", endpoint) - .add("DATA", Json.createArrayBuilder().add(Json.createObjectBuilder().add("DATA_TYPE", "delete_item").add("path", + .add("DATA", JsonUtil.createArrayBuilder().add(JsonUtil.createObjectBuilder().add("DATA_TYPE", "delete_item").add("path", endpointPath + relativeDirectoryPath + "/" + filename))); post.setHeader("Content-Type", "application/json"); post.addHeader("Authorization", "Bearer " + globusAccessToken); diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java index 74c22f4ce3e..d13d615f5bd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.dataaccess; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain; @@ -1098,14 +1099,14 @@ private String generateTemporaryS3UploadUrl(String key, Date expiration) throws public JsonObjectBuilder generateTemporaryS3UploadUrls(String globalId, String storageIdentifier, long fileSize) throws IOException { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); key = getMainFileKey(); Instant expiration = Instant.now().plus(Duration.ofMinutes(getUrlExpirationMinutes())); if (fileSize <= minPartSize) { response.add("url", generateTemporaryS3UploadUrl(key, Date.from(expiration))); } else { - JsonObjectBuilder urls = Json.createObjectBuilder(); + JsonObjectBuilder urls = JsonUtil.createObjectBuilder(); CreateMultipartUploadRequest.Builder createMultipartUploadRequestBuilder = CreateMultipartUploadRequest .builder().bucket(bucketName).key(key); diff --git a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java index de2aa0aaee8..7bf0233a8f7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/datacapturemodule/DataCaptureModuleUtil.java @@ -8,6 +8,8 @@ import edu.harvard.iq.dataverse.util.ListSplitUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; @@ -32,7 +34,7 @@ public static boolean rsyncSupportEnabled(String uploadMethodsSettings) { */ @Deprecated(forRemoval = true, since = "2024-07-07") public static JsonObject generateJsonForUploadRequest(AuthenticatedUser user, Dataset dataset) { - JsonObjectBuilder jab = Json.createObjectBuilder(); + JsonObjectBuilder jab = JsonUtil.createObjectBuilder(); // The general rule should be to always pass the user id and dataset identifier to the DCM. jab.add("userId", user.getId()); jab.add("datasetIdentifier", dataset.getIdentifier()); diff --git a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetType.java b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetType.java index e07e80f7dd3..2dbc0dca3fe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetType.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetType.java @@ -3,6 +3,7 @@ import edu.harvard.iq.dataverse.MetadataBlock; import edu.harvard.iq.dataverse.license.License; import edu.harvard.iq.dataverse.util.BundleUtil; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; @@ -144,11 +145,11 @@ public void setLicenses(List licenses) { } public JsonObjectBuilder toJson(Locale locale) { - JsonArrayBuilder linkedMetadataBlocks = Json.createArrayBuilder(); + JsonArrayBuilder linkedMetadataBlocks = JsonUtil.createArrayBuilder(); for (MetadataBlock metadataBlock : this.getMetadataBlocks()) { linkedMetadataBlocks.add(metadataBlock.getName()); } - JsonArrayBuilder availableLicenses = Json.createArrayBuilder(); + JsonArrayBuilder availableLicenses = JsonUtil.createArrayBuilder(); for (License license : this.getLicenses()) { availableLicenses.add(license.getName()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java b/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java index 572b7fc5b78..03d91fb24d4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java +++ b/src/main/java/edu/harvard/iq/dataverse/datasetutility/AddReplaceFileHelper.java @@ -2046,7 +2046,7 @@ public void setDuplicateFileWarning(String duplicateFileWarning) { public Response addFiles(String jsonData, Dataset dataset, User authUser, boolean trustSuppliedFileSizes) { msgt("(addFilesToDataset) jsonData: " + jsonData.toString()); - JsonArrayBuilder jarr = Json.createArrayBuilder(); + JsonArrayBuilder jarr = JsonUtil.createArrayBuilder(); JsonArray filesJson = null; @@ -2104,7 +2104,7 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser, boolea runAddFileByDataset(dataset, newFilename, newFileContentType, newStorageIdentifier, null, optionalFileParams, true); if (hasError()) { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("storageIdentifier", newStorageIdentifier) .add("errorMessage", getHttpErrorCode().toString() +":"+ getErrorMessagesAsString("\n")) .add("fileDetails", fileJson); @@ -2114,13 +2114,13 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser, boolea String duplicateWarning = getDuplicateFileWarning(); if (duplicateWarning != null && !duplicateWarning.isEmpty()) { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("storageIdentifier", newStorageIdentifier) .add("warningMessage", getDuplicateFileWarning()) .add("fileDetails", successresult.getJsonArray("files").getJsonObject(0)); jarr.add(fileoutput); } else { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("storageIdentifier", newStorageIdentifier) .add("successMessage", "Added successfully to the dataset") .add("fileDetails", successresult.getJsonArray("files").getJsonObject(0)); @@ -2129,7 +2129,7 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser, boolea successNumberofFiles = successNumberofFiles + 1; } } else { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("errorMessage", "You must provide a storageidentifier, filename, and mimetype.") .add("fileDetails", fileJson); @@ -2138,7 +2138,7 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser, boolea } catch (DataFileTagException ex) { logger.log(Level.SEVERE, null, ex); - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("errorCode", Response.Status.BAD_REQUEST.getStatusCode()) .add("message", ex.getMessage()) .add("fileDetails", fileJson); @@ -2147,7 +2147,7 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser, boolea } catch (NoFilesException ex) { logger.log(Level.SEVERE, null, ex); - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("errorCode", Response.Status.BAD_REQUEST.getStatusCode()) .add("message", BundleUtil.getStringFromBundle("NoFileException! Serious Error! See administrator!")) .add("fileDetails", fileJson); @@ -2188,14 +2188,14 @@ public Response addFiles(String jsonData, Dataset dataset, User authUser, boolea return error(BAD_REQUEST, e.getMessage()); } - JsonObjectBuilder result = Json.createObjectBuilder() + JsonObjectBuilder result = JsonUtil.createObjectBuilder() .add(ApiConstants.API_ADD_FILES_COUNT_PROCESSED, totalNumberofFiles) .add(ApiConstants.API_ADD_FILES_COUNT_SUCCESSFUL, successNumberofFiles); - return Response.ok().entity(Json.createObjectBuilder() + return Response.ok().entity(JsonUtil.createObjectBuilder() .add("status", ApiConstants.STATUS_OK) - .add("data", Json.createObjectBuilder().add("Files", jarr).add("Result", result)).build() ).build(); + .add("data", JsonUtil.createObjectBuilder().add("Files", jarr).add("Result", result)).build() ).build(); } public Response addFiles(String jsonData, Dataset dataset, User authUser) { @@ -2216,7 +2216,7 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { msgt("(replaceFilesInDataset) jsonData: " + jsonData.toString()); this.dataset = ds; - JsonArrayBuilder jarr = Json.createArrayBuilder(); + JsonArrayBuilder jarr = JsonUtil.createArrayBuilder(); JsonArray filesJson = null; @@ -2276,7 +2276,7 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { null, dataset, optionalFileParams, true); } if (hasError()) { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("storageIdentifier", newStorageIdentifier) .add("errorMessage", getHttpErrorCode().toString() +":"+ getErrorMessagesAsString("\n")) .add("fileDetails", fileJson); @@ -2286,13 +2286,13 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { String duplicateWarning = getDuplicateFileWarning(); if (duplicateWarning != null && !duplicateWarning.isEmpty()) { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("storageIdentifier", newStorageIdentifier) .add("warningMessage", getDuplicateFileWarning()) .add("fileDetails", successresult.getJsonArray("files").getJsonObject(0)); jarr.add(fileoutput); } else { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("storageIdentifier", newStorageIdentifier) .add("successMessage", "Replaced successfully in the dataset") .add("fileDetails", successresult.getJsonArray("files").getJsonObject(0)); @@ -2301,7 +2301,7 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { successNumberofFiles = successNumberofFiles + 1; } } else { - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("errorMessage", "You must provide a fileToReplaceId, storageidentifier, filename, and mimetype.") .add("fileDetails", fileJson); @@ -2310,7 +2310,7 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { } catch (DataFileTagException ex) { logger.log(Level.SEVERE, null, ex); - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("errorCode", Response.Status.BAD_REQUEST.getStatusCode()) .add("message", ex.getMessage()) .add("fileDetails", fileJson); @@ -2319,7 +2319,7 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { } catch (NoFilesException ex) { logger.log(Level.SEVERE, null, ex); - JsonObjectBuilder fileoutput = Json.createObjectBuilder() + JsonObjectBuilder fileoutput = JsonUtil.createObjectBuilder() .add("errorCode", Response.Status.BAD_REQUEST.getStatusCode()) .add("message", BundleUtil.getStringFromBundle("NoFileException! Serious Error! See administrator!")) .add("fileDetails", fileJson); @@ -2361,13 +2361,13 @@ public Response replaceFiles(String jsonData, Dataset ds, User authUser) { return error(BAD_REQUEST, e.getMessage()); } - JsonObjectBuilder result = Json.createObjectBuilder() + JsonObjectBuilder result = JsonUtil.createObjectBuilder() .add("Total number of files", totalNumberofFiles) .add("Number of files successfully replaced", successNumberofFiles); - return Response.ok().entity(Json.createObjectBuilder() + return Response.ok().entity(JsonUtil.createObjectBuilder() .add("status", ApiConstants.STATUS_OK) - .add("data", Json.createObjectBuilder().add("Files", jarr).add("Result", result)).build() ).build(); + .add("data", JsonUtil.createObjectBuilder().add("Files", jarr).add("Result", result)).build() ).build(); } protected static Response error(Response.Status sts, String msg ) { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractSubmitToArchiveCommand.java index e6f87e73940..766bfc1b865 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/AbstractSubmitToArchiveCommand.java @@ -20,6 +20,7 @@ import edu.harvard.iq.dataverse.util.ListSplitUtil; import edu.harvard.iq.dataverse.util.bagit.BagGenerator; import edu.harvard.iq.dataverse.util.bagit.OREMap; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.workflow.step.Failure; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; @@ -83,7 +84,7 @@ public DatasetVersion execute(CommandContext ctxt) throws CommandException { token = ctxt.authentication().generateApiTokenForUser(user); } if (!preconditionsMet(version, token, requestedSettings)) { - JsonObjectBuilder statusObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder statusObjectBuilder = JsonUtil.createObjectBuilder(); statusObjectBuilder.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObjectBuilder.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Successful archiving of earlier versions is required."); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java index 1a49a68b097..e55667ee211 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DRSSubmitToArchiveCommand.java @@ -42,7 +42,6 @@ import jakarta.ejb.TransactionAttribute; import jakarta.ejb.TransactionAttributeType; -import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonValue; @@ -64,6 +63,8 @@ import com.auth0.jwt.JWT; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTCreationException; +import org.omnifaces.util.Json; + import static edu.harvard.iq.dataverse.settings.SettingsServiceBean.Key.DRSArchiverConfig; @RequiredPermissions(Permission.PublishDataset) @@ -142,7 +143,7 @@ public DatasetVersion execute(CommandContext ctxt) throws CommandException { token = ctxt.authentication().generateApiTokenForUser(user); } if (!preconditionsMet(version, token, requestedSettings)) { - JsonObjectBuilder statusObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder statusObjectBuilder = JsonUtil.createObjectBuilder(); statusObjectBuilder.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObjectBuilder.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Successful archiving of earlier versions is required."); @@ -192,7 +193,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat WorkflowStepResult s3Result = super.performArchiveSubmission(dv, dataciteXml, ore, terms, token, requestedSettings); - JsonObjectBuilder statusObject = Json.createObjectBuilder(); + JsonObjectBuilder statusObject = JsonUtil.createObjectBuilder(); statusObject.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObject.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Bag not transferred"); @@ -204,7 +205,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat // Now contact DRS boolean trustCert = drsConfigObject.getBoolean(TRUST_CERT, false); int jwtTimeout = drsConfigObject.getInt(TIMEOUT, 5); - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(S3_BUCKET_NAME, adminMetadata.getString(S3_BUCKET_NAME)); @@ -212,7 +213,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat job.add(S3_PATH, spaceName); // We start with the default admin_metadata - JsonObjectBuilder amob = Json.createObjectBuilder(adminMetadata); + JsonObjectBuilder amob = JsonUtil.createObjectBuilder(adminMetadata); // Remove collections and then override any params for the given alias amob.remove(COLLECTIONS); // Allow override of bucket name @@ -295,7 +296,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat String status = responseObject.getString(DatasetVersion.ARCHIVAL_STATUS); if (status.equals(DatasetVersion.ARCHIVAL_STATUS_PENDING) || status.equals(DatasetVersion.ARCHIVAL_STATUS_FAILURE) || status.equals(DatasetVersion.ARCHIVAL_STATUS_SUCCESS)) { - statusObject.addAll(Json.createObjectBuilder(responseObject)); + statusObject.addAll(JsonUtil.createObjectBuilder(responseObject)); switch (status) { case DatasetVersion.ARCHIVAL_STATUS_PENDING: logger.info("DRS Ingest successfully started for: " + packageId + " : " diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java index 57a4a68a44a..e87a228d4e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/DuraCloudSubmitToArchiveCommand.java @@ -12,6 +12,7 @@ import edu.harvard.iq.dataverse.util.bagit.BagGenerator; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.workflow.step.Failure; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; @@ -97,7 +98,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat ContentStore store; // Set a failure status that will be updated if we succeed - JsonObjectBuilder statusObject = Json.createObjectBuilder(); + JsonObjectBuilder statusObject = JsonUtil.createObjectBuilder(); statusObject.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObject.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Bag not transferred"); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetDatasetReviewsCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetDatasetReviewsCommand.java index 582b890777e..4e4a05db368 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetDatasetReviewsCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetDatasetReviewsCommand.java @@ -20,6 +20,7 @@ import edu.harvard.iq.dataverse.search.SolrQueryResponse; import edu.harvard.iq.dataverse.search.SolrSearchResult; import edu.harvard.iq.dataverse.search.SortBy; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; @@ -39,7 +40,7 @@ public GetDatasetReviewsCommand(DataverseRequest request, Dataset target) { @Override public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { - JsonObjectBuilder reviews = Json.createObjectBuilder(); + JsonObjectBuilder reviews = JsonUtil.createObjectBuilder(); List dataverses = new ArrayList<>(); // Putting PID as URL in quotes to avoid hits we don't want String query = "itemReviewedUrl:\"" + dataset.getGlobalId().asURL() + "\""; @@ -56,7 +57,7 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { SolrQueryResponse solrQueryResponse = ctxt.search().getDefaultSearchService().search(getRequest(), dataverses, query, filterQueries, sortField, sortOrder, paginationStart, dataRelatedToMe, numResultsPerPage); - JsonArrayBuilder itemsArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder itemsArrayBuilder = JsonUtil.createArrayBuilder(); List solrSearchResults = solrQueryResponse.getSolrSearchResults(); for (SolrSearchResult solrSearchResult : solrSearchResults) { // Construct a JSON object intentionally rather than simply returning the @@ -84,19 +85,19 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { String datePublished = searchResultObject.getString("published_at", ""); String description = searchResultObject.getString("description"); JsonObject rubricMetadataBlocksFromSolr = searchResultObject.getJsonObject("metadataBlocks"); - JsonArrayBuilder rubricMetadataBlocks = Json.createArrayBuilder(); + JsonArrayBuilder rubricMetadataBlocks = JsonUtil.createArrayBuilder(); for (String key : rubricMetadataBlocksFromSolr.keySet()) { String displayName = rubricMetadataBlocksFromSolr.getJsonObject(key).getString("displayName"); JsonArray fieldsFromJson = rubricMetadataBlocksFromSolr.getJsonObject(key).getJsonArray("fields"); - JsonObjectBuilder block = Json.createObjectBuilder(); + JsonObjectBuilder block = JsonUtil.createObjectBuilder(); block.add("name", key); block.add("displayName", displayName); - JsonArrayBuilder fieldAccumulator = Json.createArrayBuilder(); + JsonArrayBuilder fieldAccumulator = JsonUtil.createArrayBuilder(); for (JsonValue fieldJsonValue : fieldsFromJson) { JsonObject fieldObject = fieldJsonValue.asJsonObject(); String typeName = fieldObject.getString("typeName"); String value = fieldObject.getString("value"); - JsonObjectBuilder fieldToAdd = Json.createObjectBuilder(); + JsonObjectBuilder fieldToAdd = JsonUtil.createObjectBuilder(); fieldToAdd.add("typeName", typeName); fieldToAdd.add("value", value); fieldAccumulator.add(fieldToAdd); @@ -104,7 +105,7 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { block.add("fields", fieldAccumulator); rubricMetadataBlocks.add(block); } - JsonObjectBuilder review = Json.createObjectBuilder() + JsonObjectBuilder review = JsonUtil.createObjectBuilder() .add("title", title) .add("authors", authors) .add("persistentId", pid) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java index df0b5d785e4..5e890ebee90 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GetUserTracesCommand.java @@ -16,6 +16,7 @@ import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.exception.PermissionException; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import java.util.List; @@ -52,14 +53,14 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { throw new CommandException("Cannot get traces. User not found.", this); } Long userId = user.getId(); - JsonObjectBuilder traces = Json.createObjectBuilder(); + JsonObjectBuilder traces = JsonUtil.createObjectBuilder(); if (element == null || element.equals("roleAssignments")) { // List roleAssignments = // ctxt.permissions().getDvObjectsUserHasRoleOn(user); List roleAssignments = ctxt.roleAssignees().getAssignmentsFor(user.getIdentifier()); if (roleAssignments != null && !roleAssignments.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (RoleAssignment roleAssignment : roleAssignments) { jab.add(NullSafeJsonBuilder.jsonObjectBuilder() .add("id", roleAssignment.getId()) @@ -77,10 +78,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("dataverseCreator")) { List dataversesCreated = ctxt.dataverses().findByCreatorId(userId); if (dataversesCreated != null && !dataversesCreated.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Dataverse dataverse : dataversesCreated) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", dataverse.getId()) .add("alias", dataverse.getAlias())); } @@ -92,10 +93,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("dataversePublisher")) { List dataversesPublished = ctxt.dataverses().findByReleaseUserId(userId); if (dataversesPublished != null && !dataversesPublished.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Dataverse dataverse : dataversesPublished) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", dataverse.getId()) .add("alias", dataverse.getAlias())); } @@ -107,10 +108,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("datasetCreator")) { List datasetsCreated = ctxt.datasets().findByCreatorId(userId); if (datasetsCreated != null && !datasetsCreated.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Dataset dataset : datasetsCreated) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", dataset.getId()) .add("pid", dataset.getGlobalId().asString())); } @@ -122,10 +123,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("datasetPublisher")) { List datasetsPublished = ctxt.datasets().findByReleaseUserId(userId); if (datasetsPublished != null && !datasetsPublished.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Dataset dataset : datasetsPublished) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", dataset.getId()) .add("pid", dataset.getGlobalId().asString())); } @@ -137,10 +138,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("dataFileCreator")) { List dataFilesCreated = ctxt.files().findByCreatorId(userId); if (dataFilesCreated != null && !dataFilesCreated.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (DataFile dataFile : dataFilesCreated) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", dataFile.getId()) .add("filename", dataFile.getCurrentName()) .add("datasetPid", dataFile.getOwner().getGlobalId().asString())); @@ -155,10 +156,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { // for files. List dataFilesPublished = ctxt.files().findByReleaseUserId(userId); if (dataFilesPublished != null && !dataFilesPublished.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (DataFile dataFile : dataFilesPublished) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", dataFile.getId()) .add("filename", dataFile.getCurrentName()) .add("datasetPid", dataFile.getOwner().getGlobalId().asString())); @@ -172,10 +173,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { // These are the users who have published a version (or created a draft). List datasetVersionUsers = ctxt.datasetVersion().getDatasetVersionUsersByAuthenticatedUser(user); if (datasetVersionUsers != null && !datasetVersionUsers.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (DatasetVersionUser datasetVersionUser : datasetVersionUsers) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", datasetVersionUser.getId()) .add("dataset", datasetVersionUser.getDatasetVersion().getDataset().getGlobalId().asString()) .add("version", datasetVersionUser.getDatasetVersion().getSemanticVersion())); @@ -188,10 +189,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("explicitGroups")) { Set explicitGroups = ctxt.explicitGroups().findDirectlyContainingGroups(user); if (explicitGroups != null && !explicitGroups.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (ExplicitGroup explicitGroup : explicitGroups) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", explicitGroup.getId()) .add("name", explicitGroup.getDisplayName())); } @@ -203,14 +204,14 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("guestbookEntries")) { List guestbookResponses = ctxt.responses().findByAuthenticatedUserId(user); if (guestbookResponses != null && !guestbookResponses.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); // The feeling is that this is too much detail for the call for all elements so // we only show a count in that case. if (element != null) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (GuestbookResponse guestbookResponse : guestbookResponses) { try { - JsonObjectBuilder gbe = Json.createObjectBuilder() + JsonObjectBuilder gbe = JsonUtil.createObjectBuilder() .add("id", guestbookResponse.getId()) .add("eventType", guestbookResponse.getEventType()) .add("filename", guestbookResponse.getDataFile().getCurrentName()) @@ -238,10 +239,10 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { if (element == null || element.equals("savedSearches")) { List savedSearchs = ctxt.savedSearches().findByAuthenticatedUser(user); if (savedSearchs != null && !savedSearchs.isEmpty()) { - JsonObjectBuilder job = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (SavedSearch savedSearch : savedSearchs) { - jab.add(Json.createObjectBuilder() + jab.add(JsonUtil.createObjectBuilder() .add("id", savedSearch.getId())); } job.add("count", savedSearchs.size()); @@ -249,8 +250,8 @@ public JsonObjectBuilder execute(CommandContext ctxt) throws CommandException { traces.add("savedSearches", job); } } - JsonObjectBuilder result = Json.createObjectBuilder(); - result.add("user", Json.createObjectBuilder() + JsonObjectBuilder result = JsonUtil.createObjectBuilder(); + result.add("user", JsonUtil.createObjectBuilder() .add("identifier", user.getIdentifier()) .add("name", user.getName())); result.add("traces", traces); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java index 43769dbdb49..b47828f309f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/GoogleCloudSubmitToArchiveCommand.java @@ -18,6 +18,7 @@ import edu.harvard.iq.dataverse.util.bagit.BagGenerator; import edu.harvard.iq.dataverse.util.bagit.BagGenerator.FileEntry; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.workflow.step.Failure; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; import org.apache.commons.codec.binary.Hex; @@ -70,7 +71,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat if (bucketName != null && projectName != null) { Storage storage; // Set a failure status that will be updated if we succeed - JsonObjectBuilder statusObject = Json.createObjectBuilder(); + JsonObjectBuilder statusObject = JsonUtil.createObjectBuilder(); statusObject.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObject.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Bag not transferred"); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java index a594ac02cfb..7176b6e3a49 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/LocalSubmitToArchiveCommand.java @@ -11,6 +11,7 @@ import edu.harvard.iq.dataverse.util.bagit.BagGenerator; import edu.harvard.iq.dataverse.util.bagit.BagGenerator.FileEntry; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.workflow.step.Failure; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; @@ -53,7 +54,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat String zipName = null; // Set a failure status that will be updated if we succeed - JsonObjectBuilder statusObject = Json.createObjectBuilder(); + JsonObjectBuilder statusObject = JsonUtil.createObjectBuilder(); statusObject.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObject.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Bag not transferred"); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java index 17be53a458f..487f4af6a23 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/S3SubmitToArchiveCommand.java @@ -108,7 +108,7 @@ public WorkflowStepResult performArchiveSubmission(DatasetVersion dv, String dat createClient(configObject); // Set a failure status that will be updated if we succeed - JsonObjectBuilder statusObject = Json.createObjectBuilder(); + JsonObjectBuilder statusObject = JsonUtil.createObjectBuilder(); statusObject.add(DatasetVersion.ARCHIVAL_STATUS, DatasetVersion.ARCHIVAL_STATUS_FAILURE); statusObject.add(DatasetVersion.ARCHIVAL_STATUS_MESSAGE, "Bag not transferred"); ExecutorService executor = Executors.newCachedThreadPool(); diff --git a/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java b/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java index f0d77eb8b52..6c834cbd53b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/InternalExportDataProvider.java @@ -73,7 +73,7 @@ public String getDataCiteXml() { @Override public JsonArray getDatasetFileDetails() { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (FileMetadata fileMetadata : dv.getFileMetadatas()) { DataFile dataFile = fileMetadata.getDataFile(); jab.add(JsonPrinter.json(dataFile, fileMetadata, true)); diff --git a/src/main/java/edu/harvard/iq/dataverse/export/croissant/CroissantExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/croissant/CroissantExportUtil.java index 33189054b8c..d2ed834f9ef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/croissant/CroissantExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/croissant/CroissantExportUtil.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.export.croissant; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import io.gdcc.spi.export.ExportDataProvider; import io.gdcc.spi.export.ExportException; import jakarta.json.Json; @@ -28,7 +29,7 @@ public static void exportDataset( throws ExportException { try { // Start building the output format. - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); String contextString = """ { @@ -154,12 +155,12 @@ public static void exportDataset( } } - JsonArrayBuilder distribution = Json.createArrayBuilder(); - JsonArrayBuilder recordSet = Json.createArrayBuilder(); + JsonArrayBuilder distribution = JsonUtil.createArrayBuilder(); + JsonArrayBuilder recordSet = JsonUtil.createArrayBuilder(); JsonArray datasetFileDetails = dataProvider.getDatasetFileDetails(); for (JsonValue jsonValue : datasetFileDetails) { - JsonObjectBuilder recordSetContent = Json.createObjectBuilder(); + JsonObjectBuilder recordSetContent = JsonUtil.createObjectBuilder(); recordSetContent.add("@type", "cr:RecordSet"); JsonObject fileDetails = jsonValue.asJsonObject(); /** @@ -238,7 +239,7 @@ public static void exportDataset( } distribution.add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("@type", "cr:FileObject") .add("@id", fileId) .add("name", filename) @@ -266,15 +267,15 @@ public static void exportDataset( int caseQuantity = dataTableObject.getInt("caseQuantity"); recordSetContent.add( "cr:annotation", - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("@type", "cr:Field") .add("name", fileId.toString() + "/count") .add("value", caseQuantity) .add("dataType", "http://www.wikidata.org/entity/Q4049983")); JsonArray dataVariables = dataTableObject.getJsonArray("dataVariables"); - JsonArrayBuilder fieldSetArray = Json.createArrayBuilder(); + JsonArrayBuilder fieldSetArray = JsonUtil.createArrayBuilder(); for (JsonValue dataVariableValue : dataVariables) { - JsonObjectBuilder fieldSetObject = Json.createObjectBuilder(); + JsonObjectBuilder fieldSetObject = JsonUtil.createObjectBuilder(); fieldSetObject.add("@type", "cr:RecordSet"); JsonObject dataVariableObject = dataVariableValue.asJsonObject(); // TODO: should this be an integer? @@ -305,12 +306,12 @@ public static void exportDataset( default: break; } - JsonArrayBuilder annotationsBuilder = Json.createArrayBuilder(); + JsonArrayBuilder annotationsBuilder = JsonUtil.createArrayBuilder(); if (variableSummaryStatistics != null) { // Same order as upstream: MEAN, MEDN, MODE, MIN, MAX, STDEV, VALD, INVD annotationsBuilder .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() // We're aware that an @id of // "data/stata13-auto.dta/price/mean" // looks nice but won't validate if there's @@ -333,7 +334,7 @@ public static void exportDataset( "mean")) .add("dataType", "ddi-stats:7975ed0")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -347,7 +348,7 @@ public static void exportDataset( .add("dataType", "ddi-stats:66851a3") .add("equivalentProperty", "sc:median")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -360,7 +361,7 @@ public static void exportDataset( "mode")) .add("dataType", "ddi-stats:650be61")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -374,7 +375,7 @@ public static void exportDataset( .add("dataType", "ddi-stats:a1d0ec6") .add("equivalentProperty", "sc:minValue")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -388,7 +389,7 @@ public static void exportDataset( .add("dataType", "ddi-stats:8321e79") .add("equivalentProperty", "sc:maxValue")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -401,7 +402,7 @@ public static void exportDataset( "stdev")) .add("dataType", "ddi-stats:690ab50")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -414,7 +415,7 @@ public static void exportDataset( "vald")) .add("dataType", "ddi-stats:c646dd8")) .add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "@id", fileId.toString() @@ -428,22 +429,22 @@ public static void exportDataset( .add("dataType", "ddi-stats:6459c62")); } JsonObjectBuilder fieldBuilder = - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("@type", "cr:Field") .add("name", variableName) .add("description", variableDescription) .add("dataType", dataType) .add( "source", - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("@id", variableId.toString()) .add( "fileObject", - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("@id", fileId)) .add( "extract", - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add( "column", variableName))); @@ -598,25 +599,25 @@ private static String getNumericType(String variableIntervalType) { // ] // }] public static JsonObjectBuilder getReviews(JsonObjectBuilder reviewsIn) { - JsonObjectBuilder reviewsOut = Json.createObjectBuilder(); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonObjectBuilder reviewsOut = JsonUtil.createObjectBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); JsonArray reviews = reviewsIn.build().getJsonArray("reviews"); for (JsonValue jsonValue : reviews) { JsonObject jsonObject = (JsonObject) jsonValue; String title = jsonObject.getString("title"); JsonArray authors = jsonObject.getJsonArray("authors"); - JsonArrayBuilder creators = Json.createArrayBuilder(); + JsonArrayBuilder creators = JsonUtil.createArrayBuilder(); for (JsonValue author : authors) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); // TODO add @type for "Person" or "Organization" job.add("name", author); creators.add(job); } String datePublished = jsonObject.getString("datePublished"); - JsonObjectBuilder positiveNotesObj = Json.createObjectBuilder(); + JsonObjectBuilder positiveNotesObj = JsonUtil.createObjectBuilder(); positiveNotesObj.add("@type", "ItemList"); - JsonArrayBuilder positiveNotesArray = Json.createArrayBuilder(); + JsonArrayBuilder positiveNotesArray = JsonUtil.createArrayBuilder(); JsonArray rubricMetadataBlocks = jsonObject.getJsonArray("rubricMetadataBlocks"); for (JsonValue rmb : rubricMetadataBlocks) { JsonObject rubricMetadataBlock = rmb.asJsonObject(); @@ -627,10 +628,10 @@ public static JsonObjectBuilder getReviews(JsonObjectBuilder reviewsIn) { String value = field.getString("value"); // Flatten all positive notes into a single array, regardless of which block // they came from. - positiveNotesArray.add(Json.createObjectBuilder() + positiveNotesArray.add(JsonUtil.createObjectBuilder() .add("@type", "StructuredValue") .add("name", typeName) - .add("value", Json.createObjectBuilder() + .add("value", JsonUtil.createObjectBuilder() .add("@type", StringUtils.isNumeric(value) ? "QuantitativeValue" : "QualitativeValue") // We are aware that the value might be "Low", which is a bit strange for a positive note! We are constrained by what's allowed by https://schema.org/CriticReview .add("value", value))); @@ -638,12 +639,12 @@ public static JsonObjectBuilder getReviews(JsonObjectBuilder reviewsIn) { } positiveNotesObj.add("itemListElement", positiveNotesArray); jab.add( - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("@context", "https://schema.org/") .add("@type", "CriticReview") .add( "itemReviewed", - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() // TODO don't hard code this to "Dataset" .add("@type", "Dataset") .add("name", title)) diff --git a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java index 5ec551ba7c1..c20178a23e0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java +++ b/src/main/java/edu/harvard/iq/dataverse/externaltools/ExternalTool.java @@ -296,14 +296,14 @@ public void setContentType(String contentType) { } public JsonObjectBuilder toJson() { - JsonObjectBuilder jab = Json.createObjectBuilder(); + JsonObjectBuilder jab = JsonUtil.createObjectBuilder(); jab.add("id", getId()); jab.add(DISPLAY_NAME, getDisplayName()); if (getToolName() != null) { jab.add(TOOL_NAME, getToolName()); } jab.add(DESCRIPTION, getDescription()); - JsonArrayBuilder types = Json.createArrayBuilder(); + JsonArrayBuilder types = JsonUtil.createArrayBuilder(); for (ExternalToolType externalToolType : externalToolTypes) { types.add(externalToolType.getType().text); } diff --git a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java index 789e0883a7c..f204dd1f156 100644 --- a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java @@ -225,7 +225,7 @@ public JsonObject requestAccessiblePaths(String principal, Dataset dataset, int permissions.setPath(endpoint.getBasePath() + "/"); permissions.setPermissions("rw"); - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); //Try to create the directory (202 status) if it does not exist (502-already exists) int mkDirStatus = makeDirs(endpoint, dataset); if (!(mkDirStatus== 202 || mkDirStatus == 502)) { @@ -259,7 +259,7 @@ public JsonObject requestAccessiblePaths(String principal, Dataset dataset, int response.add("status", requestPermStatus); if (requestPermStatus == 201) { String driverId = dataset.getEffectiveStorageDriverId(); - JsonObjectBuilder paths = Json.createObjectBuilder(); + JsonObjectBuilder paths = JsonUtil.createObjectBuilder(); for (int i = 0; i < numberOfPaths; i++) { String storageIdentifier = DataAccess.getNewStorageIdentifier(driverId); int lastIndex = Math.max(storageIdentifier.lastIndexOf("/"), storageIdentifier.lastIndexOf(":")); @@ -431,7 +431,7 @@ public JsonObject requestReferenceFileIdentifiers(Dataset dataset, JsonArray ref String driverId = dataset.getEffectiveStorageDriverId(); JsonArray endpoints = GlobusAccessibleStore.getReferenceEndpointsWithPaths(driverId); - JsonObjectBuilder fileMap = Json.createObjectBuilder(); + JsonObjectBuilder fileMap = JsonUtil.createObjectBuilder(); referencedFiles.forEach(value -> { if (value.getValueType() != ValueType.STRING) { throw new JsonParsingException("ReferencedFiles must be strings", null); @@ -1125,7 +1125,7 @@ private void processUploadedFiles(JsonArray filesJsonArray, Dataset dataset, Aut JsonArray newfilesJsonArray = newfilesJsonObject.getJsonArray("files"); logger.fine("Size: " + newfilesJsonArray.size()); logger.fine("Val: " + JsonUtil.prettyPrint(newfilesJsonArray.getJsonObject(0))); - JsonArrayBuilder addFilesJsonData = Json.createArrayBuilder(); + JsonArrayBuilder addFilesJsonData = JsonUtil.createArrayBuilder(); for (JsonObject fileJsonObject : filesJsonArray.getValuesAs(JsonObject.class)) { @@ -1158,7 +1158,7 @@ private void processUploadedFiles(JsonArray filesJsonArray, Dataset dataset, Aut Long uploadedFileSize = fileSizeMap.get(fileId); myLogger.info("Found size for file " + fileId + ": " + uploadedFileSize + " bytes"); patch = Json.createPatchBuilder() - .add("/fileSize", Json.createValue(uploadedFileSize)).build(); + .add("/fileSize", JsonUtil.createValue(uploadedFileSize)).build(); fileJsonObject = patch.apply(fileJsonObject); } else { logger.fine("No file size entry found for file "+fileId); @@ -1478,7 +1478,7 @@ private JsonObject calculateMissingMetadataFields(List inputList, Logger JsonArrayBuilder filesObject = (JsonArrayBuilder) completableFuture.get(); - JsonObject output = Json.createObjectBuilder().add("files", filesObject).build(); + JsonObject output = JsonUtil.createObjectBuilder().add("files", filesObject).build(); return output; @@ -1736,7 +1736,7 @@ public void processCompletedTask(GlobusTaskInProgress globusTask, return; } - JsonArrayBuilder filesJsonArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder filesJsonArrayBuilder = JsonUtil.createArrayBuilder(); for (ExternalFileUploadInProgress pendingFile : fileUploadsInProgress) { String jsonInfoString = pendingFile.getFileInfo(); diff --git a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusUtil.java b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusUtil.java index c9bb7fb6c4e..35932d4fe99 100644 --- a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusUtil.java @@ -6,6 +6,7 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.dataaccess.GlobusAccessibleStore; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; @@ -13,7 +14,7 @@ public class GlobusUtil { public static JsonObject getFilesMap(List dataFiles, Dataset d) { - JsonObjectBuilder filesBuilder = Json.createObjectBuilder(); + JsonObjectBuilder filesBuilder = JsonUtil.createObjectBuilder(); for (DataFile df : dataFiles) { String storageId = df.getStorageIdentifier(); String[] parts = DataAccess diff --git a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java index c074cb5918f..a2bb820bf60 100644 --- a/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java +++ b/src/main/java/edu/harvard/iq/dataverse/locality/StorageSite.java @@ -2,6 +2,8 @@ import java.io.Serializable; import java.util.Objects; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import jakarta.persistence.Column; @@ -125,7 +127,7 @@ public boolean equals(Object object) { } public JsonObjectBuilder toJsonObjectBuilder() { - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add(ID, id) .add(HOSTNAME, hostname) .add(NAME, name) diff --git a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java index 9090ef05918..f40aa9352b4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsServiceBean.java @@ -23,6 +23,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; import jakarta.json.Json; @@ -369,14 +371,14 @@ public JsonArray filesByType(Dataverse d) { + " WHERE dv.versionstate = 'RELEASED' " + ((d == null) ? "" : "AND ob.owner_id in (" + getCommaSeparatedIdStringForSubtree(d, "Dataset") + ") ") + "GROUP BY df.contenttype;"); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); try { List results = query.getResultList(); for (Object[] result : results) { if((BigDecimal)result[2]==BigDecimal.ZERO) { logger.warning("File(s) of type " + (String) result[0] + " are reported as having 0 total size"); } - JsonObject stats = Json.createObjectBuilder().add(MetricsUtil.CONTENTTYPE, (String) result[0]).add(MetricsUtil.COUNT, (long) result[1]).add(MetricsUtil.SIZE, (BigDecimal) result[2]).build(); + JsonObject stats = JsonUtil.createObjectBuilder().add(MetricsUtil.CONTENTTYPE, (String) result[0]).add(MetricsUtil.COUNT, (long) result[1]).add(MetricsUtil.SIZE, (BigDecimal) result[2]).build(); jab.add(stats); } @@ -509,11 +511,11 @@ public JsonArray fileDownloads(String yyyymm, Dataverse d, boolean uniqueCounts) + "group by gb.datafile_id, ob.id, ob.protocol, ob.authority, ob.identifier order by count desc;"); logger.log(Level.FINE, "Metric query: {0}", query); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); try { List results = query.getResultList(); for (Object[] result : results) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(MetricsUtil.ID, (int) result[0]); if(result[1]!=null) { job.add(MetricsUtil.PID, (String) result[1]); @@ -552,11 +554,11 @@ public JsonArray uniqueDatasetDownloads(String yyyymm, Dataverse d) { + " and date_trunc('month', responsetime) <= to_date('" + yyyymm + "','YYYY-MM')\n" + "and eventtype!='" + GuestbookResponse.ACCESS_REQUEST +"'\n" + "group by gb.dataset_id, ob.protocol, ob.authority, ob.identifier order by count(distinct email) desc;"); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); try { List results = query.getResultList(); for (Object[] result : results) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(MetricsUtil.PID, (String) result[0]); job.add(MetricsUtil.COUNT, (long) result[1]); jab.add(job); @@ -643,7 +645,7 @@ public JsonObject getMDCDatasetMetrics(MetricType metricType, String yyyymm, Str // if(sum==null) { // sum = BigDecimal.ZERO; // } - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(metricType.toString(), sum.longValue()); return job.build(); } @@ -858,7 +860,7 @@ public JsonObject getDataverseTree(Dataverse d, String yyyymm, DatasetVersion.Ve int depth = (int) result[1]; long ownerId = (long) result[4]; long id = (int) result[0]; - JsonObjectBuilder node = Json.createObjectBuilder() + JsonObjectBuilder node = JsonUtil.createObjectBuilder() .add("id", id) .add("ownerId", ownerId) .add("alias", (String) result[2]) @@ -869,7 +871,7 @@ public JsonObject getDataverseTree(Dataverse d, String yyyymm, DatasetVersion.Ve if (children != null) { subtrees.put(currentOwnerId, children.build()); } - children = Json.createArrayBuilder(); + children = JsonUtil.createArrayBuilder(); currentOwnerId = ownerId; } if (subtrees.containsKey(id)) { diff --git a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java index 7d968e7e5c1..9e334a44dc6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/metrics/MetricsUtil.java @@ -43,15 +43,15 @@ public class MetricsUtil { private MetricsUtil() {} public static JsonObjectBuilder countToJson(long count) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(COUNT, count); return job; } public static JsonArrayBuilder dataversesByCategoryToJson(List listOfObjectArrays) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Object[] arrayOfObjects : listOfObjectArrays) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); String categoryNameUppercase = (String) arrayOfObjects[0]; Dataverse dataverse = new Dataverse(); dataverse.setDataverseType(Dataverse.DataverseType.valueOf(categoryNameUppercase)); @@ -65,9 +65,9 @@ public static JsonArrayBuilder dataversesByCategoryToJson(List listOfO } public static JsonArrayBuilder dataversesBySubjectToJson(List listOfObjectArrays) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Object[] objectArray : listOfObjectArrays) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); String subject = (String) objectArray[0]; long count = (long) objectArray[1]; job.add(SUBJECT, subject); @@ -78,9 +78,9 @@ public static JsonArrayBuilder dataversesBySubjectToJson(List listOfOb } public static JsonArrayBuilder datasetsBySubjectToJson(List listOfObjectArrays) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (Object[] objectArray : listOfObjectArrays) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); String subject = (String) objectArray[0]; long count = (long) objectArray[1]; job.add(SUBJECT, subject); @@ -95,7 +95,7 @@ public static JsonArray timeSeriesToJson(List results) { } public static JsonArray timeSeriesToJson(List results, boolean isBigDecimal) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); long total = 0; String curDate = (String) results.get(0)[0]; // Get a list of all the monthly dates from the start until now @@ -103,7 +103,7 @@ public static JsonArray timeSeriesToJson(List results, boolean isBigDe int i = 0; // Create an entry for each date for (String date : dates) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); // If there's a result for this date, add it's count to the total // and find the date of the next entry @@ -136,7 +136,7 @@ public static JsonArray timeSeriesToJson(List results, boolean isBigDe } public static JsonArray timeSeriesByTypeToJson(List results) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); Map totals = new HashMap<>(); Map sizes = new HashMap<>(); String curDate = (String) results.get(0)[0]; @@ -159,7 +159,7 @@ public static JsonArray timeSeriesByTypeToJson(List results) { } // Then add the aggregate count and size for all types for(String type: totals.keySet()) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(MetricsUtil.DATE, date); job.add(CONTENTTYPE, type); job.add(COUNT, totals.get(type)); @@ -171,7 +171,7 @@ public static JsonArray timeSeriesByTypeToJson(List results) { } public static JsonArray timeSeriesByPIDToJson(List results) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); Map totals = new HashMap<>(); String curDate = (String) results.get(0)[0]; // Get a list of all the monthly dates from the start until now @@ -191,7 +191,7 @@ public static JsonArray timeSeriesByPIDToJson(List results) { } // Then add the aggregate count and size for all types for(String type: totals.keySet()) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(MetricsUtil.DATE, date); job.add(PID, type); job.add(COUNT, totals.get(type)); @@ -202,7 +202,7 @@ public static JsonArray timeSeriesByPIDToJson(List results) { } public static JsonArray timeSeriesByIDAndPIDToJson(List results) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); Map totals = new HashMap<>(); Map pids = new HashMap<>(); String curDate = (String) results.get(0)[0]; @@ -225,7 +225,7 @@ public static JsonArray timeSeriesByIDAndPIDToJson(List results) { } // Then add the aggregate count and size for all types for(Integer id: totals.keySet()) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add(MetricsUtil.DATE, date); job.add(ID, id); if(pids.get(id)!=null) { diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java index 0bdfdb61ed7..1abfad90cb0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/DataRetrieverAPI.java @@ -24,6 +24,7 @@ import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.util.json.JsonPrinter; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.inject.Inject; import jakarta.json.Json; @@ -115,7 +116,7 @@ private String getJSONErrorString(String jsonMsg, String optionalLoggerMsg){ if (optionalLoggerMsg != null){ logger.severe(optionalLoggerMsg); } - JsonObjectBuilder jsonData = Json.createObjectBuilder(); + JsonObjectBuilder jsonData = JsonUtil.createObjectBuilder(); jsonData.add(DataRetrieverAPI.JSON_SUCCESS_FIELD_NAME, false); jsonData.add(DataRetrieverAPI.JSON_ERROR_MSG_FIELD_NAME, jsonMsg); @@ -311,12 +312,12 @@ private JsonObjectBuilder myDataAsJson(String message) { } private JsonObjectBuilder myDataAsJson(String message, Pager pager, RoleTagRetriever roleTagRetriever, List metadataFields) { - JsonObjectBuilder jsonData = Json.createObjectBuilder().add(DataRetrieverAPI.JSON_SUCCESS_FIELD_NAME, true); + JsonObjectBuilder jsonData = JsonUtil.createObjectBuilder().add(DataRetrieverAPI.JSON_SUCCESS_FIELD_NAME, true); if (message != null) { jsonData.add(DataRetrieverAPI.JSON_MSG_FIELD_NAME, message); } jsonData.add(DataRetrieverAPI.JSON_DATA_FIELD_NAME, - Json.createObjectBuilder() + JsonUtil.createObjectBuilder() .add("pagination", pager.asJsonObjectBuilderUsingCardTerms()) .add(SearchConstants.SEARCH_API_ITEMS, this.formatSolrDocs(solrQueryResponse, roleTagRetriever, metadataFields)) .add(SearchConstants.SEARCH_API_TOTAL_COUNT, solrQueryResponse.getNumResultsFound()) @@ -379,7 +380,7 @@ private JsonArrayBuilder formatSolrDocs(SolrQueryResponse solrResponse, RoleTagR throw new NullPointerException("DataRetrieverAPI.formatSolrDocs: roleTagRetriever should not be null"); } - JsonArrayBuilder jsonSolrDocsArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder jsonSolrDocsArrayBuilder = JsonUtil.createArrayBuilder(); JsonObjectBuilder myDataCardInfo; JsonArrayBuilder rolesForCard; diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java index 2acb93d37f5..3dd52a5a8f2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFilterParams.java @@ -18,6 +18,8 @@ import java.util.HashMap; import java.util.List; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObjectBuilder; @@ -317,7 +319,7 @@ public String getDvObjectTypesAsJSONString(){ */ public JsonArrayBuilder getListofSelectedPublicationStatuses(){ - JsonArrayBuilder jsonArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonArray = JsonUtil.createArrayBuilder(); for (String pubStatus : this.publicationStatuses){ jsonArray.add(pubStatus); @@ -337,7 +339,7 @@ public JsonArrayBuilder getListofSelectedValidities(){ return null; } - JsonArrayBuilder jsonArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonArray = JsonUtil.createArrayBuilder(); for (Boolean valid : this.datasetValidities){ jsonArray.add(valid); @@ -348,20 +350,20 @@ public JsonArrayBuilder getListofSelectedValidities(){ public JsonObjectBuilder getDvObjectTypesAsJSON(){ - JsonArrayBuilder jsonArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonArray = JsonUtil.createArrayBuilder(); - jsonArray.add(Json.createObjectBuilder().add("value", DvObject.DType.Dataverse.getDType()) + jsonArray.add(JsonUtil.createObjectBuilder().add("value", DvObject.DType.Dataverse.getDType()) .add("label", SearchConstants.UI_DATAVERSES) .add("selected", this.areDataversesIncluded())) - .add(Json.createObjectBuilder().add("value", DvObject.DType.Dataset.getDType()) + .add(JsonUtil.createObjectBuilder().add("value", DvObject.DType.Dataset.getDType()) .add("label", SearchConstants.UI_DATASETS) .add("selected", this.areDatasetsIncluded())) - .add(Json.createObjectBuilder().add("value", DvObject.DType.DataFile.getDType()) + .add(JsonUtil.createObjectBuilder().add("value", DvObject.DType.DataFile.getDType()) .add("label", SearchConstants.UI_FILES) .add("selected", this.areFilesIncluded()) ); - JsonObjectBuilder jsonData = Json.createObjectBuilder(); + JsonObjectBuilder jsonData = JsonUtil.createObjectBuilder(); jsonData.add(SearchFields.TYPE, jsonArray); return jsonData; diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java index 36cb38419a3..d38e520de0b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/MyDataFinder.java @@ -20,6 +20,8 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObjectBuilder; @@ -400,7 +402,7 @@ public String formatUserIdentifierAsAssigneeIdentifier(String userIdentifier){ */ public JsonObjectBuilder getSelectedFilterParamsAsJSON() { - JsonObjectBuilder jsonData = Json.createObjectBuilder(); + JsonObjectBuilder jsonData = JsonUtil.createObjectBuilder(); jsonData.add("publication_statuses", this.filterParams.getListofSelectedPublicationStatuses()) .add("role_names", this.getListofSelectedRoles()); @@ -421,7 +423,7 @@ public JsonObjectBuilder getSelectedFilterParamsAsJSON() { */ public JsonArrayBuilder getListofSelectedRoles(){ - JsonArrayBuilder jsonArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonArray = JsonUtil.createArrayBuilder(); for (Long roleId : this.filterParams.getRoleIds()){ String roleName = this.rolePermissionHelper.getRoleName(roleId); diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java b/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java index 096974b9d72..6ed03c8a731 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/Pager.java @@ -15,6 +15,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObjectBuilder; @@ -371,7 +373,7 @@ public JsonObjectBuilder asJsonObjectBuilder(){ private JsonObjectBuilder asJsonObjectBuilderCore(boolean useCardTerms){ - JsonObjectBuilder jsonPageInfo = Json.createObjectBuilder(); + JsonObjectBuilder jsonPageInfo = JsonUtil.createObjectBuilder(); jsonPageInfo.add("isNecessary", this.isPagerNecessary()) @@ -405,7 +407,7 @@ private JsonObjectBuilder asJsonObjectBuilderCore(boolean useCardTerms){ // -------------------- // pageNumberList // -------------------- - JsonArrayBuilder jsonPageNumberArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder jsonPageNumberArrayBuilder = JsonUtil.createArrayBuilder(); if (this.pageNumberList != null) { for (int pg : this.pageNumberList) { jsonPageNumberArrayBuilder.add(pg); diff --git a/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java b/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java index e328a50e962..c4f1e0e68ab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java +++ b/src/main/java/edu/harvard/iq/dataverse/mydata/RoleTagRetriever.java @@ -23,6 +23,8 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; @@ -465,7 +467,7 @@ public JsonArrayBuilder getRolesForCardAsJSON(Long dvObjectId){ return null; } - JsonArrayBuilder jsonArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonArray = JsonUtil.createArrayBuilder(); for (String roleName : this.finalIdToRolesHash.get(dvObjectId)){ jsonArray.add(roleName); diff --git a/src/main/java/edu/harvard/iq/dataverse/openapi/OpenApi.java b/src/main/java/edu/harvard/iq/dataverse/openapi/OpenApi.java index 6bd54916e0d..e09bafc270a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/openapi/OpenApi.java +++ b/src/main/java/edu/harvard/iq/dataverse/openapi/OpenApi.java @@ -6,6 +6,7 @@ import java.util.*; import java.util.logging.*; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.servlet.ServletException; @@ -66,7 +67,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se List args = Arrays.asList(format); String bundleResponse = BundleUtil.getStringFromBundle("openapi.exception.invalid.format", args); - JsonObject errorResponse = Json.createObjectBuilder() + JsonObject errorResponse = JsonUtil.createObjectBuilder() .add("status", "ERROR") .add("code", HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE) .add("message", bundleResponse) diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java index 0affd32eb99..d32fbe0c947 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java @@ -9,6 +9,7 @@ import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.util.ListSplitUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; @@ -568,7 +569,7 @@ public boolean canCreatePidsLike(GlobalId pid) { @Override public JsonObject getProviderSpecification() { - JsonObjectBuilder providerSpecification = Json.createObjectBuilder(); + JsonObjectBuilder providerSpecification = JsonUtil.createObjectBuilder(); providerSpecification.add("id", id); providerSpecification.add("label", label); providerSpecification.add("protocol", protocol); diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java index 003b4e3f61c..37fd380c7b1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/PidUtil.java @@ -17,6 +17,7 @@ import java.util.Set; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; @@ -96,13 +97,13 @@ public static JsonObjectBuilder queryDoi(GlobalId globalId, String baseUrl, Stri try { out = Json.createReader(connection.getInputStream()).readObject(); } catch (IOException ex) { - return Json.createObjectBuilder().add("response", ex.getLocalizedMessage()); + return JsonUtil.createObjectBuilder().add("response", ex.getLocalizedMessage()); } JsonObject data = out.getJsonObject("data"); String id = data.getString("id"); JsonObject attributes = data.getJsonObject("attributes"); String state = attributes.getString("state"); - JsonObjectBuilder ret = Json.createObjectBuilder().add("id", id).add("state", state); + JsonObjectBuilder ret = JsonUtil.createObjectBuilder().add("id", id).add("state", state); return ret; } catch (IllegalArgumentException ex) { throw new BadRequestException(ex.getLocalizedMessage()); @@ -281,7 +282,7 @@ public static Set getManagedProviderIds() { } public static JsonObject getProviders() { - JsonObjectBuilder builder = Json.createObjectBuilder(); + JsonObjectBuilder builder = JsonUtil.createObjectBuilder(); for (PidProvider pidProvider : providerMap.values()) { builder.add(pidProvider.getId(), pidProvider.getProviderSpecification()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java b/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java index 0d547402676..64a45ffa3e7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/repositorystorageabstractionlayer/RepositoryStorageAbstractionLayerUtil.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; @@ -88,7 +90,7 @@ public static String getDirectoryContainingTheData(Dataset dataset, boolean leaf */ @Deprecated(forRemoval = true, since = "2024-07-07") static JsonArray getStorageSitesAsJson(List storageSites) { - JsonArrayBuilder arraybuilder = Json.createArrayBuilder(); + JsonArrayBuilder arraybuilder = JsonUtil.createArrayBuilder(); if (storageSites == null || storageSites.isEmpty()) { return arraybuilder.build(); } @@ -98,7 +100,7 @@ static JsonArray getStorageSitesAsJson(List storageSites) { if (storageSite.isPrimaryStorage()) { countOfPrimarySites++; } - arraybuilder.add(Json.createObjectBuilder() + arraybuilder.add(JsonUtil.createObjectBuilder() .add("fqdn", storageSite.getHostname()) .add("name", storageSite.getName())); } diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java index 6e47d1938c1..39de4eddf26 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexBatchServiceBean.java @@ -11,6 +11,8 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.AsyncResult; import jakarta.ejb.Asynchronous; import jakarta.ejb.EJB; @@ -48,7 +50,7 @@ public class IndexBatchServiceBean { @Asynchronous public Future indexStatus() { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); logger.info("Beginning indexStatus()"); try { JsonObject contentInDatabaseButStaleInOrMissingFromSolr = getContentInDatabaseButStaleInOrMissingFromSolr().build(); @@ -77,7 +79,7 @@ public Future indexStatus() { @Asynchronous public Future clearOrphans() { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); List solrIds = new ArrayList<>(); logger.info("Beginning clearOrphans() to check for orphan Solr documents."); try { @@ -104,7 +106,7 @@ public Future clearOrphans() { @Asynchronous public Future indexAllOrSubset(long numPartitions, long partitionId, boolean skipIndexed, boolean previewOnly) { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); indexAllOrSubset(numPartitions, partitionId, skipIndexed); String status = "indexAllOrSubset has begun"; response.add("responseFromIndexAllOrSubset", status); @@ -112,13 +114,13 @@ public Future indexAllOrSubset(long numPartitions, long parti } public JsonObjectBuilder indexAllOrSubsetPreview(long numPartitions, long partitionId, boolean skipIndexed) { - JsonObjectBuilder response = Json.createObjectBuilder(); - JsonObjectBuilder previewOfWorkload = Json.createObjectBuilder(); - JsonObjectBuilder dvContainerIds = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); + JsonObjectBuilder previewOfWorkload = JsonUtil.createObjectBuilder(); + JsonObjectBuilder dvContainerIds = JsonUtil.createObjectBuilder(); List dataverseIds = dataverseService.findDataverseIdsForIndexing(skipIndexed); - JsonArrayBuilder dataverseIdsJson = Json.createArrayBuilder(); + JsonArrayBuilder dataverseIdsJson = JsonUtil.createArrayBuilder(); //List dataverses = dataverseService.findAllOrSubset(numPartitions, partitionId, skipIndexed); for (Long id : dataverseIds) { dataverseIdsJson.add(id); @@ -126,7 +128,7 @@ public JsonObjectBuilder indexAllOrSubsetPreview(long numPartitions, long partit List datasetIds = datasetService.findAllOrSubset(numPartitions, partitionId, skipIndexed); - JsonArrayBuilder datasetIdsJson = Json.createArrayBuilder(); + JsonArrayBuilder datasetIdsJson = JsonUtil.createArrayBuilder(); for (Long id : datasetIds) { datasetIdsJson.add(id); } @@ -271,15 +273,15 @@ private JsonObjectBuilder getContentInDatabaseButStaleInOrMissingFromSolr() { List stateOrMissingDataverses = indexService.findStaleOrMissingDataverses(); logger.info("checking for stale or missing datasets"); List staleOrMissingDatasets = indexService.findStaleOrMissingDatasets(); - JsonArrayBuilder jsonStaleOrMissingDataverses = Json.createArrayBuilder(); + JsonArrayBuilder jsonStaleOrMissingDataverses = JsonUtil.createArrayBuilder(); for (Long id : stateOrMissingDataverses) { jsonStaleOrMissingDataverses.add(id); } - JsonArrayBuilder datasetsInDatabaseButNotSolr = Json.createArrayBuilder(); + JsonArrayBuilder datasetsInDatabaseButNotSolr = JsonUtil.createArrayBuilder(); for (Long id : staleOrMissingDatasets) { datasetsInDatabaseButNotSolr.add(id); } - JsonObjectBuilder contentInDatabaseButStaleInOrMissingFromSolr = Json.createObjectBuilder() + JsonObjectBuilder contentInDatabaseButStaleInOrMissingFromSolr = JsonUtil.createObjectBuilder() /** * @todo What about files? Currently files are always indexed * along with their parent dataset @@ -297,20 +299,20 @@ private JsonObjectBuilder getContentInSolrButNotDatabase() throws SearchExceptio List datasetsInSolrOnly = indexService.findDatasetsInSolrOnly(); logger.info("checking for files in Solr only"); List filesInSolrOnly = indexService.findFilesInSolrOnly(); - JsonArrayBuilder dataversesInSolrButNotDatabase = Json.createArrayBuilder(); + JsonArrayBuilder dataversesInSolrButNotDatabase = JsonUtil.createArrayBuilder(); logger.info("completed check for content in Solr but not database"); for (String dataverseId : dataversesInSolrOnly) { dataversesInSolrButNotDatabase.add(dataverseId); } - JsonArrayBuilder datasetsInSolrButNotDatabase = Json.createArrayBuilder(); + JsonArrayBuilder datasetsInSolrButNotDatabase = JsonUtil.createArrayBuilder(); for (String datasetId : datasetsInSolrOnly) { datasetsInSolrButNotDatabase.add(datasetId); } - JsonArrayBuilder filesInSolrButNotDatabase = Json.createArrayBuilder(); + JsonArrayBuilder filesInSolrButNotDatabase = JsonUtil.createArrayBuilder(); for (String fileId : filesInSolrOnly) { filesInSolrButNotDatabase.add(fileId); } - JsonObjectBuilder contentInSolrButNotDatabase = Json.createObjectBuilder() + JsonObjectBuilder contentInSolrButNotDatabase = JsonUtil.createObjectBuilder() /** * @todo What about files? Currently files are always indexed * along with their parent dataset @@ -327,22 +329,22 @@ private JsonObjectBuilder getPermissionsInDatabaseButStaleInOrMissingFromSolr() logger.info("checking for permissions in database but stale or missing from Solr"); staleOrMissingPermissions = solrIndexService.findPermissionsInDatabaseButStaleInOrMissingFromSolr(); logger.info("completed checking for permissions in database but stale or missing from Solr"); - JsonArrayBuilder stalePermissionList = Json.createArrayBuilder(); + JsonArrayBuilder stalePermissionList = JsonUtil.createArrayBuilder(); for (Long dvObjectId : staleOrMissingPermissions) { stalePermissionList.add(dvObjectId); } - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add("dvobjects", stalePermissionList.build()); } private JsonObjectBuilder getPermissionsInSolrButNotDatabase() throws SearchException { List staleOrMissingPermissions = indexService.findPermissionsInSolrOnly(); - JsonArrayBuilder stalePermissionList = Json.createArrayBuilder(); + JsonArrayBuilder stalePermissionList = JsonUtil.createArrayBuilder(); for (String id : staleOrMissingPermissions) { stalePermissionList.add(id); } - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add("permissions", stalePermissionList.build()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/search/PostExternalSearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/PostExternalSearchServiceBean.java index f7e9fe5fb0f..b03941695d5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/PostExternalSearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/PostExternalSearchServiceBean.java @@ -1,5 +1,6 @@ package edu.harvard.iq.dataverse.search; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.Stateless; import jakarta.inject.Named; import jakarta.json.Json; @@ -35,7 +36,7 @@ private JsonObject prepareQuery(String query, int paginationStart, int numResult // Create JSON object with search parameters JsonObject searchParams = return NullSafeJsonBuilder.jsonObjectBuilder().add("query", query) - .add("filterQueries", Json.createArrayBuilder(filterQueries)).add("sortField", sortField) + .add("filterQueries", JsonUtil.createArrayBuilder(filterQueries)).add("sortField", sortField) .add("sortOrder", sortOrder).add("paginationStart", paginationStart) .add("onlyDataRelatedToMe", onlyDataRelatedToMe).add("numResultsPerPage", numResultsPerPage) .add("geoPoint", geoPoint).add("geoRadius", geoRadius).build(); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java index d787be684d5..b38060db1ef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java @@ -28,6 +28,7 @@ import java.util.logging.Logger; import java.util.stream.Stream; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.Asynchronous; import jakarta.ejb.EJB; import jakarta.ejb.Stateless; @@ -568,7 +569,7 @@ public IndexResponse deleteMultipleSolrIds(List solrIdsToDelete) { } public JsonObjectBuilder deleteAllFromSolrAndResetIndexTimes() throws SolrServerException, IOException { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); logger.fine("attempting to delete all Solr documents before a complete re-index"); solrClientService.getSolrClient().deleteByQuery("*:*"); int numRowsAffected = dvObjectService.clearAllIndexTimes(); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java index 8d1924feb0c..a06787537cb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrQueryResponse.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonObjectBuilder; import org.apache.solr.client.solrj.SolrQuery; @@ -122,7 +124,7 @@ public JsonObjectBuilder getMapCountsAsJSON(Map countMap){ if (countMap == null){ return null; } - JsonObjectBuilder jsonData = Json.createObjectBuilder(); + JsonObjectBuilder jsonData = JsonUtil.createObjectBuilder(); for (Map.Entry entry : countMap.entrySet()) { jsonData.add(entry.getKey(), entry.getValue()); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java index 11e2628411a..0f38698cbad 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrSearchResult.java @@ -11,6 +11,7 @@ import java.util.logging.Logger; import edu.harvard.iq.dataverse.*; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; @@ -249,7 +250,7 @@ public List getPublicationStatuses() { public JsonArrayBuilder getPublicationStatusesAsJSON() { - JsonArrayBuilder statuses = Json.createArrayBuilder(); + JsonArrayBuilder statuses = JsonUtil.createArrayBuilder(); for (String status : this.getPublicationStatuses()) { statuses.add(status); } @@ -397,13 +398,13 @@ public String toString() { } public JsonArrayBuilder getRelevance() { - JsonArrayBuilder matchedFieldsArray = Json.createArrayBuilder(); - JsonObjectBuilder matchedFieldObject = Json.createObjectBuilder(); + JsonArrayBuilder matchedFieldsArray = JsonUtil.createArrayBuilder(); + JsonObjectBuilder matchedFieldObject = JsonUtil.createObjectBuilder(); for (Map.Entry entry : highlightsMap.entrySet()) { SolrField solrField = entry.getKey(); Highlight snippets = entry.getValue(); - JsonArrayBuilder snippetArrayBuilder = Json.createArrayBuilder(); - JsonObjectBuilder matchedFieldDetails = Json.createObjectBuilder(); + JsonArrayBuilder snippetArrayBuilder = JsonUtil.createArrayBuilder(); + JsonObjectBuilder matchedFieldDetails = JsonUtil.createObjectBuilder(); for (String highlight : snippets.getSnippets()) { snippetArrayBuilder.add(highlight); } @@ -613,14 +614,14 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool DatasetVersion dv = ds.getVersionFromId(this.datasetVersionId); if (!dv.getKeywords().isEmpty()) { - JsonArrayBuilder keyWords = Json.createArrayBuilder(); + JsonArrayBuilder keyWords = JsonUtil.createArrayBuilder(); for (String keyword : dv.getKeywords()) { keyWords.add(keyword); } nullSafeJsonBuilder.add("keywords", keyWords); } - JsonArrayBuilder subjects = Json.createArrayBuilder(); + JsonArrayBuilder subjects = JsonUtil.createArrayBuilder(); for (String subject : dv.getDatasetSubjects()) { subjects.add(subject); } @@ -637,7 +638,7 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool nullSafeJsonBuilder.add("updatedAt", ds.getModificationTime()); if (!dv.getDatasetContacts().isEmpty()) { - JsonArrayBuilder contacts = Json.createArrayBuilder(); + JsonArrayBuilder contacts = JsonUtil.createArrayBuilder(); NullSafeJsonBuilder nullSafeJsonBuilderInner = jsonObjectBuilder(); for (String contact[] : dv.getDatasetContacts(false)) { nullSafeJsonBuilderInner.add("name", contact[0]); @@ -647,7 +648,7 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool nullSafeJsonBuilder.add("contacts", contacts); } if (!dv.getRelatedPublications().isEmpty()) { - JsonArrayBuilder relPub = Json.createArrayBuilder(); + JsonArrayBuilder relPub = JsonUtil.createArrayBuilder(); NullSafeJsonBuilder inner = jsonObjectBuilder(); for (DatasetRelPublication dsRelPub : dv.getRelatedPublications()) { inner.add("title", dsRelPub.getTitle()); @@ -659,14 +660,14 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool } if (!dv.getDatasetProducers().isEmpty()) { - JsonArrayBuilder producers = Json.createArrayBuilder(); + JsonArrayBuilder producers = JsonUtil.createArrayBuilder(); for (String[] producer : dv.getDatasetProducers()) { producers.add(producer[0]); } nullSafeJsonBuilder.add("producers", producers); } if (!dv.getRelatedMaterial().isEmpty()) { - JsonArrayBuilder relatedMaterials = Json.createArrayBuilder(); + JsonArrayBuilder relatedMaterials = JsonUtil.createArrayBuilder(); for (String relatedMaterial : dv.getRelatedMaterial()) { relatedMaterials.add(relatedMaterial); } @@ -674,7 +675,7 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool } if (!dv.getGeographicCoverage().isEmpty()) { - JsonArrayBuilder geoCov = Json.createArrayBuilder(); + JsonArrayBuilder geoCov = JsonUtil.createArrayBuilder(); NullSafeJsonBuilder inner = jsonObjectBuilder(); for (String ind[] : dv.getGeographicCoverage()) { inner.add("country", ind[0]); @@ -686,7 +687,7 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool nullSafeJsonBuilder.add("geographicCoverage", geoCov); } if (!dv.getDataSource().isEmpty()) { - JsonArrayBuilder dataSources = Json.createArrayBuilder(); + JsonArrayBuilder dataSources = JsonUtil.createArrayBuilder(); for (String dsource : dv.getDataSource()) { dataSources.add(dsource); } @@ -709,7 +710,7 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool } if (this.collections != null && !this.collections.isEmpty()) { - JsonArrayBuilder collections = Json.createArrayBuilder(); + JsonArrayBuilder collections = JsonUtil.createArrayBuilder(); for (Dataverse collection : this.collections) { NullSafeJsonBuilder dvBuilder = jsonObjectBuilder(); dvBuilder.add("id", collection.getId()); @@ -748,7 +749,7 @@ public JsonObjectBuilder json(boolean showRelevance, boolean showEntityIds, bool } // NullSafeJsonBuilder is awesome but can't build null safe arrays. :( if (!datasetAuthors.isEmpty()) { - JsonArrayBuilder authors = Json.createArrayBuilder(); + JsonArrayBuilder authors = JsonUtil.createArrayBuilder(); for (String datasetAuthor : datasetAuthors) { authors.add(datasetAuthor); } @@ -767,7 +768,7 @@ private void json(Map> metadataFieldMapNames, // create metadataBlock object NullSafeJsonBuilder metadataBlockBuilder = jsonObjectBuilder(); metadataBlockBuilder.add("displayName", metadataBlock.getDisplayName()); - JsonArrayBuilder fieldsArray = Json.createArrayBuilder(); + JsonArrayBuilder fieldsArray = JsonUtil.createArrayBuilder(); List datasetFields = groupedFields.get(metadataBlock); for (DatasetField datasetField : datasetFields) { @@ -1350,7 +1351,7 @@ private String getDisplayType(String type) { /* * public JsonArrayBuilder getUserRolesAsJson() { * - * JsonArrayBuilder jsonRoleStrings = Json.createArrayBuilder(); for (String role : this.getUserRole()) { jsonRoleStrings.add(role); } return + * JsonArrayBuilder jsonRoleStrings = JsonUtil.createArrayBuilder(); for (String role : this.getUserRole()) { jsonRoleStrings.add(role); } return * jsonRoleStrings; } */ public List getUserRole() { diff --git a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java index fcb423fa492..570e3939ab2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/savedsearch/SavedSearchServiceBean.java @@ -24,6 +24,7 @@ import edu.harvard.iq.dataverse.search.SolrSearchResult; import edu.harvard.iq.dataverse.search.SortBy; import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.ejb.EJB; import jakarta.ejb.Schedule; import jakarta.ejb.Stateless; @@ -151,9 +152,9 @@ public void makeLinksForAllSavedSearchesTimer() { } public JsonObjectBuilder makeLinksForAllSavedSearches(boolean debugFlag) throws SearchException, CommandException { - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); List allSavedSearches = findAll(); - JsonArrayBuilder savedSearchArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder savedSearchArrayBuilder = JsonUtil.createArrayBuilder(); for (SavedSearch savedSearch : allSavedSearches) { DataverseRequest dataverseRequest = new DataverseRequest(savedSearch.getCreator(), getHttpServletRequest()); JsonObjectBuilder perSavedSearchResponse = makeLinksForSingleSavedSearch(dataverseRequest, savedSearch, debugFlag); @@ -181,9 +182,9 @@ public JsonObjectBuilder makeLinksForAllSavedSearches(boolean debugFlag) throws public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, SavedSearch savedSearch, boolean debugFlag) throws SearchException, CommandException { logger.info("SAVED SEARCH (" + savedSearch.getId() + ") START search and link process"); Date start = new Date(); - JsonObjectBuilder response = Json.createObjectBuilder(); - JsonArrayBuilder savedSearchArrayBuilder = Json.createArrayBuilder(); - JsonArrayBuilder infoPerHit = Json.createArrayBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); + JsonArrayBuilder savedSearchArrayBuilder = JsonUtil.createArrayBuilder(); + JsonArrayBuilder infoPerHit = JsonUtil.createArrayBuilder(); SolrQueryResponse queryResponse = findHits(savedSearch); List skipList = new ArrayList(); // a list for the definition point itself and already linked objects @@ -199,7 +200,7 @@ public JsonObjectBuilder makeLinksForSingleSavedSearch(DataverseRequest dvReq, S for (SolrSearchResult solrSearchResult : queryResponse.getSolrSearchResults()) { - JsonObjectBuilder hitInfo = Json.createObjectBuilder(); + JsonObjectBuilder hitInfo = JsonUtil.createObjectBuilder(); hitInfo.add("name", solrSearchResult.getNameSort()); hitInfo.add("dvObjectId", solrSearchResult.getEntityId()); @@ -325,7 +326,7 @@ private SolrQueryResponse findHits(SavedSearch savedSearch) throws SearchExcepti } private JsonObjectBuilder getInfo(SavedSearch savedSearch, JsonArrayBuilder infoPerHit) { - JsonObjectBuilder info = Json.createObjectBuilder(); + JsonObjectBuilder info = JsonUtil.createObjectBuilder(); info.add("definitionPointAlias", savedSearch.getDefinitionPoint().getAlias()); info.add("savedSearchId", savedSearch.getId()); info.add("hitInfo", infoPerHit); @@ -333,7 +334,7 @@ private JsonObjectBuilder getInfo(SavedSearch savedSearch, JsonArrayBuilder info } private JsonObjectBuilder getDebugInfo(SavedSearch savedSearch) { - JsonObjectBuilder debug = Json.createObjectBuilder(); + JsonObjectBuilder debug = JsonUtil.createObjectBuilder(); debug.add("creatorId", savedSearch.getCreator().getId()); debug.add("query", savedSearch.getQuery()); debug.add("filterQueries", getFilterQueries(savedSearch)); @@ -341,7 +342,7 @@ private JsonObjectBuilder getDebugInfo(SavedSearch savedSearch) { } private JsonArrayBuilder getFilterQueries(SavedSearch savedSearch) { - JsonArrayBuilder filterQueriesArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder filterQueriesArrayBuilder = JsonUtil.createArrayBuilder(); for (String filterQueryToAdd : savedSearch.getFilterQueriesAsStrings()) { filterQueriesArrayBuilder.add(filterQueryToAdd); } diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java index fe607eaf55e..fa12e3d69d8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java @@ -98,6 +98,17 @@ public enum FeatureFlags { */ API_BEARER_AUTH_USE_OAUTH_USER_ON_ID_MATCH("api-bearer-auth-use-oauth-user-on-id-match"), + /** + * When creating a dataset via API, if neither a license nor any terms of use are provided, + * the system normally assigns the default license. + * + *

If this feature flag is enabled, no license is assigned (and no terms) in this case.

+ * + * @apiNote Raise flag by setting "dataverse.feature.do-not-assume-default-license" + * @since Dataverse 6.12 + */ + DO_NOT_ASSUME_DEFAULT_LICENSE("do-not-assume-default-license"), + /** * For published (public) objects, don't use a join when searching Solr. * Experimental! Requires a reindex with the following feature flag enabled, diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java b/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java index 2caefd856e2..8ed18b4c63f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/JvmSettings.java @@ -96,7 +96,6 @@ public enum JvmSettings { // API: MDC Citation updates SCOPE_API_MDC(SCOPE_API, "mdc"), API_MDC_UPDATE_MIN_DELAY_MS(SCOPE_API_MDC, "min-delay-ms"), - // SIGNPOSTING SETTINGS SCOPE_SIGNPOSTING(PREFIX, "signposting"), @@ -321,7 +320,7 @@ public enum JvmSettings { SCOPE_COARNOTIFY(SCOPE_LINKEDDATANOTIFICATION, "coar-notify"), SCOPE_COARNOTIFY_RELATIONSHIP_ANNOUNCEMENT(SCOPE_COARNOTIFY, "relationship-announcement"), COARNOTIFY_RELATIONSHIP_ANNOUNCEMENT_NOTIFY_SUPERUSERS_ONLY(SCOPE_COARNOTIFY_RELATIONSHIP_ANNOUNCEMENT, "notify-superusers-only"), - ; + ; private static final String SCOPE_SEPARATOR = "."; public static final String PLACEHOLDER_KEY = "%s"; diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index 20ee381228a..8273869f6f0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -1217,7 +1217,7 @@ public Set listAllWithoutLocalizations() { */ public JsonObject listAllAsJson() { Set settings = new HashSet<>(em.createNamedQuery("Setting.findAll", Setting.class).getResultList()); - JsonObjectBuilder response = Json.createObjectBuilder(); + JsonObjectBuilder response = JsonUtil.createObjectBuilder(); // Iterate over all the settings and add them to the response. settings.forEach(setting -> { @@ -1326,11 +1326,11 @@ public enum Op { static JsonObjectBuilder convertToJson(Map operationalDetails) { // Create a nice represenation of what happened as Json - JsonObjectBuilder jbo = Json.createObjectBuilder(); - JsonArrayBuilder created = Json.createArrayBuilder(); - JsonArrayBuilder updated = Json.createArrayBuilder(); - JsonArrayBuilder deleted = Json.createArrayBuilder(); - JsonArrayBuilder unchanged = Json.createArrayBuilder(); + JsonObjectBuilder jbo = JsonUtil.createObjectBuilder(); + JsonArrayBuilder created = JsonUtil.createArrayBuilder(); + JsonArrayBuilder updated = JsonUtil.createArrayBuilder(); + JsonArrayBuilder deleted = JsonUtil.createArrayBuilder(); + JsonArrayBuilder unchanged = JsonUtil.createArrayBuilder(); operationalDetails.forEach((setting, op) -> { String name = convertToJsonKey(setting); diff --git a/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java b/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java index 5e7f532d2ac..6ef139c12cf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java +++ b/src/main/java/edu/harvard/iq/dataverse/userdata/UserListResult.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; + +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObjectBuilder; @@ -164,7 +166,7 @@ public JsonObjectBuilder toJSON(){ } - JsonObjectBuilder jsonOverallData = Json.createObjectBuilder(); + JsonObjectBuilder jsonOverallData = JsonUtil.createObjectBuilder(); jsonOverallData.add("userCount", pager.getNumResults()) .add("selectedPage", pager.getSelectedPageNumber()) .add("pagination", pager.asJsonObjectBuilder()) @@ -182,13 +184,13 @@ private JsonArrayBuilder getUsersAsJSONArray(){ // No results..... Return count of 0 and empty array // ------------------------------------------------- if ((userList==null)||(userList.isEmpty())){ - return Json.createArrayBuilder(); // return an empty array + return JsonUtil.createArrayBuilder(); // return an empty array } // ------------------------------------------------- // We have results, format them into a JSON object // ------------------------------------------------- - JsonArrayBuilder jsonUserListArray = Json.createArrayBuilder(); + JsonArrayBuilder jsonUserListArray = JsonUtil.createArrayBuilder(); for (AuthenticatedUser oneUser : userList) { jsonUserListArray.add(oneUser.toJson()); @@ -199,11 +201,11 @@ private JsonArrayBuilder getUsersAsJSONArray(){ private JsonObjectBuilder getNoResultsJSON(){ - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add("userCount", 0) .add("selectedPage", 1) .add("bundleStrings", AuthenticatedUser.getBundleStrings()) - .add("users", Json.createArrayBuilder()); // empty array + .add("users", JsonUtil.createArrayBuilder()); // empty array } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java b/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java index 8bebcf4d438..e26549736c1 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SignpostingResources.java @@ -17,6 +17,7 @@ Two configurable options allow changing the limit for the number of authors or d import edu.harvard.iq.dataverse.*; import edu.harvard.iq.dataverse.dataset.DatasetUtil; import edu.harvard.iq.dataverse.export.ExportService; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObjectBuilder; @@ -113,7 +114,7 @@ public JsonArrayBuilder getJsonLinkset() { String licenseString = DatasetUtil.getLicenseURI(workingDatasetVersion); - JsonArrayBuilder mediaTypes = Json.createArrayBuilder(); + JsonArrayBuilder mediaTypes = JsonUtil.createArrayBuilder(); mediaTypes.add( jsonObjectBuilder().add( "href", @@ -142,13 +143,13 @@ public JsonArrayBuilder getJsonLinkset() { logger.warning("Could not look up exporter based on " + formatName + ". Exception: " + ex); } } - JsonArrayBuilder linksetJsonObj = Json.createArrayBuilder(); + JsonArrayBuilder linksetJsonObj = JsonUtil.createArrayBuilder(); JsonObjectBuilder mandatory; mandatory = jsonObjectBuilder().add("anchor", landingPage) - .add("cite-as", Json.createArrayBuilder().add(jsonObjectBuilder().add("href", ds.getPersistentURL()))) + .add("cite-as", JsonUtil.createArrayBuilder().add(jsonObjectBuilder().add("href", ds.getPersistentURL()))) .add("type", - Json.createArrayBuilder().add(jsonObjectBuilder().add("href", "https://schema.org/AboutPage")) + JsonUtil.createArrayBuilder().add(jsonObjectBuilder().add("href", "https://schema.org/AboutPage")) .add(jsonObjectBuilder().add("href", defaultFileTypeValue))); if (authors != null) { @@ -169,7 +170,7 @@ public JsonArrayBuilder getJsonLinkset() { for (FileMetadata fm : workingDatasetVersion.getFileMetadatas()) { DataFile df = fm.getDataFile(); JsonObjectBuilder itemAnchor = jsonObjectBuilder().add("anchor", getPublicDownloadUrl(df)); - itemAnchor.add("collection", Json.createArrayBuilder().add(jsonObjectBuilder() + itemAnchor.add("collection", JsonUtil.createArrayBuilder().add(jsonObjectBuilder() .add("href", landingPage))); linksetJsonObj.add(itemAnchor); } @@ -255,7 +256,7 @@ private JsonArrayBuilder getJsonAuthors(List datasetAuthorURLs) { if(datasetAuthorURLs.isEmpty()) { return null; } - JsonArrayBuilder authors = Json.createArrayBuilder(); + JsonArrayBuilder authors = JsonUtil.createArrayBuilder(); for (String authorURL : datasetAuthorURLs) { authors.add(jsonObjectBuilder().add("href", authorURL)); } @@ -281,7 +282,7 @@ private String getItems(List fms) { } private JsonArrayBuilder getJsonItems() { - JsonArrayBuilder items = Json.createArrayBuilder(); + JsonArrayBuilder items = JsonUtil.createArrayBuilder(); for (FileMetadata fm : workingDatasetVersion.getFileMetadatas()) { DataFile df = fm.getDataFile(); items.add(jsonObjectBuilder().add("href", getPublicDownloadUrl(df)).add("type", df.getContentType())); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java index 90557a530c9..5c82cba4875 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/URLTokenUtil.java @@ -121,9 +121,9 @@ public JsonValue getParam(String value) { if (tokenValue != null && !tokenValue.isBlank()) { try{ int x =Integer.parseInt(tokenValue); - return Json.createValue(x); + return JsonUtil.createValue(x); } catch (NumberFormatException nfe){ - return Json.createValue(tokenValue); + return JsonUtil.createValue(tokenValue); } } else { return null; @@ -209,10 +209,10 @@ private String getTokenValue(String value) { } public JsonObjectBuilder createPostBody(JsonObject params, JsonArray allowedApiCalls) { - JsonObjectBuilder bodyBuilder = Json.createObjectBuilder(); + JsonObjectBuilder bodyBuilder = JsonUtil.createObjectBuilder(); bodyBuilder.add("queryParameters", params); if (allowedApiCalls != null && !allowedApiCalls.isEmpty()) { - JsonArrayBuilder apisBuilder = Json.createArrayBuilder(); + JsonArrayBuilder apisBuilder = JsonUtil.createArrayBuilder(); allowedApiCalls.getValuesAs(JsonObject.class).forEach(((apiObj) -> { logger.fine(JsonUtil.prettyPrint(apiObj)); String name = apiObj.getJsonString(NAME).getString(); @@ -232,7 +232,7 @@ public JsonObjectBuilder createPostBody(JsonObject params, JsonArray allowedApiC + getApiToken().getTokenString()); } logger.fine("Signed URL: " + url); - apisBuilder.add(Json.createObjectBuilder().add(NAME, name).add(HTTP_METHOD, httpmethod) + apisBuilder.add(JsonUtil.createObjectBuilder().add(NAME, name).add(HTTP_METHOD, httpmethod) .add(SIGNED_URL, url).add(TIMEOUT, timeout)); })); bodyBuilder.add("signedUrls", apisBuilder); @@ -245,7 +245,7 @@ public JsonObject getParams(JsonObject toolParameters) { JsonArray queryParams = toolParameters.getJsonArray("queryParameters"); // ToDo return json and print later - JsonObjectBuilder paramsBuilder = Json.createObjectBuilder(); + JsonObjectBuilder paramsBuilder = JsonUtil.createObjectBuilder(); if (!(queryParams == null) && !queryParams.isEmpty()) { queryParams.getValuesAs(JsonObject.class).forEach((queryParam) -> { queryParam.keySet().forEach((key) -> { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java index 1e8fe184566..c29354d63f7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java @@ -19,6 +19,7 @@ import java.util.logging.Level; import java.util.logging.Logger; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import jakarta.json.Json; import jakarta.json.JsonArray; import jakarta.json.JsonArrayBuilder; @@ -89,16 +90,16 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { // Add namespaces we'll definitely use to Context // Additional namespaces are added as needed below - localContext.putIfAbsent(JsonLDNamespace.ore.getPrefix(), Json.createValue(JsonLDNamespace.ore.getUrl())); - localContext.putIfAbsent(JsonLDNamespace.dcterms.getPrefix(), Json.createValue(JsonLDNamespace.dcterms.getUrl())); - localContext.putIfAbsent(JsonLDNamespace.dvcore.getPrefix(), Json.createValue(JsonLDNamespace.dvcore.getUrl())); - localContext.putIfAbsent(JsonLDNamespace.schema.getPrefix(), Json.createValue(JsonLDNamespace.schema.getUrl())); + localContext.putIfAbsent(JsonLDNamespace.ore.getPrefix(), JsonUtil.createValue(JsonLDNamespace.ore.getUrl())); + localContext.putIfAbsent(JsonLDNamespace.dcterms.getPrefix(), JsonUtil.createValue(JsonLDNamespace.dcterms.getUrl())); + localContext.putIfAbsent(JsonLDNamespace.dvcore.getPrefix(), JsonUtil.createValue(JsonLDNamespace.dvcore.getUrl())); + localContext.putIfAbsent(JsonLDNamespace.schema.getPrefix(), JsonUtil.createValue(JsonLDNamespace.schema.getUrl())); Dataset dataset = version.getDataset(); String id = dataset.getGlobalId().asURL(); - JsonArrayBuilder fileArray = Json.createArrayBuilder(); + JsonArrayBuilder fileArray = JsonUtil.createArrayBuilder(); // The map describes an aggregation - JsonObjectBuilder aggBuilder = Json.createObjectBuilder(); + JsonObjectBuilder aggBuilder = JsonUtil.createObjectBuilder(); List fields = version.getDatasetFields(); // That has it's own metadata Map cvocMap = datasetFieldService.getCVocConf(true); @@ -115,7 +116,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { // Add metadata related to the Dataset/DatasetVersion aggBuilder.add("@id", id) .add("@type", - Json.createArrayBuilder().add(JsonLDTerm.ore("Aggregation").getLabel()) + JsonUtil.createArrayBuilder().add(JsonLDTerm.ore("Aggregation").getLabel()) .add(JsonLDTerm.schemaOrg("Dataset").getLabel())) .add(JsonLDTerm.schemaOrg("version").getLabel(), version.getFriendlyVersionNumber()) .add(JsonLDTerm.schemaOrg("name").getLabel(), version.getTitle()) @@ -126,7 +127,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { //Add version state info - DRAFT, RELEASED, DEACCESSIONED, ARCHIVED with extra info for DEACCESIONED VersionState vs = version.getVersionState(); if(vs.equals(VersionState.DEACCESSIONED)) { - JsonObjectBuilder deaccBuilder = Json.createObjectBuilder(); + JsonObjectBuilder deaccBuilder = JsonUtil.createObjectBuilder(); deaccBuilder.add(JsonLDTerm.schemaOrg("name").getLabel(), vs.name()); // Reason is supposed to not be null, but historically this has not been enforced (in the API) addIfNotNull(deaccBuilder, JsonLDTerm.DVCore("reason"), version.getDeaccessionNote()); @@ -152,7 +153,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { addIfNotNull(aggBuilder, JsonLDTerm.disclaimer, terms.getDisclaimer()); } // Add fileTermsofAccess as an object since it is compound - JsonObjectBuilder fAccess = Json.createObjectBuilder(); + JsonObjectBuilder fAccess = JsonUtil.createObjectBuilder(); addIfNotNull(fAccess, JsonLDTerm.termsOfAccess, terms.getTermsOfAccess()); addIfNotNull(fAccess, JsonLDTerm.fileRequestAccess, terms.isFileAccessRequest()); addIfNotNull(fAccess, JsonLDTerm.dataAccessPlace, terms.getDataAccessPlace()); @@ -177,12 +178,12 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { // The aggregation aggregates aggregatedresources (Datafiles) which each have // their own entry and metadata - JsonArrayBuilder aggResArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder aggResArrayBuilder = JsonUtil.createArrayBuilder(); if (!aggregationOnly) { for (FileMetadata fmd : version.getFileMetadatas()) { DataFile df = fmd.getDataFile(); - JsonObjectBuilder aggRes = Json.createObjectBuilder(); + JsonObjectBuilder aggRes = JsonUtil.createObjectBuilder(); if (fmd.getDescription() != null) { aggRes.add(JsonLDTerm.schemaOrg("description").getLabel(), fmd.getDescription()); @@ -220,7 +221,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { if(embargo!=null) { String date = embargo.getFormattedDateAvailable(); String reason= embargo.getReason(); - JsonObjectBuilder embargoObject = Json.createObjectBuilder(); + JsonObjectBuilder embargoObject = JsonUtil.createObjectBuilder(); embargoObject.add(JsonLDTerm.DVCore("dateAvailable").getLabel(), date); if(reason!=null) { embargoObject.add(JsonLDTerm.DVCore("reason").getLabel(), reason); @@ -231,7 +232,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { if(retention!=null) { String date = retention.getFormattedDateUnavailable(); String reason= retention.getReason(); - JsonObjectBuilder retentionObject = Json.createObjectBuilder(); + JsonObjectBuilder retentionObject = JsonUtil.createObjectBuilder(); retentionObject.add(JsonLDTerm.DVCore("dateUnavailable").getLabel(), date); if(reason!=null) { retentionObject.add(JsonLDTerm.DVCore("reason").getLabel(), reason); @@ -245,7 +246,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { if (fmd != null) { List categories = fmd.getCategoriesByName(); if (categories.size() > 0) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (String s : categories) { jab.add(s); } @@ -279,7 +280,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { JsonObject checksum = null; // Add checksum. RDA recommends SHA-512 if (df.getChecksumType() != null && df.getChecksumValue() != null) { - checksum = Json.createObjectBuilder().add("@type", df.getChecksumType().toUri()) + checksum = JsonUtil.createObjectBuilder().add("@type", df.getChecksumType().toUri()) .add("@value", df.getChecksumValue()).build(); aggRes.add(JsonLDTerm.checksum.getLabel(), checksum); } @@ -294,7 +295,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { } } // Build the '@context' object for json-ld based on the localContext entries - JsonObjectBuilder contextBuilder = Json.createObjectBuilder(); + JsonObjectBuilder contextBuilder = JsonUtil.createObjectBuilder(); for (Entry e : localContext.entrySet()) { contextBuilder.add(e.getKey(), e.getValue()); } @@ -304,14 +305,14 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { // Now create the overall map object with it's metadata //Start with a reference to the Dataverse software - JsonObjectBuilder dvSoftwareBuilder = Json.createObjectBuilder() + JsonObjectBuilder dvSoftwareBuilder = JsonUtil.createObjectBuilder() .add("@type", JsonLDTerm.schemaOrg("SoftwareApplication").getLabel()) .add(JsonLDTerm.schemaOrg("name").getLabel(), DATAVERSE_SOFTWARE_NAME) .add(JsonLDTerm.schemaOrg("version").getLabel(), systemConfig.getVersion(true)) .add(JsonLDTerm.schemaOrg("url").getLabel(), DATAVERSE_SOFTWARE_URL); //Now the OREMAP object itself - JsonObjectBuilder oremapBuilder = Json.createObjectBuilder() + JsonObjectBuilder oremapBuilder = JsonUtil.createObjectBuilder() .add(JsonLDTerm.dcTerms("modified").getLabel(), LocalDate.now().toString()) .add(JsonLDTerm.dcTerms("creator").getLabel(), BrandingUtil.getInstallationBrandName()) .add("@type", JsonLDTerm.ore("ResourceMap").getLabel()) @@ -336,7 +337,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { private JsonObjectBuilder getDataverseDescription(Dataverse dv) { //Schema.org is already in local context, no updates needed as long as we only use chemaOrg and "@id" here - JsonObjectBuilder dvjob = Json.createObjectBuilder().add(JsonLDTerm.schemaOrg("name").getLabel(), dv.getCurrentName()).add("@id", dv.getLocalURL()); + JsonObjectBuilder dvjob = JsonUtil.createObjectBuilder().add(JsonLDTerm.schemaOrg("name").getLabel(), dv.getCurrentName()).add("@id", dv.getLocalURL()); addIfNotNull(dvjob, JsonLDTerm.schemaOrg("description"), dv.getDescription()); Dataverse owner = dv.getOwner(); if(owner!=null) { @@ -380,7 +381,7 @@ private void addIfNotNull(JsonObjectBuilder builder, JsonLDTerm key, Long value) private void addToContextMap(JsonLDTerm key) { if (!key.inNamespace()) { - localContext.putIfAbsent(key.getLabel(), Json.createValue(key.getUrl())); + localContext.putIfAbsent(key.getLabel(), JsonUtil.createValue(key.getUrl())); } } @@ -425,11 +426,11 @@ public static JsonValue getJsonLDForField(DatasetField field, Boolean excludeEma JsonLDTerm fieldName = dfType.getJsonLDTerm(); if (fieldName.inNamespace()) { - localContext2.putIfAbsent(fieldName.getNamespace().getPrefix(), Json.createValue(fieldName.getNamespace().getUrl())); + localContext2.putIfAbsent(fieldName.getNamespace().getPrefix(), JsonUtil.createValue(fieldName.getNamespace().getUrl())); } else { - localContext2.putIfAbsent(fieldName.getLabel(), Json.createValue(fieldName.getUrl())); + localContext2.putIfAbsent(fieldName.getLabel(), JsonUtil.createValue(fieldName.getUrl())); } - JsonArrayBuilder vals = Json.createArrayBuilder(); + JsonArrayBuilder vals = JsonUtil.createArrayBuilder(); if (!dfType.isCompound()) { for (String val : field.getValues_nondisplay()) { if (cvocMap.containsKey(dfType.getId())) { @@ -442,7 +443,7 @@ public static JsonValue getJsonLDForField(DatasetField field, Boolean excludeEma // ToDo: Needs to be recursive (as in JsonPrinter?) for (DatasetFieldCompoundValue dscv : field.getDatasetFieldCompoundValues()) { // compound values are of different types - JsonObjectBuilder child = Json.createObjectBuilder(); + JsonObjectBuilder child = JsonUtil.createObjectBuilder(); for (DatasetField dsf : dscv.getChildDatasetFields()) { DatasetFieldType dsft = dsf.getDatasetFieldType(); @@ -461,14 +462,14 @@ public static JsonValue getJsonLDForField(DatasetField field, Boolean excludeEma // ToDo - also needs to recurse here? if (subFieldName.inNamespace()) { localContext2.putIfAbsent(subFieldName.getNamespace().getPrefix(), - Json.createValue(subFieldName.getNamespace().getUrl())); + JsonUtil.createValue(subFieldName.getNamespace().getUrl())); } else { - localContext2.putIfAbsent(subFieldName.getLabel(), Json.createValue(subFieldName.getUrl())); + localContext2.putIfAbsent(subFieldName.getLabel(), JsonUtil.createValue(subFieldName.getUrl())); } List values = dsf.getValues_nondisplay(); - JsonArrayBuilder childVals = Json.createArrayBuilder(); + JsonArrayBuilder childVals = JsonUtil.createArrayBuilder(); for (String val : dsf.getValues_nondisplay()) { logger.fine("Child name: " + dsft.getName()); @@ -506,7 +507,7 @@ private static void addCvocValue(String val, JsonArrayBuilder vals, JsonObject c } JsonObject cachedValue = datasetFieldService.getExternalVocabularyValue(val); if (cachedValue != null) { - JsonObjectBuilder job = Json.createObjectBuilder(cachedValue); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(cachedValue); job.add("@id", val); JsonObject extVal = job.build(); logger.fine("Adding: " + extVal); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/FileVersionDifferenceJsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/FileVersionDifferenceJsonPrinter.java index 44941203fc6..73ee29cd729 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/FileVersionDifferenceJsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/FileVersionDifferenceJsonPrinter.java @@ -213,7 +213,7 @@ private static String getFileAction(FileMetadata originalFileMetadata, FileMetad */ private static class GroupDataAccumulator { private JsonObject nameValue; - private JsonArrayBuilder listItems = Json.createArrayBuilder(); + private JsonArrayBuilder listItems = JsonUtil.createArrayBuilder(); private Map itemCounts = new HashMap<>(); void mergeCounts(FileVersionDifference.FileDifferenceSummaryItem item) { @@ -246,7 +246,7 @@ private String getActionFromItem(FileVersionDifference.FileDifferenceSummaryItem void reset() { nameValue = null; - listItems = Json.createArrayBuilder(); + listItems = JsonUtil.createArrayBuilder(); itemCounts.clear(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java index 242847d2e25..126f0bac83d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java @@ -70,7 +70,7 @@ public class JSONLDUtil { */ public static JsonObject getContext(Map contextMap) { - JsonObjectBuilder contextBuilder = Json.createObjectBuilder(); + JsonObjectBuilder contextBuilder = JsonUtil.createObjectBuilder(); for (Entry e : contextMap.entrySet()) { contextBuilder.add(e.getKey(), e.getValue()); } @@ -498,7 +498,7 @@ private static JsonArray getValues(JsonValue val, boolean allowMultiples, String valArray = (JsonArray) val; } } else { - valArray = Json.createArrayBuilder().add(val).build(); + valArray = JsonUtil.createArrayBuilder().add(val).build(); } return valArray; } @@ -547,7 +547,7 @@ public static JsonObject decontextualizeJsonLD(String jsonLDString) { JsonObject jsonld = jsonReader.readObject(); JsonDocument doc = JsonDocument.of(jsonld); JsonArray array = JsonLd.expand(doc).get(); - jsonld = JsonLd.compact(JsonDocument.of(array), JsonDocument.of(Json.createObjectBuilder().build())).get(); + jsonld = JsonLd.compact(JsonDocument.of(array), JsonDocument.of(JsonUtil.createObjectBuilder().build())).get(); // jsonld = array.getJsonObject(0); logger.fine("Decontextualized object: " + jsonld); return jsonld; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index 7f3db716456..2785f4113a2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -324,7 +324,7 @@ public MailDomainGroup parseMailDomainGroup(JsonObject obj) throws JsonParseExce if ( obj.containsKey("domains") ) { List domains = Optional.ofNullable(obj.getJsonArray("domains")) - .orElse(Json.createArrayBuilder().build()) + .orElse(JsonUtil.createArrayBuilder().build()) .getValuesAs(JsonString.class) .stream() .map(JsonString::getString) @@ -470,27 +470,57 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th License license = null; - try { - // This method will attempt to parse the license in the format - // in which it appears in our json exports, as a compound - // field, for ex.: - // "license": { - // "name": "CC0 1.0", - // "uri": "http://creativecommons.org/publicdomain/zero/1.0" - // } - license = parseLicense(obj.getJsonObject("license")); - } catch (ClassCastException cce) { - logger.fine("class cast exception parsing the license section (will try parsing as a string)"); - // attempt to parse as string: - // i.e. this is for backward compatibility, after the bug in #9155 - // was fixed, with the old style of encoding the license info - // in input json, for ex.: - // "license" : "CC0 1.0" - license = parseLicense(obj.getString("license", null)); + if (obj.containsKey("license")) { + try { + // This method will attempt to parse the license in the format + // in which it appears in our json exports, as a compound + // field, for ex.: + // "license": { + // "name": "CC0 1.0", + // "uri": "http://creativecommons.org/publicdomain/zero/1.0" + // } + license = parseLicense(obj.getJsonObject("license")); + } catch (ClassCastException cce) { + logger.fine("class cast exception parsing the license section (will try parsing as a string)"); + // attempt to parse as string: + // i.e. this is for backward compatibility, after the bug in #9155 + // was fixed, with the old style of encoding the license info + // in input json, for ex.: + // "license" : "CC0 1.0" + license = parseLicense(obj.getString("license", null)); + } } - - //test to see if license exists in dataset type - //if not set it to null - + + terms.setTermsOfUse(obj.getString("termsOfUse", null)); + terms.setConfidentialityDeclaration(obj.getString("confidentialityDeclaration", null)); + terms.setSpecialPermissions(obj.getString("specialPermissions", null)); + terms.setRestrictions(obj.getString("restrictions", null)); + terms.setCitationRequirements(obj.getString("citationRequirements", null)); + terms.setDepositorRequirements(obj.getString("depositorRequirements", null)); + terms.setConditions(obj.getString("conditions", null)); + terms.setDisclaimer(obj.getString("disclaimer", null)); + + if (license == null) { + // If no license was provided or the provided license was invalid, + // we check if terms were provided. + boolean termsProvided = terms.getTermsOfUse() != null + || terms.getConfidentialityDeclaration() != null + || terms.getSpecialPermissions() != null + || terms.getRestrictions() != null + || terms.getCitationRequirements() != null + || terms.getDepositorRequirements() != null + || terms.getConditions() != null + || terms.getDisclaimer() != null; + + if (!FeatureFlags.DO_NOT_ASSUME_DEFAULT_LICENSE.enabled()) { + if (!termsProvided) { + license = licenseService.getDefault(); + } + } + } + + //test to see if license exists in dataset type + //if not set it to null - //only test if Dataset has a type and if it has custom available licenses if (dsv.getDataset() != null) { DatasetType dst = dsv.getDataset().getDatasetType(); @@ -505,21 +535,9 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th license = null; } } - } - - if (license == null) { - terms.setLicense(license); - terms.setTermsOfUse(obj.getString("termsOfUse", null)); - terms.setConfidentialityDeclaration(obj.getString("confidentialityDeclaration", null)); - terms.setSpecialPermissions(obj.getString("specialPermissions", null)); - terms.setRestrictions(obj.getString("restrictions", null)); - terms.setCitationRequirements(obj.getString("citationRequirements", null)); - terms.setDepositorRequirements(obj.getString("depositorRequirements", null)); - terms.setConditions(obj.getString("conditions", null)); - terms.setDisclaimer(obj.getString("disclaimer", null)); - } else { - terms.setLicense(license); } + + terms.setLicense(license); terms.setTermsOfAccess(obj.getString("termsOfAccess", null)); terms.setDataAccessPlace(obj.getString("dataAccessPlace", null)); terms.setOriginalArchive(obj.getString("originalArchive", null)); @@ -530,6 +548,7 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th terms.setFileAccessRequest(obj.getBoolean("fileAccessRequest", false)); dsv.setTermsOfUseAndAccess(terms); terms.setDatasetVersion(dsv); + JsonObject metadataBlocks = obj.getJsonObject("metadataBlocks"); if (metadataBlocks == null){ throw new JsonParseException(BundleUtil.getStringFromBundle("jsonparser.error.metadatablocks.not.found")); @@ -700,12 +719,7 @@ public GuestbookResponse parseGuestbookResponse(JsonObject obj, GuestbookRespons private edu.harvard.iq.dataverse.license.License parseLicense(String licenseNameOrUri) throws JsonParseException { if (licenseNameOrUri == null){ - boolean safeDefaultIfKeyNotFound = true; - if (settingsService.isTrueForKey(SettingsServiceBean.Key.AllowCustomTermsOfUse, safeDefaultIfKeyNotFound)){ - return null; - } else { - return licenseService.getDefault(); - } + return null; } License license = licenseService.getByNameOrUri(licenseNameOrUri); if (license == null) throw new JsonParseException("Invalid license: " + licenseNameOrUri); @@ -714,12 +728,7 @@ private edu.harvard.iq.dataverse.license.License parseLicense(String licenseName private edu.harvard.iq.dataverse.license.License parseLicense(JsonObject licenseObj) throws JsonParseException { if (licenseObj == null){ - boolean safeDefaultIfKeyNotFound = true; - if (settingsService.isTrueForKey(SettingsServiceBean.Key.AllowCustomTermsOfUse, safeDefaultIfKeyNotFound)){ - return null; - } else { - return licenseService.getDefault(); - } + return null; } String licenseName = licenseObj.getString("name", null); 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 55247f7d2af..f2716fe20d2 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 @@ -101,7 +101,7 @@ public JsonPrinter() { public static final BriefJsonPrinter brief = new BriefJsonPrinter(); public static JsonArrayBuilder asJsonArray(Collection strings) { - JsonArrayBuilder arr = Json.createArrayBuilder(); + JsonArrayBuilder arr = JsonUtil.createArrayBuilder(); for (String s : strings) { arr.add(s); } @@ -145,7 +145,7 @@ public static JsonObjectBuilder json(FileAccessRequest fileAccessRequest) { } public static JsonArrayBuilder jsonRoleAssignments(List roleAssignments) { - JsonArrayBuilder bld = Json.createArrayBuilder(); + JsonArrayBuilder bld = JsonUtil.createArrayBuilder(); roleAssignments.forEach(roleAssignment -> bld.add(json(roleAssignment))); return bld; } @@ -172,7 +172,7 @@ public static JsonObjectBuilder json(RoleAssignment ra) { } public static JsonArrayBuilder json(Set permissions) { - JsonArrayBuilder bld = Json.createArrayBuilder(); + JsonArrayBuilder bld = JsonUtil.createArrayBuilder(); permissions.forEach(p -> bld.add(p.name())); return bld; } @@ -215,8 +215,8 @@ public static JsonObjectBuilder json(IpGroup grp) { } if ( ! ranges.isEmpty() ) { - JsonArrayBuilder rangesBld = Json.createArrayBuilder(); - ranges.forEach( r -> rangesBld.add( Json.createArrayBuilder().add(r.get(0)).add(r.get(1))) ); + JsonArrayBuilder rangesBld = JsonUtil.createArrayBuilder(); + ranges.forEach( r -> rangesBld.add( JsonUtil.createArrayBuilder().add(r.get(0)).add(r.get(1))) ); bld.add("ranges", rangesBld ); } @@ -243,7 +243,7 @@ public static JsonObjectBuilder json(MailDomainGroup grp) { } public static JsonArrayBuilder rolesToJson(List role) { - JsonArrayBuilder bld = Json.createArrayBuilder(); + JsonArrayBuilder bld = JsonUtil.createArrayBuilder(); for (DataverseRole r : role) { bld.add(JsonPrinter.json(r)); } @@ -251,7 +251,7 @@ public static JsonArrayBuilder rolesToJson(List role) { } public static JsonArrayBuilder enumsToJson(Collection collection) { - JsonArrayBuilder arr = Json.createArrayBuilder(); + JsonArrayBuilder arr = JsonUtil.createArrayBuilder(); for (E entry : collection) { arr.add(entry.name()); } @@ -259,7 +259,7 @@ public static JsonArrayBuilder enumsToJson(Collection collec } public static JsonArrayBuilder jsonDataverseRoles(List roles) { - JsonArrayBuilder jsonArrayOfDataverseRoles = Json.createArrayBuilder(); + JsonArrayBuilder jsonArrayOfDataverseRoles = JsonUtil.createArrayBuilder(); for (DataverseRole role : roles) { jsonArrayOfDataverseRoles.add(json(role)); } @@ -293,7 +293,7 @@ public static JsonObjectBuilder json(Workflow wf){ } if ( wf.getSteps()!=null && !wf.getSteps().isEmpty()) { - JsonArrayBuilder arr = Json.createArrayBuilder(); + JsonArrayBuilder arr = JsonUtil.createArrayBuilder(); for ( WorkflowStepData stp : wf.getSteps() ) { arr.add( jsonObjectBuilder().add("stepType", stp.getStepType()) .add("provider", stp.getProviderId()) @@ -369,7 +369,7 @@ public static JsonObjectBuilder json(Dataverse dv, Boolean hideEmail, Boolean re } List allowedDatasetTypes = dv.getAllowedDatasetTypes(); if (allowedDatasetTypes != null && !allowedDatasetTypes.isEmpty()) { - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (DatasetType datasetType : allowedDatasetTypes) { NullSafeJsonBuilder json = NullSafeJsonBuilder.jsonObjectBuilder() .add("id", datasetType.getId()) @@ -385,9 +385,9 @@ public static JsonObjectBuilder json(Dataverse dv, Boolean hideEmail, Boolean re } public static JsonObjectBuilder jsonArray(List dataverses) { - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); job.add("count", dataverses.size()); - JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder jsonArrayBuilder = JsonUtil.createArrayBuilder(); for (Dataverse dataverse : dataverses) { NullSafeJsonBuilder jsonObject = NullSafeJsonBuilder.jsonObjectBuilder(); jsonObject.add("id", dataverse.getId()); @@ -400,7 +400,7 @@ public static JsonObjectBuilder jsonArray(List dataverses) { } public static JsonArrayBuilder json(List dataverseContacts) { - JsonArrayBuilder jsonArrayOfContacts = Json.createArrayBuilder(); + JsonArrayBuilder jsonArrayOfContacts = JsonUtil.createArrayBuilder(); for (DataverseContact dataverseContact : dataverseContacts) { NullSafeJsonBuilder contactJsonObject = NullSafeJsonBuilder.jsonObjectBuilder(); contactJsonObject.add("displayOrder", dataverseContact.getDisplayOrder()); @@ -441,7 +441,7 @@ public static JsonObjectBuilder json(GuestbookResponse gbResponse) { } final List cqResponses = gbResponse.getCustomQuestionResponses(); if (cqResponses != null && !cqResponses.isEmpty()) { - JsonArrayBuilder customQuestions = Json.createArrayBuilder(); + JsonArrayBuilder customQuestions = JsonUtil.createArrayBuilder(); for (CustomQuestionResponse cqResponse : cqResponses) { JsonObjectBuilder cqObj = jsonObjectBuilder(); cqObj.add("question", cqResponse.getCustomQuestion().getQuestionString()); @@ -473,7 +473,7 @@ public static JsonObjectBuilder json(Guestbook guestbook) { guestbookObject.add("responseCount", guestbook.getResponseCount()); } if (guestbook.getCustomQuestions() != null && !guestbook.getCustomQuestions().isEmpty()) { - JsonArrayBuilder customQuestions = Json.createArrayBuilder(); + JsonArrayBuilder customQuestions = JsonUtil.createArrayBuilder(); for (CustomQuestion cq : guestbook.getCustomQuestions()) { customQuestions.add(json(cq)); } @@ -499,7 +499,7 @@ public static JsonObjectBuilder json(CustomQuestion customQuestion) { customQuestionObject.add("type", customQuestion.getQuestionType()); customQuestionObject.add("hidden", customQuestion.isHidden()); if (customQuestion.getCustomQuestionValues() != null && !customQuestion.getCustomQuestionValues().isEmpty()) { - JsonArrayBuilder customQuestionsValues = Json.createArrayBuilder(); + JsonArrayBuilder customQuestionsValues = JsonUtil.createArrayBuilder(); for (CustomQuestionValue value : customQuestion.getCustomQuestionValues()) { JsonObjectBuilder customQuestionValueObject = jsonObjectBuilder(); if (value.getId() != null) { @@ -613,7 +613,7 @@ public static JsonObjectBuilder json(Dataset ds, Boolean returnOwners) { } bld.add("datasetType", ds.getDatasetType().getName()); - JsonArrayBuilder locksArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder locksArrayBuilder = JsonUtil.createArrayBuilder(); for (DatasetLock lock : ds.getLocks()) { locksArrayBuilder.add(lock.getReason().toString()); } @@ -638,8 +638,8 @@ private static void addDatasetFileCountLimit(DvObjectContainer dvo, JsonObjectBu } public static JsonObjectBuilder json(FileDetailsHolder ds) { - return Json.createObjectBuilder().add(ds.getStorageID() , - Json.createObjectBuilder() + return JsonUtil.createObjectBuilder().add(ds.getStorageID() , + JsonUtil.createObjectBuilder() .add("id", ds.getStorageID() ) .add("hash", ds.getHash()) .add("mime",ds.getMime())); @@ -773,7 +773,7 @@ public static JsonObjectBuilder jsonAsDatasetDto(DatasetVersion dsv) { } public static JsonArrayBuilder jsonFileMetadatas(Collection fmds) { - JsonArrayBuilder filesArr = Json.createArrayBuilder(); + JsonArrayBuilder filesArr = JsonUtil.createArrayBuilder(); for (FileMetadata fmd : fmds) { filesArr.add(JsonPrinter.json(fmd)); } @@ -828,7 +828,7 @@ public static JsonObjectBuilder json(MetadataBlock block, List fie blockBld.add("displayName", block.getDisplayName()); blockBld.add("name", block.getName()); - final JsonArrayBuilder fieldsArray = Json.createArrayBuilder(); + final JsonArrayBuilder fieldsArray = JsonUtil.createArrayBuilder(); Map cvocMap = (datasetFieldService==null) ? new HashMap() :datasetFieldService.getCVocConf(true); List excludedFieldTypeList = new ArrayList<>(); // Exclude the Email field or override the exclusion of the Email field type based on the settings ExcludeEmailFromExport and ignoreSettingExcludeEmailFromExport @@ -846,7 +846,7 @@ public static JsonArrayBuilder json(List metadataBlocks, boolean } public static JsonArrayBuilder json(List metadataBlocks, boolean returnDatasetFieldTypes, boolean printOnlyDisplayedOnCreateDatasetFieldTypes, Dataverse ownerDataverse, DatasetType datasetType) { - JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder arrayBuilder = JsonUtil.createArrayBuilder(); for (MetadataBlock metadataBlock : metadataBlocks) { arrayBuilder.add(returnDatasetFieldTypes ? json(metadataBlock, printOnlyDisplayedOnCreateDatasetFieldTypes, ownerDataverse, datasetType) : brief.json(metadataBlock)); } @@ -867,7 +867,7 @@ public static JsonObject json(DatasetField dfv) { if (dfv.isEmpty()) { return null; } else { - JsonArrayBuilder fieldArray = Json.createArrayBuilder(); + JsonArrayBuilder fieldArray = JsonUtil.createArrayBuilder(); Map cvocMap = (datasetFieldService==null) ? new HashMap() :datasetFieldService.getCVocConf(true); DatasetFieldWalker.walk(dfv, new DatasetFieldsToJson(fieldArray), cvocMap); JsonArray out = fieldArray.build(); @@ -890,7 +890,7 @@ public static JsonObjectBuilder json(MetadataBlock metadataBlock, boolean printO List datasetFieldTypesList = metadataBlock.getDatasetFieldTypes(); Set datasetFieldTypes = filterOutDuplicateDatasetFieldTypes(datasetFieldTypesList); - JsonObjectBuilder fieldsBuilder = Json.createObjectBuilder(); + JsonObjectBuilder fieldsBuilder = JsonUtil.createObjectBuilder(); for (DatasetFieldType datasetFieldType : datasetFieldTypes) { if (!datasetFieldType.isChild()) { @@ -929,7 +929,7 @@ private static Set filterOutDuplicateDatasetFieldTypes(List fields) { - JsonArrayBuilder fieldsJson = Json.createArrayBuilder(); + JsonArrayBuilder fieldsJson = JsonUtil.createArrayBuilder(); for (DatasetFieldType field : fields) { fieldsJson.add(JsonPrinter.json(field)); } @@ -962,7 +962,7 @@ public static JsonObjectBuilder json(DatasetFieldType fld, Dataverse ownerDatave if (fld.isControlledVocabulary()) { // If the field has a controlled vocabulary, // add all values to the resulting JSON - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (ControlledVocabularyValue cvv : fld.getControlledVocabularyValues()) { jab.add(cvv.getStrValue()); } @@ -1132,7 +1132,7 @@ public static JsonObjectBuilder json(DataFile df, FileMetadata fileMetadata, boo //Started from https://github.com/RENCI-NRIG/dataverse/, i.e. https://github.com/RENCI-NRIG/dataverse/commit/2b5a1225b42cf1caba85e18abfeb952171c6754a public static JsonArrayBuilder jsonDT(List ldt) { - JsonArrayBuilder ldtArr = Json.createArrayBuilder(); + JsonArrayBuilder ldtArr = JsonUtil.createArrayBuilder(); for(DataTable dt: ldt){ ldtArr.add(JsonPrinter.json(dt)); } @@ -1150,7 +1150,7 @@ public static JsonObjectBuilder json(DataTable dt) { } public static JsonArrayBuilder jsonDV(List dvl) { - JsonArrayBuilder varArr = Json.createArrayBuilder(); + JsonArrayBuilder varArr = JsonUtil.createArrayBuilder(); if(dvl!=null){ for (DataVariable dv: dvl){ varArr.add(JsonPrinter.json(dv)); @@ -1195,8 +1195,8 @@ public static JsonObjectBuilder json(DataVariable dv) { } private static JsonArrayBuilder jsonInvalidRanges(Collection invalidRanges) { - JsonArrayBuilder invRanges = Json.createArrayBuilder(); - JsonObjectBuilder job = Json.createObjectBuilder(); + JsonArrayBuilder invRanges = JsonUtil.createArrayBuilder(); + JsonObjectBuilder job = JsonUtil.createObjectBuilder(); for (VariableRange vr: invalidRanges){ job.add("beginValue", vr.getBeginValue()) .add("hasBeginValueType", vr.getBeginValueType()!=null) @@ -1216,8 +1216,8 @@ private static JsonArrayBuilder jsonInvalidRanges(Collection inva } private static JsonObjectBuilder jsonSumStat(Collection sumStat){ - //JsonArrayBuilder sumStatArr = Json.createArrayBuilder(); - JsonObjectBuilder sumStatObj = Json.createObjectBuilder(); + //JsonArrayBuilder sumStatArr = JsonUtil.createArrayBuilder(); + JsonObjectBuilder sumStatObj = JsonUtil.createObjectBuilder(); for (SummaryStatistic stat: sumStat){ String label = stat.getTypeLabel()==null ? "unknown":stat.getTypeLabel(); sumStatObj.add(label, stat.getValue()); @@ -1227,10 +1227,10 @@ private static JsonObjectBuilder jsonSumStat(Collection sumSta private static JsonArrayBuilder jsonCatStat(Collection catStat){ - JsonArrayBuilder catArr = Json.createArrayBuilder(); + JsonArrayBuilder catArr = JsonUtil.createArrayBuilder(); for (VariableCategory stat: catStat){ - JsonObjectBuilder catStatObj = Json.createObjectBuilder(); + JsonObjectBuilder catStatObj = JsonUtil.createObjectBuilder(); catStatObj.add("label", stat.getLabel()) .add("value", stat.getValue()) .add("isMissing", stat.isMissing()); @@ -1243,10 +1243,10 @@ private static JsonArrayBuilder jsonCatStat(Collection catStat } private static JsonArrayBuilder jsonVarGroup(List varGroups) { - JsonArrayBuilder vgArr = Json.createArrayBuilder(); + JsonArrayBuilder vgArr = JsonUtil.createArrayBuilder(); for (VarGroup vg : varGroups) { JsonObjectBuilder vgJson = jsonObjectBuilder().add("id", vg.getId()).add("label", vg.getLabel()); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); for (DataVariable dvar : vg.getVarsInGroup()) { jab.add(dvar.getId()); } @@ -1257,7 +1257,7 @@ private static JsonArrayBuilder jsonVarGroup(List varGroups) { } private static JsonArrayBuilder jsonVarMetadata(Collection varMetadatas) { - JsonArrayBuilder vmArr = Json.createArrayBuilder(); + JsonArrayBuilder vmArr = JsonUtil.createArrayBuilder(); for (VariableMetadata vm : varMetadatas) { JsonObjectBuilder vmJson = jsonObjectBuilder() .add("id", vm.getId()) @@ -1272,13 +1272,13 @@ private static JsonArrayBuilder jsonVarMetadata(Collection var .add("universe", vm.getUniverse()) .add("notes", vm.getNotes()) .add("categoryMetadatas",json(vm.getCategoriesMetadata())); - JsonArrayBuilder jab = Json.createArrayBuilder(); + JsonArrayBuilder jab = JsonUtil.createArrayBuilder(); } return vmArr; } private static JsonArrayBuilder json(Collection categoriesMetadata) { - JsonArrayBuilder cmArr = Json.createArrayBuilder(); + JsonArrayBuilder cmArr = JsonUtil.createArrayBuilder(); for(CategoryMetadata cm: categoriesMetadata) { JsonObjectBuilder job = jsonObjectBuilder() .add("wFreq", cm.getWfreq()) @@ -1330,7 +1330,7 @@ private static JsonArrayBuilder getFileCategories(FileMetadata fmd) { if (categories == null || categories.isEmpty()) { return null; } - JsonArrayBuilder fileCategories = Json.createArrayBuilder(); + JsonArrayBuilder fileCategories = JsonUtil.createArrayBuilder(); for (String category : categories) { fileCategories.add(category); } @@ -1345,7 +1345,7 @@ public static JsonArrayBuilder getTabularFileTags(DataFile df) { if (tags == null || tags.isEmpty()) { return null; } - JsonArrayBuilder tabularTags = Json.createArrayBuilder(); + JsonArrayBuilder tabularTags = JsonUtil.createArrayBuilder(); for (DataFileTag tag : tags) { String label = tag.getTypeLabel(); if (label != null) { @@ -1356,12 +1356,12 @@ public static JsonArrayBuilder getTabularFileTags(DataFile df) { } public static JsonObjectBuilder jsonLocallyFairRoleAssignees(Dataverse dataverse) { - JsonArrayBuilder assignees = Json.createArrayBuilder(); + JsonArrayBuilder assignees = JsonUtil.createArrayBuilder(); dataverse.getLocallyFAIRRoleAssigneeIdentifiers().stream() .sorted() .forEach(assignees::add); - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add("dataverseId", dataverse.getId()) .add("dataverseAlias", dataverse.getAlias()) .add("locallyFairRoleAssignees", assignees); @@ -1385,7 +1385,7 @@ private static class DatasetFieldsToJson implements DatasetFieldWalker.Listener public void startField(DatasetField f) { objectStack.push(jsonObjectBuilder()); // Invariant: all values are multiple. Differentiation between multiple and single is done at endField. - valueArrStack.push(Json.createArrayBuilder()); + valueArrStack.push(JsonUtil.createArrayBuilder()); DatasetFieldType typ = f.getDatasetFieldType(); objectStack.peek().add("typeName", typ.getName()); @@ -1396,7 +1396,7 @@ public void startField(DatasetField f) { @Override public void addExpandedValuesArray(DatasetField f) { // Invariant: all values are multiple. Differentiation between multiple and single is done at endField. - valueArrStack.push(Json.createArrayBuilder()); + valueArrStack.push(JsonUtil.createArrayBuilder()); } @Override @@ -1448,7 +1448,7 @@ public void controlledVocabularyValue(ControlledVocabularyValue cvv) { @Override public void startCompoundValue(DatasetFieldCompoundValue dsfcv) { - valueArrStack.push(Json.createArrayBuilder()); + valueArrStack.push(JsonUtil.createArrayBuilder()); } @Override @@ -1490,7 +1490,7 @@ public static JsonObjectBuilder json(PrivateUrl privateUrl) { } public static JsonObjectBuilder json( ExplicitGroup eg ) { - JsonArrayBuilder ras = Json.createArrayBuilder(); + JsonArrayBuilder ras = JsonUtil.createArrayBuilder(); for (String u : eg.getContainedRoleAssgineeIdentifiers()) { ras.add(u); } @@ -1504,7 +1504,7 @@ public static JsonObjectBuilder json( ExplicitGroup eg ) { } public static JsonArrayBuilder jsonDataverseFacets(List dataverseFacets) { - JsonArrayBuilder dataverseFacetsJson = Json.createArrayBuilder(); + JsonArrayBuilder dataverseFacetsJson = JsonUtil.createArrayBuilder(); for(DataverseFacet facet: dataverseFacets) { dataverseFacetsJson.add(json(facet)); } @@ -1550,7 +1550,7 @@ public static Collector stringsToJso @Override public Supplier supplier() { - return () -> Json.createArrayBuilder(); + return () -> JsonUtil.createArrayBuilder(); } @Override @@ -1561,7 +1561,7 @@ public BiConsumer accumulator() { @Override public BinaryOperator combiner() { return (jab1, jab2) -> { - JsonArrayBuilder retVal = Json.createArrayBuilder(); + JsonArrayBuilder retVal = JsonUtil.createArrayBuilder(); jab1.build().forEach(retVal::add); jab2.build().forEach(retVal::add); return retVal; @@ -1581,7 +1581,7 @@ public Set characteristics() { } public static JsonObjectBuilder json(Map map) { - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); for (Map.Entry mapEntry : map.entrySet()) { jsonObjectBuilder.add(mapEntry.getKey(), mapEntry.getValue()); } @@ -1589,7 +1589,7 @@ public static JsonObjectBuilder json(Map map) { } public static JsonObjectBuilder jsonFileCountPerAccessStatusMap(Map map) { - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); for (Map.Entry mapEntry : map.entrySet()) { jsonObjectBuilder.add(mapEntry.getKey().toString(), mapEntry.getValue()); } @@ -1597,7 +1597,7 @@ public static JsonObjectBuilder jsonFileCountPerAccessStatusMap(Map map) { - JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder(); + JsonObjectBuilder jsonObjectBuilder = JsonUtil.createObjectBuilder(); for (Map.Entry mapEntry : map.entrySet()) { jsonObjectBuilder.add(mapEntry.getKey().toString(), mapEntry.getValue()); } @@ -1628,7 +1628,7 @@ public BinaryOperator> combiner() { @Override public Function, JsonArrayBuilder> finisher() { return (l) -> { - JsonArrayBuilder bld = Json.createArrayBuilder(); + JsonArrayBuilder bld = JsonUtil.createArrayBuilder(); l.forEach( bld::add ); return bld; }; @@ -1651,7 +1651,7 @@ public static String getMd5IfItExists(DataFile.ChecksumType checksumType, String public static JsonObjectBuilder getChecksumTypeAndValue(DataFile.ChecksumType checksumType, String checksumValue) { if (checksumType != null) { - return Json.createObjectBuilder() + return JsonUtil.createObjectBuilder() .add("type", checksumType.toString()) .add("value", checksumValue); } else { @@ -1681,8 +1681,8 @@ public static JsonObjectBuilder mapToObject(Map in) { public static JsonObjectBuilder jsonLinkset(Dataset ds) { return jsonObjectBuilder() .add("anchor", ds.getPersistentURL()) - .add("cite-as", Json.createArrayBuilder().add(jsonObjectBuilder().add("href", ds.getPersistentURL()))) - .add("type", Json.createArrayBuilder().add(jsonObjectBuilder().add("href", "https://schema.org/AboutPage"))) + .add("cite-as", JsonUtil.createArrayBuilder().add(jsonObjectBuilder().add("href", ds.getPersistentURL()))) + .add("type", JsonUtil.createArrayBuilder().add(jsonObjectBuilder().add("href", "https://schema.org/AboutPage"))) .add("author", ds.getPersistentURL()) .add("protocol", ds.getProtocol()) .add("authority", ds.getAuthority()) @@ -1710,7 +1710,7 @@ private static JsonObjectBuilder jsonLicense(DatasetVersion dsv) { } public static JsonArrayBuilder jsonDataverseFieldTypeInputLevels(List inputLevels) { - JsonArrayBuilder jsonArrayOfInputLevels = Json.createArrayBuilder(); + JsonArrayBuilder jsonArrayOfInputLevels = JsonUtil.createArrayBuilder(); for (DataverseFieldTypeInputLevel inputLevel : inputLevels) { NullSafeJsonBuilder inputLevelJsonObject = NullSafeJsonBuilder.jsonObjectBuilder(); inputLevelJsonObject.add("datasetFieldTypeName", inputLevel.getDatasetFieldType().getName()); @@ -1723,7 +1723,7 @@ public static JsonArrayBuilder jsonDataverseFieldTypeInputLevels(List inputLevels) { - JsonArrayBuilder inputLevelsArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder inputLevelsArrayBuilder = JsonUtil.createArrayBuilder(); for (DataverseFieldTypeInputLevel inputLevel : inputLevels) { inputLevelsArrayBuilder.add(jsonDataverseInputLevel(inputLevel)); } @@ -1740,7 +1740,7 @@ private static JsonObjectBuilder jsonDataverseInputLevel(DataverseFieldTypeInput } public static JsonArrayBuilder jsonDataverseFeaturedItems(List dataverseFeaturedItems) { - JsonArrayBuilder featuredItemsArrayBuilder = Json.createArrayBuilder(); + JsonArrayBuilder featuredItemsArrayBuilder = JsonUtil.createArrayBuilder(); for (DataverseFeaturedItem dataverseFeaturedItem : dataverseFeaturedItems) { featuredItemsArrayBuilder.add(json(dataverseFeaturedItem)); } @@ -1779,7 +1779,7 @@ public static JsonObjectBuilder json(DataverseFeaturedItem dataverseFeaturedItem } public static JsonArrayBuilder jsonTemplates(List