From c193ae20d40b7ad14484404a95ec952357123c84 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 20 May 2021 14:28:26 -0400 Subject: [PATCH 01/66] initial POC to send email when inbox msgs are received --- .../harvard/iq/dataverse/MailServiceBean.java | 2 +- .../harvard/iq/dataverse/api/LDNInbox.java | 147 ++++++++++++++++++ .../settings/SettingsServiceBean.java | 7 +- src/main/java/propertyFiles/Bundle.properties | 4 + 4 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index 432f45e1af9..587909000fc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -167,7 +167,7 @@ public boolean sendSystemEmail(String to, String subject, String messageText, bo return sent; } - private InternetAddress getSystemAddress() { + public InternetAddress getSystemAddress() { String systemEmail = settingsService.getValueForKey(Key.SystemEmail); return MailUtil.parseSystemAddress(systemEmail); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java new file mode 100644 index 00000000000..b95839989c9 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -0,0 +1,147 @@ +package edu.harvard.iq.dataverse.api; + +import edu.harvard.iq.dataverse.Dataset; +import edu.harvard.iq.dataverse.DatasetServiceBean; +import edu.harvard.iq.dataverse.GlobalId; +import edu.harvard.iq.dataverse.MailServiceBean; +import edu.harvard.iq.dataverse.api.AbstractApiBean.WrappedResponse; +import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress; +import edu.harvard.iq.dataverse.branding.BrandingUtil; +import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; +import edu.harvard.iq.dataverse.engine.command.DataverseRequest; +import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetThumbnailCommand; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import edu.harvard.iq.dataverse.util.BundleUtil; +import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JSONLDUtil; +import edu.harvard.iq.dataverse.util.json.JsonLDNamespace; +import edu.harvard.iq.dataverse.util.json.JsonLDTerm; + +import java.util.Arrays; +import java.util.Optional; + +import java.io.InputStream; +import java.io.StringReader; +import java.util.logging.Logger; + +import javax.ejb.EJB; +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonObject; +import javax.json.JsonValue; +import javax.mail.internet.InternetAddress; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.BadRequestException; +import javax.ws.rs.ServiceUnavailableException; +import javax.ws.rs.Consumes; +import javax.ws.rs.ForbiddenException; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.ServerErrorException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.glassfish.jersey.media.multipart.FormDataParam; + +import com.apicatalog.jsonld.JsonLd; +import com.apicatalog.jsonld.api.JsonLdError; +import com.apicatalog.jsonld.document.JsonDocument; + +@Path("inbox") +public class LDNInbox extends AbstractApiBean { + + private static final Logger logger = Logger.getLogger(LDNInbox.class.getName()); + + @EJB + SettingsServiceBean settingsService; + + @EJB + DatasetServiceBean datasetService; + + @EJB + MailServiceBean mailService; + + @Context + protected HttpServletRequest httpRequest; + + @POST + @Consumes(MediaType.APPLICATION_JSON + "+ld") + public Response acceptMessage(String body) { + IpAddress origin = new DataverseRequest(null, httpRequest).getSourceAddress(); + String whitelist = settingsService.get(SettingsServiceBean.Key.MessageHosts.toString(), "*"); + // Only do something if we listen to this host + if (whitelist.equals("*") || whitelist.contains(origin.toString())) { + String citingPID = null; + String citingType = null; + boolean sent = false; + JsonObject jsonld = JSONLDUtil.decontextualizeJsonLD(body); + if (jsonld == null) { + throw new BadRequestException( + "Could not parse message to find acceptable citation link to a dataset."); + } + if (jsonld.containsKey(JsonLDTerm.schemaOrg("identifier").toString())) { + citingPID = jsonld.getJsonObject(JsonLDTerm.schemaOrg("identifier").toString()).getString("@id"); + + if (jsonld.containsKey("@type")) { + citingType = jsonld.getString("@type"); + if (citingType.startsWith(JsonLDNamespace.schema.getUrl())) { + citingType.replace(JsonLDNamespace.schema.getUrl(), ""); + } + if (jsonld.containsKey(JsonLDTerm.schemaOrg("citation").toString())) { + JsonObject citation = jsonld.getJsonObject(JsonLDTerm.schemaOrg("citation").toString()); + if (citation != null) { + if (citation.containsKey("@type") + && citation.getString("@type").equals(JsonLDTerm.schemaOrg("Dataset").toString()) + && citation.containsKey(JsonLDTerm.schemaOrg("identifier").toString())) { + String pid = citation.getString("@value"); + if (pid.startsWith(GlobalId.DOI_RESOLVER_URL)) { + pid.replace(GlobalId.DOI_RESOLVER_URL, GlobalId.DOI_PROTOCOL + ":"); + } else if (pid.startsWith(GlobalId.HDL_RESOLVER_URL)) { + pid.replace(GlobalId.HDL_RESOLVER_URL, GlobalId.HDL_PROTOCOL + ":"); + } + Optional id = GlobalId.parse(pid); + Dataset dataset = datasetSvc.findByGlobalId(pid); + if (dataset != null) { + InternetAddress systemAddress = mailService.getSystemAddress(); + String citationMessage = BundleUtil.getStringFromBundle( + "api.ldninbox.citation.alert", + Arrays.asList( + BrandingUtil.getSupportTeamName(systemAddress), + BrandingUtil.getInstallationBrandName(), + citingType, + citingPID, + systemConfig.getDataverseSiteUrl(), + dataset.getGlobalId().toString(), dataset.getDisplayName())); + + sent = mailService.sendSystemEmail( + BrandingUtil.getSupportTeamEmailAddress(systemAddress), + BundleUtil.getStringFromBundle("notification.email.assign.role.subject", + Arrays.asList(BrandingUtil.getInstallationBrandName())), + citationMessage, true); + } + } + } + } + } + + + if (!sent) { + if (citingPID == null || citingType == null) { + throw new BadRequestException( + "Could not parse message to find acceptable citation link to a dataset."); + } else { + throw new ServiceUnavailableException( + "Unable to process message. Please contact the administrators."); + } + } + } else { + logger.info("Ignoring message from IP address: " + origin.toString()); + throw new ForbiddenException("Inbox does not acept messages from this address"); + } + } + return ok("Message Received"); + } +} 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 02637bfa8df..1ebba7642cd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -433,7 +433,12 @@ Whether Harvesting (OAI) service is enabled * Installation Brand Name is always included (default/false) or is not included * when the Distributor field (citation metadatablock) is set (true) */ - ExportInstallationAsDistributorOnlyWhenNotSet + ExportInstallationAsDistributorOnlyWhenNotSet, + /** + * LDN Inbox Allowed Hosts - a comma separated list of IP addresses allowed to submit messages to the inbox + */ + MessageHosts + ; @Override diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 77248d76ea8..8759f0c1b89 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -711,6 +711,7 @@ notification.email.revokeRole=One of your roles for the {0} "{1}" has been revok notification.email.changeEmail=Hello, {0}.{1}\n\nPlease contact us if you did not intend this change or if you need assistance. notification.email.passwordReset=Hi {0},\n\nSomeone, hopefully you, requested a password reset for {1}.\n\nPlease click the link below to reset your Dataverse account password:\n\n {2} \n\n The link above will only work for the next {3} minutes.\n\n Please contact us if you did not request this password reset or need further help. notification.email.passwordReset.subject=Dataverse Password Reset Requested + hours=hours hour=hour minutes=minutes @@ -2645,3 +2646,6 @@ publishDatasetCommand.pidNotReserved=Cannot publish dataset because its persiste # APIs api.errors.invalidApiToken=Invalid API token. +api.ldninbox.citation.alert={0}, the {1} has just been notified that the {2} {4} cites "{6}. + + \ No newline at end of file From a889282e8783fa28efe799a38d22536d817d1e57 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 20 May 2021 15:12:30 -0400 Subject: [PATCH 02/66] bug fixes --- .../harvard/iq/dataverse/api/LDNInbox.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index b95839989c9..b1f2eb3e18c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -68,6 +68,7 @@ public class LDNInbox extends AbstractApiBean { protected HttpServletRequest httpRequest; @POST + @Path("/") @Consumes(MediaType.APPLICATION_JSON + "+ld") public Response acceptMessage(String body) { IpAddress origin = new DataverseRequest(null, httpRequest).getSourceAddress(); @@ -82,26 +83,29 @@ public Response acceptMessage(String body) { throw new BadRequestException( "Could not parse message to find acceptable citation link to a dataset."); } - if (jsonld.containsKey(JsonLDTerm.schemaOrg("identifier").toString())) { - citingPID = jsonld.getJsonObject(JsonLDTerm.schemaOrg("identifier").toString()).getString("@id"); - + if (jsonld.containsKey(JsonLDTerm.schemaOrg("identifier").getUrl())) { + citingPID = jsonld.getJsonObject(JsonLDTerm.schemaOrg("identifier").getUrl()).getString("@id"); + logger.fine("Citing PID: " + citingPID); if (jsonld.containsKey("@type")) { citingType = jsonld.getString("@type"); if (citingType.startsWith(JsonLDNamespace.schema.getUrl())) { citingType.replace(JsonLDNamespace.schema.getUrl(), ""); } - if (jsonld.containsKey(JsonLDTerm.schemaOrg("citation").toString())) { - JsonObject citation = jsonld.getJsonObject(JsonLDTerm.schemaOrg("citation").toString()); + logger.fine("Citing Type: " + citingType); + if (jsonld.containsKey(JsonLDTerm.schemaOrg("citation").getUrl())) { + JsonObject citation = jsonld.getJsonObject(JsonLDTerm.schemaOrg("citation").getUrl()); if (citation != null) { if (citation.containsKey("@type") - && citation.getString("@type").equals(JsonLDTerm.schemaOrg("Dataset").toString()) - && citation.containsKey(JsonLDTerm.schemaOrg("identifier").toString())) { - String pid = citation.getString("@value"); + && citation.getString("@type").equals(JsonLDTerm.schemaOrg("Dataset").getUrl()) + && citation.containsKey(JsonLDTerm.schemaOrg("identifier").getUrl())) { + String pid = citation.getString(JsonLDTerm.schemaOrg("identifier").getUrl()); + logger.fine("Raw PID: " + pid); if (pid.startsWith(GlobalId.DOI_RESOLVER_URL)) { pid.replace(GlobalId.DOI_RESOLVER_URL, GlobalId.DOI_PROTOCOL + ":"); } else if (pid.startsWith(GlobalId.HDL_RESOLVER_URL)) { pid.replace(GlobalId.HDL_RESOLVER_URL, GlobalId.HDL_PROTOCOL + ":"); } + logger.fine("Protocol PID: " + pid); Optional id = GlobalId.parse(pid); Dataset dataset = datasetSvc.findByGlobalId(pid); if (dataset != null) { @@ -126,22 +130,22 @@ public Response acceptMessage(String body) { } } } + } - - if (!sent) { - if (citingPID == null || citingType == null) { - throw new BadRequestException( - "Could not parse message to find acceptable citation link to a dataset."); - } else { - throw new ServiceUnavailableException( - "Unable to process message. Please contact the administrators."); - } + if (!sent) { + if (citingPID == null || citingType == null) { + throw new BadRequestException( + "Could not parse message to find acceptable citation link to a dataset."); + } else { + throw new ServiceUnavailableException( + "Unable to process message. Please contact the administrators."); } - } else { - logger.info("Ignoring message from IP address: " + origin.toString()); - throw new ForbiddenException("Inbox does not acept messages from this address"); } + } else { + logger.info("Ignoring message from IP address: " + origin.toString()); + throw new ForbiddenException("Inbox does not acept messages from this address"); } + return ok("Message Received"); } } From 5d0c5f4794eb2d7fc3a3194af028c01971cd04b3 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 20 May 2021 15:21:46 -0400 Subject: [PATCH 03/66] git doi: style pid --- src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index b1f2eb3e18c..4e40ec80994 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -101,9 +101,9 @@ public Response acceptMessage(String body) { String pid = citation.getString(JsonLDTerm.schemaOrg("identifier").getUrl()); logger.fine("Raw PID: " + pid); if (pid.startsWith(GlobalId.DOI_RESOLVER_URL)) { - pid.replace(GlobalId.DOI_RESOLVER_URL, GlobalId.DOI_PROTOCOL + ":"); + pid = pid.replace(GlobalId.DOI_RESOLVER_URL, GlobalId.DOI_PROTOCOL + ":"); } else if (pid.startsWith(GlobalId.HDL_RESOLVER_URL)) { - pid.replace(GlobalId.HDL_RESOLVER_URL, GlobalId.HDL_PROTOCOL + ":"); + pid = pid.replace(GlobalId.HDL_RESOLVER_URL, GlobalId.HDL_PROTOCOL + ":"); } logger.fine("Protocol PID: " + pid); Optional id = GlobalId.parse(pid); From 9e10844bb2f53cac78ae0941266c81bbb6d2b56d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 20 May 2021 15:38:37 -0400 Subject: [PATCH 04/66] fix email message --- src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java | 9 +++++---- src/main/java/propertyFiles/Bundle.properties | 5 ++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index 4e40ec80994..c0c44e4a5d6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -89,7 +89,7 @@ public Response acceptMessage(String body) { if (jsonld.containsKey("@type")) { citingType = jsonld.getString("@type"); if (citingType.startsWith(JsonLDNamespace.schema.getUrl())) { - citingType.replace(JsonLDNamespace.schema.getUrl(), ""); + citingType = citingType.replace(JsonLDNamespace.schema.getUrl(), ""); } logger.fine("Citing Type: " + citingType); if (jsonld.containsKey(JsonLDTerm.schemaOrg("citation").getUrl())) { @@ -118,11 +118,12 @@ public Response acceptMessage(String body) { citingType, citingPID, systemConfig.getDataverseSiteUrl(), - dataset.getGlobalId().toString(), dataset.getDisplayName())); - + dataset.getGlobalId().toString(), + dataset.getDisplayName())); +// Subject: <<>>. Body: Root Support, the Root has just been notified that the http://schema.org/ScholarlyArticle http://ec2-3-236-45-73.compute-1.amazonaws.com cites "Une Démonstration.

You may contact us for support at qqmyers@hotmail.com.

Thank you,
Root Support sent = mailService.sendSystemEmail( BrandingUtil.getSupportTeamEmailAddress(systemAddress), - BundleUtil.getStringFromBundle("notification.email.assign.role.subject", + BundleUtil.getStringFromBundle("api.ldninbox.citation.subject", Arrays.asList(BrandingUtil.getInstallationBrandName())), citationMessage, true); } diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 8759f0c1b89..99b12357da7 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2646,6 +2646,5 @@ publishDatasetCommand.pidNotReserved=Cannot publish dataset because its persiste # APIs api.errors.invalidApiToken=Invalid API token. -api.ldninbox.citation.alert={0}, the {1} has just been notified that the {2} {4} cites "{6}. - - \ No newline at end of file +api.ldninbox.citation.alert={0}, the {1} has just been notified that the {2} {3} cites "{6}. +api.ldninbox.citation.subject={0}: A Dataset Citation has been reported! From 3573185f6f8f76ba2ce57e88f2a1132335480bf8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 20 May 2021 16:05:08 -0400 Subject: [PATCH 05/66] text tweaks --- src/main/java/propertyFiles/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 99b12357da7..687e97a9f72 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2646,5 +2646,5 @@ publishDatasetCommand.pidNotReserved=Cannot publish dataset because its persiste # APIs api.errors.invalidApiToken=Invalid API token. -api.ldninbox.citation.alert={0}, the {1} has just been notified that the {2} {3} cites "{6}. +api.ldninbox.citation.alert={0},

The {1} has just been notified that the {2}, {3}, cites "{6}" in this repository. api.ldninbox.citation.subject={0}: A Dataset Citation has been reported! From 6c5d26d77bd61a9df2e5b33798a20f72a2286fd0 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 24 Feb 2022 16:24:09 -0500 Subject: [PATCH 06/66] Add a DASH idType in the template --- scripts/api/data/metadatablocks/citation.tsv | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/api/data/metadatablocks/citation.tsv b/scripts/api/data/metadatablocks/citation.tsv index 375a8c67cec..9e2ec172ba4 100644 --- a/scripts/api/data/metadatablocks/citation.tsv +++ b/scripts/api/data/metadatablocks/citation.tsv @@ -111,6 +111,7 @@ publicationIDType upc 14 publicationIDType url 15 publicationIDType urn 16 + publicationIDType DASH 17 contributorType Data Collector 0 contributorType Data Curator 1 contributorType Data Manager 2 From 9ac2083c43ead21a97e817480de96bf97ec7e6e2 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 2 Mar 2022 08:23:45 -0500 Subject: [PATCH 07/66] add additionalInfo to UserNotification --- .../edu/harvard/iq/dataverse/UserNotificationServiceBean.java | 4 ++++ src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql | 1 + 2 files changed, 5 insertions(+) create mode 100644 src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql diff --git a/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java index 071805d3d26..0994f1fe70c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserNotificationServiceBean.java @@ -103,12 +103,16 @@ public void sendNotification(AuthenticatedUser dataverseUser, Timestamp sendDate } public void sendNotification(AuthenticatedUser dataverseUser, Timestamp sendDate, Type type, Long objectId, String comment, AuthenticatedUser requestor, boolean isHtmlContent) { + sendNotification(dataverseUser, sendDate, type, objectId, comment, requestor, isHtmlContent, null); + } + public void sendNotification(AuthenticatedUser dataverseUser, Timestamp sendDate, Type type, Long objectId, String comment, AuthenticatedUser requestor, boolean isHtmlContent, String additionalInfo) { UserNotification userNotification = new UserNotification(); userNotification.setUser(dataverseUser); userNotification.setSendDate(sendDate); userNotification.setType(type); userNotification.setObjectId(objectId); userNotification.setRequestor(requestor); + userNotification.setAdditionalInfo(additionalInfo); if (mailService.sendNotificationEmail(userNotification, comment, requestor, isHtmlContent)) { logger.fine("email was sent"); diff --git a/src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql b/src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql new file mode 100644 index 00000000000..af8143a97d6 --- /dev/null +++ b/src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql @@ -0,0 +1 @@ +ALTER TABLE usernotification ADD COLUMN IF NOT EXISTS additionalinfo VARCHAR; From b0ec2251d2da146fe03d67b59477bb4b829d3e12 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 2 Mar 2022 08:35:00 -0500 Subject: [PATCH 08/66] Add LDN Announce message handling with email and notification Updated messages to include relationship verb Sending to all superusers who can publish the dataset --- .../harvard/iq/dataverse/MailServiceBean.java | 22 +++++ .../iq/dataverse/UserNotification.java | 12 ++- .../harvard/iq/dataverse/api/LDNInbox.java | 84 ++++++++++++++----- .../providers/builtin/DataverseUserPage.java | 1 + .../harvard/iq/dataverse/util/MailUtil.java | 4 +- .../iq/dataverse/util/json/JsonUtil.java | 7 ++ src/main/java/propertyFiles/Bundle.properties | 4 + src/main/webapp/dataverseuser.xhtml | 12 +++ 8 files changed, 122 insertions(+), 24 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index ac6e15baa56..f16eaa98831 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -16,6 +16,8 @@ import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.MailUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JsonUtil; + import java.io.UnsupportedEncodingException; import java.text.MessageFormat; import java.util.ArrayList; @@ -606,6 +608,25 @@ public String getMessageTextBasedOnNotification(UserNotification userNotificatio )); return ingestedCompletedWithErrorsMessage; + case DATASETMENTIONED: + String additionalInfo = userNotification.getAdditionalInfo(); + dataset = (Dataset) targetObject; + javax.json.JsonObject citingResource = null; + citingResource = JsonUtil.getJsonObject(additionalInfo); + + + pattern = BundleUtil.getStringFromBundle("notification.email.datasetWasMentioned"); + Object[] paramArrayDatasetMentioned = { + userNotification.getUser().getName(), + BrandingUtil.getInstallationBrandName(), + citingResource.getString("@type"), + citingResource.getString("@id"), + citingResource.getString("relationship"), + systemConfig.getDataverseSiteUrl(), + dataset.getGlobalId().toString(), + dataset.getDisplayName()}; + messageText += MessageFormat.format(pattern, paramArrayDatasetMentioned); + return messageText; } return ""; @@ -630,6 +651,7 @@ private Object getObjectOfNotification (UserNotification userNotification){ case GRANTFILEACCESS: case REJECTFILEACCESS: case DATASETCREATED: + case DATASETMENTIONED: return datasetService.find(userNotification.getObjectId()); case CREATEDS: case SUBMITTEDDS: diff --git a/src/main/java/edu/harvard/iq/dataverse/UserNotification.java b/src/main/java/edu/harvard/iq/dataverse/UserNotification.java index 58152f6673e..cd2a4428592 100644 --- a/src/main/java/edu/harvard/iq/dataverse/UserNotification.java +++ b/src/main/java/edu/harvard/iq/dataverse/UserNotification.java @@ -30,7 +30,7 @@ public enum Type { ASSIGNROLE, REVOKEROLE, CREATEDV, CREATEDS, CREATEACC, SUBMITTEDDS, RETURNEDDS, PUBLISHEDDS, REQUESTFILEACCESS, GRANTFILEACCESS, REJECTFILEACCESS, FILESYSTEMIMPORT, CHECKSUMIMPORT, CHECKSUMFAIL, CONFIRMEMAIL, APIGENERATED, INGESTCOMPLETED, INGESTCOMPLETEDWITHERRORS, - PUBLISHFAILED_PIDREG, WORKFLOW_SUCCESS, WORKFLOW_FAILURE, STATUSUPDATED, DATASETCREATED + PUBLISHFAILED_PIDREG, WORKFLOW_SUCCESS, WORKFLOW_FAILURE, STATUSUPDATED, DATASETCREATED, DATASETMENTIONED }; private static final long serialVersionUID = 1L; @@ -56,6 +56,8 @@ public enum Type { @Column( nullable = false ) private Type type; private Long objectId; + + private String additionalInfo; @Transient private boolean displayAsRead; @@ -160,4 +162,12 @@ public void setRoleString(String roleString) { public String getLocaleSendDate() { return DateUtil.formatDate(sendDate); } + + public String getAdditionalInfo() { + return additionalInfo; + } + + public void setAdditionalInfo(String additionalInfo) { + this.additionalInfo = additionalInfo; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index c0c44e4a5d6..d4d22929f54 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -2,14 +2,22 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetServiceBean; +import edu.harvard.iq.dataverse.DataverseRoleServiceBean; +import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.MailServiceBean; +import edu.harvard.iq.dataverse.RoleAssigneeServiceBean; +import edu.harvard.iq.dataverse.RoleAssignment; +import edu.harvard.iq.dataverse.UserNotification; +import edu.harvard.iq.dataverse.UserNotificationServiceBean; import edu.harvard.iq.dataverse.api.AbstractApiBean.WrappedResponse; +import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress; import edu.harvard.iq.dataverse.branding.BrandingUtil; import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetThumbnailCommand; +import edu.harvard.iq.dataverse.ldn.LDNReleaseAction; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.SystemConfig; @@ -18,10 +26,13 @@ import edu.harvard.iq.dataverse.util.json.JsonLDTerm; import java.util.Arrays; +import java.util.Date; import java.util.Optional; - +import java.util.Set; import java.io.InputStream; import java.io.StringReader; +import java.io.StringWriter; +import java.sql.Timestamp; import java.util.logging.Logger; import javax.ejb.EJB; @@ -29,6 +40,7 @@ import javax.json.JsonArray; import javax.json.JsonObject; import javax.json.JsonValue; +import javax.json.JsonWriter; import javax.mail.internet.InternetAddress; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BadRequestException; @@ -64,6 +76,14 @@ public class LDNInbox extends AbstractApiBean { @EJB MailServiceBean mailService; + @EJB + UserNotificationServiceBean userNotificationService; + + @EJB + DataverseRoleServiceBean roleService; + + @EJB + RoleAssigneeServiceBean roleAssigneeService; @Context protected HttpServletRequest httpRequest; @@ -80,9 +100,9 @@ public Response acceptMessage(String body) { boolean sent = false; JsonObject jsonld = JSONLDUtil.decontextualizeJsonLD(body); if (jsonld == null) { - throw new BadRequestException( - "Could not parse message to find acceptable citation link to a dataset."); + throw new BadRequestException("Could not parse message to find acceptable citation link to a dataset."); } + String relationship = "isRelatedTo"; if (jsonld.containsKey(JsonLDTerm.schemaOrg("identifier").getUrl())) { citingPID = jsonld.getJsonObject(JsonLDTerm.schemaOrg("identifier").getUrl()).getString("@id"); logger.fine("Citing PID: " + citingPID); @@ -109,24 +129,40 @@ public Response acceptMessage(String body) { Optional id = GlobalId.parse(pid); Dataset dataset = datasetSvc.findByGlobalId(pid); if (dataset != null) { - InternetAddress systemAddress = mailService.getSystemAddress(); - String citationMessage = BundleUtil.getStringFromBundle( - "api.ldninbox.citation.alert", - Arrays.asList( - BrandingUtil.getSupportTeamName(systemAddress), - BrandingUtil.getInstallationBrandName(), - citingType, - citingPID, - systemConfig.getDataverseSiteUrl(), - dataset.getGlobalId().toString(), - dataset.getDisplayName())); -// Subject: <<>>. Body: Root Support, the Root has just been notified that the http://schema.org/ScholarlyArticle http://ec2-3-236-45-73.compute-1.amazonaws.com cites "Une Démonstration.

You may contact us for support at qqmyers@hotmail.com.

Thank you,
Root Support - sent = mailService.sendSystemEmail( - BrandingUtil.getSupportTeamEmailAddress(systemAddress), - BundleUtil.getStringFromBundle("api.ldninbox.citation.subject", - Arrays.asList(BrandingUtil.getInstallationBrandName())), - citationMessage, true); + JsonObject citingResource = Json.createObjectBuilder().add("@id", citingPID) + .add("@type", citingType).add("relationship", relationship).build(); + StringWriter sw = new StringWriter(128); + try (JsonWriter jw = Json.createWriter(sw)) { + jw.write(citingResource); + } + String jsonstring = sw.toString(); + Set ras = roleService.rolesAssignments(dataset); + + roleService.rolesAssignments(dataset).stream() + .filter(ra -> ra.getRole().permissions() + .contains(Permission.PublishDataset)) + .flatMap( + ra -> roleAssigneeService + .getExplicitUsers(roleAssigneeService + .getRoleAssignee(ra.getAssigneeIdentifier())) + .stream()) + .distinct() // prevent double-send + .forEach(au -> { + + if (au.isSuperuser()) { + userNotificationService.sendNotification(au, + new Timestamp(new Date().getTime()), + UserNotification.Type.DATASETMENTIONED, dataset.getId(), + null, null, true, jsonstring); + + } + }); + sent = true; } + // .forEach( au -> userNotificationService.sendNotificationInNewTransaction(au, + // timestamp, type, dataset.getLatestVersion().getId()) ); + +// Subject: <<>>. Body: Root Support, the Root has just been notified that the http://schema.org/ScholarlyArticle http://ec2-3-236-45-73.compute-1.amazonaws.com cites "Une Démonstration.

You may contact us for support at qqmyers@hotmail.com.

Thank you,
Root Support } } } @@ -142,11 +178,15 @@ public Response acceptMessage(String body) { "Unable to process message. Please contact the administrators."); } } - } else { + } else + + { logger.info("Ignoring message from IP address: " + origin.toString()); throw new ForbiddenException("Inbox does not acept messages from this address"); } - return ok("Message Received"); + return + + ok("Message Received"); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java index 177c59c5873..58f36b1a819 100644 --- a/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/authorization/providers/builtin/DataverseUserPage.java @@ -478,6 +478,7 @@ public void displayNotification() { case GRANTFILEACCESS: case REJECTFILEACCESS: case DATASETCREATED: + case DATASETMENTIONED: userNotification.setTheObject(datasetService.find(userNotification.getObjectId())); break; diff --git a/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java index 55c6f4d83d6..03ab6da1d31 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/MailUtil.java @@ -86,8 +86,10 @@ public static String getSubjectTextBasedOnNotification(UserNotification userNoti return BundleUtil.getStringFromBundle("notification.email.ingestCompleted.subject", rootDvNameAsList); case INGESTCOMPLETEDWITHERRORS: return BundleUtil.getStringFromBundle("notification.email.ingestCompletedWithErrors.subject", rootDvNameAsList); + case DATASETMENTIONED: + return BundleUtil.getStringFromBundle("notification.email.datasetWasMentioned.subject", rootDvNameAsList); } return ""; } -} +} \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java index ae6935945e8..f4a3c635f8b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonUtil.java @@ -3,6 +3,8 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; + +import java.io.StringReader; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -56,4 +58,9 @@ public static String prettyPrint(javax.json.JsonObject jsonObject) { return stringWriter.toString(); } + public static javax.json.JsonObject getJsonObject(String serializedJson) { + try (StringReader rdr = new StringReader(serializedJson)) { + return Json.createReader(rdr).readObject(); + } + } } diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 6e4c4b9b583..a7754ffdc61 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -217,6 +217,7 @@ notification.publishFailedPidReg={0} in {1} could not be published due to a fail notification.workflowFailed=An external workflow run on {0} in {1} has failed. Check your email and/or view the Dataset page which may have additional details. Contact support if this continues to happen. notification.workflowSucceeded=An external workflow run on {0} in {1} has succeeded. Check your email and/or view the Dataset page which may have additional details. notification.statusUpdated=The status of dataset {0} has been updated to {1}. +notification.datasetMentioned=Announcement Received: Newly released {1} {2} Dataset {3}. notification.ingestCompleted=Dataset {1} has one or more tabular files that completed the tabular ingest process and are available in archival formats. notification.ingestCompletedWithErrors=Dataset {1} has one or more tabular files that are available but are not supported for tabular ingest. @@ -744,6 +745,9 @@ contact.delegation.default_personal=Dataverse Installation Admin notification.email.info.unavailable=Unavailable notification.email.apiTokenGenerated=Hello {0} {1},\n\nAPI Token has been generated. Please keep it secure as you would do with a password. notification.email.apiTokenGenerated.subject=API Token was generated +notification.email.datasetWasMentioned={0},

The {1} has just been notified that the {2}, {3}, {4} "{7}" in this repository. +notification.email.datasetWasMentioned.subject={0}: A Dataset Relationship has been reported! + # dataverse.xhtml dataverse.name=Dataverse Name diff --git a/src/main/webapp/dataverseuser.xhtml b/src/main/webapp/dataverseuser.xhtml index cb922a0164d..5c9c49dadd0 100644 --- a/src/main/webapp/dataverseuser.xhtml +++ b/src/main/webapp/dataverseuser.xhtml @@ -362,6 +362,18 @@ + + + + + + + + + #{item.theObject.getDisplayName()} + + + From d219f92541f9fc1e5408aeab0eb31f923b73c8a0 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 2 Mar 2022 11:14:58 -0500 Subject: [PATCH 09/66] cleanup --- .../harvard/iq/dataverse/api/LDNInbox.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index d4d22929f54..6a19569ea1b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -3,65 +3,42 @@ import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetServiceBean; import edu.harvard.iq.dataverse.DataverseRoleServiceBean; -import edu.harvard.iq.dataverse.DvObject; import edu.harvard.iq.dataverse.GlobalId; import edu.harvard.iq.dataverse.MailServiceBean; import edu.harvard.iq.dataverse.RoleAssigneeServiceBean; import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.UserNotification; import edu.harvard.iq.dataverse.UserNotificationServiceBean; -import edu.harvard.iq.dataverse.api.AbstractApiBean.WrappedResponse; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress; -import edu.harvard.iq.dataverse.branding.BrandingUtil; -import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; -import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetThumbnailCommand; -import edu.harvard.iq.dataverse.ldn.LDNReleaseAction; import edu.harvard.iq.dataverse.settings.SettingsServiceBean; -import edu.harvard.iq.dataverse.util.BundleUtil; -import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.util.json.JSONLDUtil; import edu.harvard.iq.dataverse.util.json.JsonLDNamespace; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; -import java.util.Arrays; import java.util.Date; import java.util.Optional; import java.util.Set; -import java.io.InputStream; -import java.io.StringReader; import java.io.StringWriter; import java.sql.Timestamp; import java.util.logging.Logger; import javax.ejb.EJB; import javax.json.Json; -import javax.json.JsonArray; import javax.json.JsonObject; -import javax.json.JsonValue; import javax.json.JsonWriter; -import javax.mail.internet.InternetAddress; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BadRequestException; import javax.ws.rs.ServiceUnavailableException; import javax.ws.rs.Consumes; import javax.ws.rs.ForbiddenException; -import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.ServerErrorException; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import org.glassfish.jersey.media.multipart.FormDataParam; - -import com.apicatalog.jsonld.JsonLd; -import com.apicatalog.jsonld.api.JsonLdError; -import com.apicatalog.jsonld.document.JsonDocument; - @Path("inbox") public class LDNInbox extends AbstractApiBean { From 035d5b08b5d17550c0ee6875cb1eb7fb66a3ebbe Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 2 Mar 2022 17:26:22 -0500 Subject: [PATCH 10/66] local updated titanium library (doesn't fix coar issue) - may not be needed (real titanium 1.2+ uses jakarata.json which we can't do yet on J2EE 8 afaik) --- .../titanium-json-ld-1.3.0-SNAPSHOT.jar | Bin 0 -> 287076 bytes pom.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 local_lib/com/apicatalog/titanium-json-ld/1.3.0-SNAPSHOT/titanium-json-ld-1.3.0-SNAPSHOT.jar diff --git a/local_lib/com/apicatalog/titanium-json-ld/1.3.0-SNAPSHOT/titanium-json-ld-1.3.0-SNAPSHOT.jar b/local_lib/com/apicatalog/titanium-json-ld/1.3.0-SNAPSHOT/titanium-json-ld-1.3.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..ee499ae4b76e473e12c1e41570a1dd189e328a8f GIT binary patch literal 287076 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 q?vOaDez com.apicatalog titanium-json-ld - 0.8.6 + 1.3.0-SNAPSHOT com.google.code.gson From 75911387b17950413ac5c9f305fe12d03fb0f03a Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 2 Mar 2022 17:27:08 -0500 Subject: [PATCH 11/66] titanium 1.2+ update --- .../java/edu/harvard/iq/dataverse/util/json/JSONLDUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3fdacbdc8de..49863a794d8 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 @@ -45,7 +45,7 @@ import org.apache.commons.lang3.StringUtils; import com.apicatalog.jsonld.JsonLd; -import com.apicatalog.jsonld.api.JsonLdError; +import com.apicatalog.jsonld.JsonLdError; import com.apicatalog.jsonld.document.JsonDocument; import edu.harvard.iq.dataverse.DatasetVersion.VersionState; From 55d65fba9f018c91a7efecb78864cf21770c7b78 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 2 Mar 2022 17:27:42 -0500 Subject: [PATCH 12/66] update to use our example format mod title -> sorg:name --- .../harvard/iq/dataverse/MailServiceBean.java | 3 +- .../harvard/iq/dataverse/api/LDNInbox.java | 61 +++++++++++++++---- src/main/java/propertyFiles/Bundle.properties | 4 +- src/main/webapp/dataverseuser.xhtml | 3 +- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java index f16eaa98831..eb12be80e16 100644 --- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java @@ -621,11 +621,12 @@ public String getMessageTextBasedOnNotification(UserNotification userNotificatio BrandingUtil.getInstallationBrandName(), citingResource.getString("@type"), citingResource.getString("@id"), + citingResource.getString("name"), citingResource.getString("relationship"), systemConfig.getDataverseSiteUrl(), dataset.getGlobalId().toString(), dataset.getDisplayName()}; - messageText += MessageFormat.format(pattern, paramArrayDatasetMentioned); + messageText = MessageFormat.format(pattern, paramArrayDatasetMentioned); return messageText; } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index 6a19569ea1b..20951e4167b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -18,6 +18,7 @@ import edu.harvard.iq.dataverse.util.json.JsonLDTerm; import java.util.Date; +import java.util.Map; import java.util.Optional; import java.util.Set; import java.io.StringWriter; @@ -27,6 +28,7 @@ import javax.ejb.EJB; import javax.json.Json; import javax.json.JsonObject; +import javax.json.JsonValue; import javax.json.JsonWriter; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BadRequestException; @@ -75,27 +77,60 @@ public Response acceptMessage(String body) { String citingPID = null; String citingType = null; boolean sent = false; - JsonObject jsonld = JSONLDUtil.decontextualizeJsonLD(body); + + JsonObject jsonld = null; + jsonld = JSONLDUtil.decontextualizeJsonLD(body); + if (jsonld == null) { + // Kludge - something about the coar notify URL causes a + // LOADING_REMOTE_CONTEXT_FAILED error in the titanium library - so replace it + // and try with a local copy + body = body.replace("\"https://purl.org/coar/notify\"", + "{\n" + " \"@vocab\": \"http://purl.org/coar/notify_vocabulary/\",\n" + + " \"ietf\": \"http://www.iana.org/assignments/relation/\",\n" + + " \"coar-notify\": \"http://purl.org/coar/notify_vocabulary/\",\n" + + " \"sorg\": \"http://schema.org/\",\n" + + " \"ReviewAction\": \"coar-notify:ReviewAction\",\n" + + " \"EndorsementAction\": \"coar-notify:EndorsementAction\",\n" + + " \"IngestAction\": \"coar-notify:IngestAction\",\n" + + " \"ietf:cite-as\": {\n" + " \"@type\": \"@id\"\n" + + " }}"); + jsonld = JSONLDUtil.decontextualizeJsonLD(body); + } if (jsonld == null) { throw new BadRequestException("Could not parse message to find acceptable citation link to a dataset."); } String relationship = "isRelatedTo"; - if (jsonld.containsKey(JsonLDTerm.schemaOrg("identifier").getUrl())) { - citingPID = jsonld.getJsonObject(JsonLDTerm.schemaOrg("identifier").getUrl()).getString("@id"); + String name = null; + JsonLDNamespace activityStreams = JsonLDNamespace.defineNamespace("as", + "https://www.w3.org/ns/activitystreams#"); + JsonLDNamespace ietf = JsonLDNamespace.defineNamespace("ietf", "http://www.iana.org/assignments/relation/"); + String objectKey = new JsonLDTerm(activityStreams, "object").getUrl(); + if (jsonld.containsKey(objectKey)) { + JsonObject msgObject = jsonld.getJsonObject(objectKey); + + citingPID = msgObject.getJsonObject(new JsonLDTerm(ietf, "cite-as").getUrl()).getString("@id"); logger.fine("Citing PID: " + citingPID); - if (jsonld.containsKey("@type")) { - citingType = jsonld.getString("@type"); + if (msgObject.containsKey("@type")) { + citingType = msgObject.getString("@type"); if (citingType.startsWith(JsonLDNamespace.schema.getUrl())) { citingType = citingType.replace(JsonLDNamespace.schema.getUrl(), ""); } + if(msgObject.containsKey(JsonLDTerm.schemaOrg("name").getUrl())) { + name = msgObject.getString(JsonLDTerm.schemaOrg("name").getUrl()); + } logger.fine("Citing Type: " + citingType); - if (jsonld.containsKey(JsonLDTerm.schemaOrg("citation").getUrl())) { - JsonObject citation = jsonld.getJsonObject(JsonLDTerm.schemaOrg("citation").getUrl()); - if (citation != null) { - if (citation.containsKey("@type") - && citation.getString("@type").equals(JsonLDTerm.schemaOrg("Dataset").getUrl()) - && citation.containsKey(JsonLDTerm.schemaOrg("identifier").getUrl())) { - String pid = citation.getString(JsonLDTerm.schemaOrg("identifier").getUrl()); + String contextKey = new JsonLDTerm(activityStreams, "context").getUrl(); + + if (jsonld.containsKey(contextKey)) { + JsonObject context = jsonld.getJsonObject(contextKey); + for (Map.Entry entry : context.entrySet()) { + + relationship = entry.getKey().replace("_:", ""); + // Assuming only one for now - should check for array and loop + JsonObject citedResource = (JsonObject) entry.getValue(); + String pid = citedResource.getJsonObject(new JsonLDTerm(ietf, "cite-as").getUrl()) + .getString("@id"); + if (citedResource.getString("@type").equals(JsonLDTerm.schemaOrg("Dataset").getUrl())) { logger.fine("Raw PID: " + pid); if (pid.startsWith(GlobalId.DOI_RESOLVER_URL)) { pid = pid.replace(GlobalId.DOI_RESOLVER_URL, GlobalId.DOI_PROTOCOL + ":"); @@ -107,7 +142,7 @@ public Response acceptMessage(String body) { Dataset dataset = datasetSvc.findByGlobalId(pid); if (dataset != null) { JsonObject citingResource = Json.createObjectBuilder().add("@id", citingPID) - .add("@type", citingType).add("relationship", relationship).build(); + .add("@type", citingType).add("relationship", relationship).add("name", name).build(); StringWriter sw = new StringWriter(128); try (JsonWriter jw = Json.createWriter(sw)) { jw.write(citingResource); diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index a7754ffdc61..5bddc773453 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -217,7 +217,7 @@ notification.publishFailedPidReg={0} in {1} could not be published due to a fail notification.workflowFailed=An external workflow run on {0} in {1} has failed. Check your email and/or view the Dataset page which may have additional details. Contact support if this continues to happen. notification.workflowSucceeded=An external workflow run on {0} in {1} has succeeded. Check your email and/or view the Dataset page which may have additional details. notification.statusUpdated=The status of dataset {0} has been updated to {1}. -notification.datasetMentioned=Announcement Received: Newly released {1} {2} Dataset {3}. +notification.datasetMentioned=Announcement Received: Newly released {0} {2} {3} Dataset {4}. notification.ingestCompleted=Dataset {1} has one or more tabular files that completed the tabular ingest process and are available in archival formats. notification.ingestCompletedWithErrors=Dataset {1} has one or more tabular files that are available but are not supported for tabular ingest. @@ -745,7 +745,7 @@ contact.delegation.default_personal=Dataverse Installation Admin notification.email.info.unavailable=Unavailable notification.email.apiTokenGenerated=Hello {0} {1},\n\nAPI Token has been generated. Please keep it secure as you would do with a password. notification.email.apiTokenGenerated.subject=API Token was generated -notification.email.datasetWasMentioned={0},

The {1} has just been notified that the {2}, {3}, {4} "{7}" in this repository. +notification.email.datasetWasMentioned=Hello {0},

The {1} has just been notified that the {2}, {4}, {5} "{8}" in this repository. notification.email.datasetWasMentioned.subject={0}: A Dataset Relationship has been reported! diff --git a/src/main/webapp/dataverseuser.xhtml b/src/main/webapp/dataverseuser.xhtml index 5c9c49dadd0..80deae71db7 100644 --- a/src/main/webapp/dataverseuser.xhtml +++ b/src/main/webapp/dataverseuser.xhtml @@ -366,8 +366,9 @@ - + + #{item.theObject.getDisplayName()} From 45f6547fd42fcca95a33fecd07256c317feb2ea8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 3 Mar 2022 15:27:40 -0500 Subject: [PATCH 13/66] fix consumes mimetype --- src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index 20951e4167b..dbaf62d9fad 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -68,7 +68,7 @@ public class LDNInbox extends AbstractApiBean { @POST @Path("/") - @Consumes(MediaType.APPLICATION_JSON + "+ld") + @Consumes("application/ld+json, application/json-ld") public Response acceptMessage(String body) { IpAddress origin = new DataverseRequest(null, httpRequest).getSourceAddress(); String whitelist = settingsService.get(SettingsServiceBean.Key.MessageHosts.toString(), "*"); From 7a69aa95892f2d957ea1e40f2b10a89fd59e0241 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 4 Mar 2022 15:28:11 -0500 Subject: [PATCH 14/66] update DASH type to DASH-NRS --- scripts/api/data/metadatablocks/citation.tsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/api/data/metadatablocks/citation.tsv b/scripts/api/data/metadatablocks/citation.tsv index 9e2ec172ba4..ecd31065698 100644 --- a/scripts/api/data/metadatablocks/citation.tsv +++ b/scripts/api/data/metadatablocks/citation.tsv @@ -111,7 +111,7 @@ publicationIDType upc 14 publicationIDType url 15 publicationIDType urn 16 - publicationIDType DASH 17 + publicationIDType DASH-NRS 17 contributorType Data Collector 0 contributorType Data Curator 1 contributorType Data Manager 2 From 7c5e0bb4dbc1a4791aed2e003b16af124c933e4a Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 17 Mar 2022 14:10:10 -0400 Subject: [PATCH 15/66] refactor OREMap, start LDN workflow step --- .../iq/dataverse/util/bagit/OREMap.java | 165 +++++---- .../LDNAnnounceDatasetVersionStep.java | 333 ++++++++++++++++++ 2 files changed, 422 insertions(+), 76 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java 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 38a04b36314..19471753b51 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 @@ -95,82 +95,11 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) throws Except for (DatasetField field : fields) { if (!field.isEmpty()) { DatasetFieldType dfType = field.getDatasetFieldType(); - if (excludeEmail && DatasetFieldType.FieldType.EMAIL.equals(dfType.getFieldType())) { - continue; - } JsonLDTerm fieldName = getTermFor(dfType); - if (fieldName.inNamespace()) { - localContext.putIfAbsent(fieldName.getNamespace().getPrefix(), fieldName.getNamespace().getUrl()); - } else { - localContext.putIfAbsent(fieldName.getLabel(), fieldName.getUrl()); - } - JsonArrayBuilder vals = Json.createArrayBuilder(); - if (!dfType.isCompound()) { - for (String val : field.getValues_nondisplay()) { - if (cvocMap.containsKey(dfType.getId())) { - try { - JsonObject cvocEntry = cvocMap.get(dfType.getId()); - if (cvocEntry.containsKey("retrieval-filtering")) { - JsonObject filtering = cvocEntry.getJsonObject("retrieval-filtering"); - JsonObject context = filtering.getJsonObject("@context"); - for (String prefix : context.keySet()) { - localContext.putIfAbsent(prefix, context.getString(prefix)); - } - vals.add(datasetFieldService.getExternalVocabularyValue(val)); - } else { - vals.add(val); - } - } catch(Exception e) { - logger.warning("Couldn't interpret value for : " + val + " : " + e.getMessage()); - logger.log(Level.FINE, ExceptionUtils.getStackTrace(e)); - vals.add(val); - } - } else { - vals.add(val); - } - } - } else { - // ToDo: Needs to be recursive (as in JsonPrinter?) - for (DatasetFieldCompoundValue dscv : field.getDatasetFieldCompoundValues()) { - // compound values are of different types - JsonObjectBuilder child = Json.createObjectBuilder(); - - for (DatasetField dsf : dscv.getChildDatasetFields()) { - DatasetFieldType dsft = dsf.getDatasetFieldType(); - if (excludeEmail && DatasetFieldType.FieldType.EMAIL.equals(dsft.getFieldType())) { - continue; - } - // which may have multiple values - if (!dsf.isEmpty()) { - // Add context entry - // ToDo - also needs to recurse here? - JsonLDTerm subFieldName = getTermFor(dfType, dsft); - if (subFieldName.inNamespace()) { - localContext.putIfAbsent(subFieldName.getNamespace().getPrefix(), - subFieldName.getNamespace().getUrl()); - } else { - localContext.putIfAbsent(subFieldName.getLabel(), subFieldName.getUrl()); - } - - List values = dsf.getValues_nondisplay(); - if (values.size() > 1) { - JsonArrayBuilder childVals = Json.createArrayBuilder(); - - for (String val : dsf.getValues_nondisplay()) { - childVals.add(val); - } - child.add(subFieldName.getLabel(), childVals); - } else { - child.add(subFieldName.getLabel(), values.get(0)); - } - } - } - vals.add(child); - } + JsonValue jv = getJsonLDForField(field, excludeEmail, cvocMap, localContext); + if(jv!=null) { + aggBuilder.add(fieldName.getLabel(), jv); } - // Add metadata value to aggregation, suppress array when only one value - JsonArray valArray = vals.build(); - aggBuilder.add(fieldName.getLabel(), (valArray.size() != 1) ? valArray : valArray.get(0)); } } // Add metadata related to the Dataset/DatasetVersion @@ -183,6 +112,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) throws Except .add(JsonLDTerm.schemaOrg("dateModified").getLabel(), version.getLastUpdateTime().toString()); addIfNotNull(aggBuilder, JsonLDTerm.schemaOrg("datePublished"), dataset.getPublicationDateFormattedYYYYMMDD()); + TermsOfUseAndAccess terms = version.getTermsOfUseAndAccess(); if (terms.getLicense() != null) { aggBuilder.add(JsonLDTerm.schemaOrg("license").getLabel(), @@ -384,7 +314,7 @@ private JsonLDTerm getTermFor(String fieldTypeName) { return null; } - private JsonLDTerm getTermFor(DatasetFieldType dsft) { + public static JsonLDTerm getTermFor(DatasetFieldType dsft) { if (dsft.getUri() != null) { return new JsonLDTerm(dsft.getTitle(), dsft.getUri()); } else { @@ -398,7 +328,7 @@ private JsonLDTerm getTermFor(DatasetFieldType dsft) { } } - private JsonLDTerm getTermFor(DatasetFieldType dfType, DatasetFieldType dsft) { + public static JsonLDTerm getTermFor(DatasetFieldType dfType, DatasetFieldType dsft) { if (dsft.getUri() != null) { return new JsonLDTerm(dsft.getTitle(), dsft.getUri()); } else { @@ -430,6 +360,89 @@ private JsonLDTerm getTermFor(String type, String subType) { } return null; } + + public static JsonValue getJsonLDForField(DatasetField field, Boolean excludeEmail, Map cvocMap, + Map localContext) { + + DatasetFieldType dfType = field.getDatasetFieldType(); + if (excludeEmail && DatasetFieldType.FieldType.EMAIL.equals(dfType.getFieldType())) { + return null; + } + + JsonLDTerm fieldName = getTermFor(dfType); + if (fieldName.inNamespace()) { + localContext.putIfAbsent(fieldName.getNamespace().getPrefix(), fieldName.getNamespace().getUrl()); + } else { + localContext.putIfAbsent(fieldName.getLabel(), fieldName.getUrl()); + } + JsonArrayBuilder vals = Json.createArrayBuilder(); + if (!dfType.isCompound()) { + for (String val : field.getValues_nondisplay()) { + if (cvocMap.containsKey(dfType.getId())) { + try { + JsonObject cvocEntry = cvocMap.get(dfType.getId()); + if (cvocEntry.containsKey("retrieval-filtering")) { + JsonObject filtering = cvocEntry.getJsonObject("retrieval-filtering"); + JsonObject context = filtering.getJsonObject("@context"); + for (String prefix : context.keySet()) { + localContext.putIfAbsent(prefix, context.getString(prefix)); + } + vals.add(datasetFieldService.getExternalVocabularyValue(val)); + } else { + vals.add(val); + } + } catch (Exception e) { + logger.warning("Couldn't interpret value for : " + val + " : " + e.getMessage()); + logger.log(Level.FINE, ExceptionUtils.getStackTrace(e)); + vals.add(val); + } + } else { + vals.add(val); + } + } + } else { + // ToDo: Needs to be recursive (as in JsonPrinter?) + for (DatasetFieldCompoundValue dscv : field.getDatasetFieldCompoundValues()) { + // compound values are of different types + JsonObjectBuilder child = Json.createObjectBuilder(); + + for (DatasetField dsf : dscv.getChildDatasetFields()) { + DatasetFieldType dsft = dsf.getDatasetFieldType(); + if (excludeEmail && DatasetFieldType.FieldType.EMAIL.equals(dsft.getFieldType())) { + continue; + } + // which may have multiple values + if (!dsf.isEmpty()) { + // Add context entry + // ToDo - also needs to recurse here? + JsonLDTerm subFieldName = getTermFor(dfType, dsft); + if (subFieldName.inNamespace()) { + localContext.putIfAbsent(subFieldName.getNamespace().getPrefix(), + subFieldName.getNamespace().getUrl()); + } else { + localContext.putIfAbsent(subFieldName.getLabel(), subFieldName.getUrl()); + } + + List values = dsf.getValues_nondisplay(); + if (values.size() > 1) { + JsonArrayBuilder childVals = Json.createArrayBuilder(); + + for (String val : dsf.getValues_nondisplay()) { + childVals.add(val); + } + child.add(subFieldName.getLabel(), childVals); + } else { + child.add(subFieldName.getLabel(), values.get(0)); + } + } + } + vals.add(child); + } + } + // Add metadata value to aggregation, suppress array when only one value + JsonArray valArray = vals.build(); + return (valArray.size() != 1) ? valArray : valArray.get(0); + } public static void injectSettingsService(SettingsServiceBean settingsSvc, DatasetFieldServiceBean datasetFieldSvc) { settingsService = settingsSvc; diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java new file mode 100644 index 00000000000..62269019c42 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -0,0 +1,333 @@ +package edu.harvard.iq.dataverse.workflow.internalspi; + +import edu.harvard.iq.dataverse.DatasetField; +import edu.harvard.iq.dataverse.DatasetFieldCompoundValue; +import edu.harvard.iq.dataverse.DatasetFieldType; +import edu.harvard.iq.dataverse.DatasetVersion; +import edu.harvard.iq.dataverse.branding.BrandingUtil; +import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.bagit.OREMap; +import edu.harvard.iq.dataverse.util.json.JsonLDTerm; +import edu.harvard.iq.dataverse.workflow.WorkflowContext; +import edu.harvard.iq.dataverse.workflow.WorkflowContext.TriggerType; +import edu.harvard.iq.dataverse.workflow.step.Failure; +import edu.harvard.iq.dataverse.workflow.step.Pending; +import edu.harvard.iq.dataverse.workflow.step.WorkflowStep; +import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; +import static edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult.OK; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; + +import javax.json.Json; +import javax.json.JsonArray; +import javax.json.JsonArrayBuilder; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; +import javax.json.JsonValue; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethodBase; +import org.apache.commons.httpclient.URI; +import org.apache.commons.httpclient.URIException; +import org.apache.commons.httpclient.methods.DeleteMethod; +import org.apache.commons.httpclient.methods.EntityEnclosingMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; + +/** + * A workflow step that generates and sends an LDN Announcement message to the + * inbox of a configured target. THe initial use case is for Dataverse to + * anounce new dataset versions to the Harvard DASH preprint repository so that + * a DASH admin can create a backlink for any dataset versions that reference a + * DASH deposit or a paper with a DOI where DASH has a preprint copy. + * + * @author qqmyers + */ + +public class LDNAnnounceDatasetVersionStep implements WorkflowStep { + private static final Logger logger = Logger.getLogger(LDNAnnounceDatasetVersionStep.class.getName()); + private final Map params; + + private static final String REQUIRED_FIELDS = ":LDNAnnounceRequiredFields"; + private static final String RELATED_PUBLICATION = "publication"; + + JsonLDTerm publicationIDType = null; + JsonLDTerm publicationIDNumber = null; + JsonLDTerm publicationURL = null; + + public LDNAnnounceDatasetVersionStep(Map paramSet) { + params = new HashMap<>(paramSet); + } + + @Override + public WorkflowStepResult run(WorkflowContext context) { + CloseableHttpClient client = HttpClients.createDefault(); + + try { + // build method + HttpPost announcement = buildMethod(false, context); + // execute + int responseStatus = client.execute(mtd); + if (responseStatus >= 200 && responseStatus < 300) { + // HTTP OK range + return OK; + } else { + String responseBody = mtd.getResponseBodyAsString(); + return new Failure("Error communicating with server. Server response: " + responseBody + " (" + + responseStatus + ")."); + } + + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error communicating with remote server: " + ex.getMessage(), ex); + return new Failure("Error executing request: " + ex.getLocalizedMessage(), + "Cannot communicate with remote server."); + } + } + + @Override + public WorkflowStepResult resume(WorkflowContext context, Map internalData, String externalData) { + throw new UnsupportedOperationException("Not supported yet."); // This class does not need to resume. + } + + @Override + public void rollback(WorkflowContext context, Failure reason) { + HttpClient client = new HttpClient(); + + try { + // build method + HttpPost post = buildAnnouncement(context); + if (post != null) { + + // execute + int responseStatus = client.executeMethod(mtd); + if (responseStatus < 200 || responseStatus >= 300) { + // out of HTTP OK range + String responseBody = mtd.getResponseBodyAsString(); + Logger.getLogger(LDNAnnounceDatasetVersionStep.class.getName()).log(Level.WARNING, + "Bad response from remote server while rolling back step: {0}", responseBody); + } + } + } catch (Exception ex) { + Logger.getLogger(LDNAnnounceDatasetVersionStep.class.getName()).log(Level.WARNING, + "IO error rolling back step: " + ex.getMessage(), ex); + } + } + + HttpPost buildAnnouncement(WorkflowContext ctxt) throws Exception { + + //First check that we have what is required + DatasetVersion dv = ctxt.getDataset().getReleasedVersion(); + List dvf = dv.getDatasetFields(); + Map fields = new HashMap(); + String[] requiredFields = ((String) ctxt.getSettings().getOrDefault(REQUIRED_FIELDS, "")).split(",\\s*"); + for(String field:requiredFields) { + fields.put(field, null); + } + Set reqFields = fields.keySet(); + for(DatasetField df: dvf) { + if (reqFields.contains(df.getDatasetFieldType().getName())) { + fields.put(df.getDatasetFieldType().getName(), df); + } + } + if(fields.containsValue(null)) { + logger.fine("DatasetVersion doesn't contain metadata required to trigger announcement"); + return null; + } + //We do, so constreuct the json-ld body and method + + HttpPost ann = new HttpPost(); + Map localContext = new HashMap(); + JsonObjectBuilder coarContext = Json.createObjectBuilder(); + Map emptyCvocMap = new HashMap(); + for(Entry entry: fields.entrySet()) { + DatasetField field = entry.getValue(); + DatasetFieldType dft =field.getDatasetFieldType(); + String uri = dft.getUri(); + String dfTypeName=entry.getKey(); + switch(dfTypeName) { + case RELATED_PUBLICATION : + JsonArrayBuilder relArrayBuilder = Json.createArrayBuilder(); + publicationIDType = null; + publicationIDNumber = null; + publicationURL = null; + Collection childTypes = dft.getChildDatasetFieldTypes(); + for(DatasetFieldType cdft: childTypes) { + switch (cdft.getName()) { + case "publicationURL": + publicationURL = OREMap.getTermFor(dft, cdft); + break; + case "publicationIDType" : + publicationIDType = OREMap.getTermFor(dft, cdft); + break; + case "publicationIDNumber" : + publicationIDNumber = OREMap.getTermFor(dft, cdft); +break; + } + + } + JsonValue jv = OREMap.getJsonLDForField(field, false, emptyCvocMap, localContext); + if(jv !=null) { + if (jv instanceof JsonArray) { + JsonArray rels = (JsonArray) jv; + for(JsonObject jo: rels.getValuesAs(JsonObject.class)) { + String id = getBestPubId(jo); + + + relArrayBuilder.add(Json.createObjectBuilder().add("id", number).add("ietf:cite-as", number).add("type","sorg:ScholaryArticle").build()); + } + } + + } + else { // JsonObject + } + } + } + + if + break; + default: + JsonValue jv = OREMap.getJsonLDForField(field, false, emptyCvocMap, localContext); + if(jv!=null) { + coarContext.add(OREMap.getTermFor(dft).getLabel(), jv); + } + + } + dvf.get(0).getDatasetFieldType().getName(); + JsonObjectBuilder job = Json.createObjectBuilder(); + + job.add("@context", Json.createArrayBuilder().add("https://purl.org/coar/notify").add("https://www.w3.org/ns/activitystreams").build()); + job.add("id", "urn:uuid:" + UUID.randomUUID().toString()); + job.add("actor", Json.createObjectBuilder().add("id", SystemConfig.getDataverseSiteUrlStatic()).add("name",BrandingUtil.getInstallationBrandName()).add("type","Service")); + + /* + { + "@context": [ + "https://purl.org/coar/notify", + "https://www.w3.org/ns/activitystreams" + ], + "id": "urn:uuid:a301c520-f790-4f3d-87b1-a18b2b617683", + "actor": { + "id": "http://ec2-35-170-82-7.compute-1.amazonaws.com", + "name": "Dataverse Repository", + "type": "Service" + }, + "context": { + "IsSupplementTo": [ + { + "id": "https://dashv7-dev.lib.harvard.edu/handle/123456789/34723317", + "ietf:cite-as": "https://dashv7-dev.lib.harvard.edu/handle/123456789/34723317", + "type": "sorg:ScholarlyArticle" + } + ] + }, + "object": { + "id": "http://ec2-35-170-82-7.compute-1.amazonaws.com/dataset.xhtml?persistentId=doi:10.5072/FK2/OMSPHN", + "ietf:cite-as": "https://doi.org/10.5072/FK2/OMSPHN", + "sorg:name": "An Interesting Dataset", + "type": "sorg:Dataset" + }, + "origin": { + "id": "http://ec2-35-170-82-7.compute-1.amazonaws.com", + "inbox": "http://ec2-35-170-82-7.compute-1.amazonaws.com/api/inbox", + "type": "Service" + }, + "target": { + "id": "https://dashv7-dev.lib.harvard.edu", + "inbox": "https://dashv7-api-dev.lib.harvard.edu/server/ldn/inbox", + "type": "Service" + }, + "type": [ + "Announce", + "coar-notify:ReleaseAction" + ] + } + */ + Map templateParams = new HashMap<>(); + templateParams.put( "invocationId", ctxt.getInvocationId() ); + templateParams.put( "dataset.id", Long.toString(ctxt.getDataset().getId()) ); + templateParams.put( "dataset.identifier", ctxt.getDataset().getIdentifier() ); + templateParams.put( "dataset.globalId", ctxt.getDataset().getGlobalIdString() ); + templateParams.put( "dataset.displayName", ctxt.getDataset().getDisplayName() ); + templateParams.put( "dataset.citation", ctxt.getDataset().getCitation() ); + templateParams.put( "minorVersion", Long.toString(ctxt.getNextMinorVersionNumber()) ); + templateParams.put( "majorVersion", Long.toString(ctxt.getNextVersionNumber()) ); + templateParams.put( "releaseStatus", (ctxt.getType()==TriggerType.PostPublishDataset) ? "done":"in-progress" ); + + m.addRequestHeader("Content-Type", params.getOrDefault("contentType", "text/plain")); + + String urlKey = rollback ? "rollbackUrl":"url"; + String url = params.get(urlKey); + try { + m.setURI(new URI(process(url,templateParams), true) ); + } catch (URIException ex) { + throw new IllegalStateException("Illegal URL: '" + url + "'"); + } + + String bodyKey = (rollback ? "rollbackBody" : "body"); + if ( params.containsKey(bodyKey) && m instanceof EntityEnclosingMethod ) { + String body = params.get(bodyKey); + ((EntityEnclosingMethod)m).setRequestEntity(new StringRequestEntity(process( body, templateParams))); + } + + return m; + } + + private String getBestPubId(JsonObject jo) { + String id=null; + if(jo.containsKey(publicationURL.getLabel()) ) { + id=jo.getString(publicationURL.getLabel()); + } else if(jo.containsKey(publicationIDType.getLabel())) { + if((jo.containsKey(publicationIDNumber.getLabel())) ) { + String number = jo.getString(publicationIDNumber.getLabel()); + + switch (jo.getString(publicationIDType.getLabel())) { + case "doi": + if(number.startsWith("https://doi.org/")) { + id = number; + } else if(number.startsWith("doi:")) { + id = "https://doi.org/" + doi.substring(4); + } + + break; + case "DASH-URN": + if(number.startsWith("http")) { + id=number; + } +break; + } + } + } + return id; + } + + String process(String template, Map values) { + String curValue = template; + for (Map.Entry ent : values.entrySet()) { + String val = ent.getValue(); + if (val == null) { + val = ""; + } + String varRef = "${" + ent.getKey() + "}"; + while (curValue.contains(varRef)) { + curValue = curValue.replace(varRef, val); + } + } + + return curValue; + } + +} From 5ec06798171284abb5c893ca9cb10f4a9ca0ff3b Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 18 Mar 2022 09:19:59 -0400 Subject: [PATCH 16/66] Add a centralized method that can replace lots of others --- src/main/java/edu/harvard/iq/dataverse/Dataset.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 569a5cdfd2a..2e358fc77c5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -35,6 +35,7 @@ import javax.persistence.TemporalType; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.StringUtil; +import edu.harvard.iq.dataverse.util.SystemConfig; /** * @@ -748,6 +749,11 @@ public void setHarvestIdentifier(String harvestIdentifier) { this.harvestIdentifier = harvestIdentifier; } + public String getLocalURL() { + //Assumes GlobalId != null + return SystemConfig.getDataverseSiteUrlStatic() + "/dataset.xhtml?persistentId=" + this.getGlobalId().asString(); + } + public String getRemoteArchiveURL() { if (isHarvested()) { if (HarvestingClient.HARVEST_STYLE_DATAVERSE.equals(this.getHarvestedFrom().getHarvestStyle())) { From fa2cf31dd0727f13cd929d9f114113da0aa22998 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 18 Mar 2022 09:21:02 -0400 Subject: [PATCH 17/66] sample workflow file --- .../workflows/internal-ldnannounce-workflow.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 scripts/api/data/workflows/internal-ldnannounce-workflow.json diff --git a/scripts/api/data/workflows/internal-ldnannounce-workflow.json b/scripts/api/data/workflows/internal-ldnannounce-workflow.json new file mode 100644 index 00000000000..9cf058b68a1 --- /dev/null +++ b/scripts/api/data/workflows/internal-ldnannounce-workflow.json @@ -0,0 +1,16 @@ +{ + "name": "LDN Announce workflow", + "steps": [ + { + "provider":":internal", + "stepType":"ldnannounce", + "parameters": { + "stepName":"LDN Announce" + }, + "requiredSettings": { + ":LDNAnnounceRequiredFields": "string", + ":LDNTarget": "string" + } + } + ] +} From 19e78afb2e7d5df9e3707560824e2d0b09a12c3a Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 18 Mar 2022 09:21:35 -0400 Subject: [PATCH 18/66] completed class --- .../LDNAnnounceDatasetVersionStep.java | 316 +++++++----------- 1 file changed, 129 insertions(+), 187 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index 62269019c42..d4e245ec69d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -1,21 +1,23 @@ package edu.harvard.iq.dataverse.workflow.internalspi; +import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetField; -import edu.harvard.iq.dataverse.DatasetFieldCompoundValue; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.branding.BrandingUtil; import edu.harvard.iq.dataverse.util.SystemConfig; import edu.harvard.iq.dataverse.util.bagit.OREMap; import edu.harvard.iq.dataverse.util.json.JsonLDTerm; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import edu.harvard.iq.dataverse.workflow.WorkflowContext; -import edu.harvard.iq.dataverse.workflow.WorkflowContext.TriggerType; import edu.harvard.iq.dataverse.workflow.step.Failure; -import edu.harvard.iq.dataverse.workflow.step.Pending; import edu.harvard.iq.dataverse.workflow.step.WorkflowStep; import edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult; import static edu.harvard.iq.dataverse.workflow.step.WorkflowStepResult.OK; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -25,8 +27,6 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Pattern; - import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonArrayBuilder; @@ -34,17 +34,9 @@ import javax.json.JsonObjectBuilder; import javax.json.JsonValue; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpMethodBase; -import org.apache.commons.httpclient.URI; -import org.apache.commons.httpclient.URIException; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.EntityEnclosingMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; @@ -60,42 +52,56 @@ public class LDNAnnounceDatasetVersionStep implements WorkflowStep { private static final Logger logger = Logger.getLogger(LDNAnnounceDatasetVersionStep.class.getName()); - private final Map params; - private static final String REQUIRED_FIELDS = ":LDNAnnounceRequiredFields"; + private static final String LDN_TARGET = ":LDNTarget"; private static final String RELATED_PUBLICATION = "publication"; - + JsonLDTerm publicationIDType = null; JsonLDTerm publicationIDNumber = null; JsonLDTerm publicationURL = null; public LDNAnnounceDatasetVersionStep(Map paramSet) { - params = new HashMap<>(paramSet); + new HashMap<>(paramSet); } @Override public WorkflowStepResult run(WorkflowContext context) { - CloseableHttpClient client = HttpClients.createDefault(); - try { + JsonObject target = JsonUtil.getJsonObject((String) context.getSettings().get(LDN_TARGET)); + if (target != null) { + String inboxUrl = target.getString("inbox"); + + CloseableHttpClient client = HttpClients.createDefault(); + // build method - HttpPost announcement = buildMethod(false, context); - // execute - int responseStatus = client.execute(mtd); - if (responseStatus >= 200 && responseStatus < 300) { - // HTTP OK range - return OK; - } else { - String responseBody = mtd.getResponseBodyAsString(); - return new Failure("Error communicating with server. Server response: " + responseBody + " (" - + responseStatus + ")."); + + HttpPost announcement; + try { + announcement = buildAnnouncement(false, context, target); + } catch (URISyntaxException e) { + return new Failure("LDNAnnounceDatasetVersion workflow step failed: unable to parse inbox in :LDNTarget setting."); } + // execute + try (CloseableHttpResponse response = client.execute(announcement)) { + int code = response.getStatusLine().getStatusCode(); + if (code >= 200 && code < 300) { + // HTTP OK range + return OK; + } else { + String responseBody = new String(response.getEntity().getContent().readAllBytes(), + StandardCharsets.UTF_8); + ; + return new Failure("Error communicating with " + inboxUrl + ". Server response: " + responseBody + + " (" + response + ")."); + } - } catch (Exception ex) { - logger.log(Level.SEVERE, "Error communicating with remote server: " + ex.getMessage(), ex); - return new Failure("Error executing request: " + ex.getLocalizedMessage(), - "Cannot communicate with remote server."); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error communicating with remote server: " + ex.getMessage(), ex); + return new Failure("Error executing request: " + ex.getLocalizedMessage(), + "Cannot communicate with remote server."); + } } + return new Failure("LDNAnnounceDatasetVersion workflow step failed: :LDNTarget setting missing or invalid."); } @Override @@ -105,210 +111,146 @@ public WorkflowStepResult resume(WorkflowContext context, Map in @Override public void rollback(WorkflowContext context, Failure reason) { - HttpClient client = new HttpClient(); - - try { - // build method - HttpPost post = buildAnnouncement(context); - if (post != null) { - - // execute - int responseStatus = client.executeMethod(mtd); - if (responseStatus < 200 || responseStatus >= 300) { - // out of HTTP OK range - String responseBody = mtd.getResponseBodyAsString(); - Logger.getLogger(LDNAnnounceDatasetVersionStep.class.getName()).log(Level.WARNING, - "Bad response from remote server while rolling back step: {0}", responseBody); - } - } - } catch (Exception ex) { - Logger.getLogger(LDNAnnounceDatasetVersionStep.class.getName()).log(Level.WARNING, - "IO error rolling back step: " + ex.getMessage(), ex); - } + throw new UnsupportedOperationException("Not supported yet."); // This class does not need to resume. } - HttpPost buildAnnouncement(WorkflowContext ctxt) throws Exception { - - //First check that we have what is required + HttpPost buildAnnouncement(boolean b, WorkflowContext ctxt, JsonObject target) throws URISyntaxException { + + // First check that we have what is required DatasetVersion dv = ctxt.getDataset().getReleasedVersion(); List dvf = dv.getDatasetFields(); Map fields = new HashMap(); String[] requiredFields = ((String) ctxt.getSettings().getOrDefault(REQUIRED_FIELDS, "")).split(",\\s*"); - for(String field:requiredFields) { + for (String field : requiredFields) { fields.put(field, null); } Set reqFields = fields.keySet(); - for(DatasetField df: dvf) { + for (DatasetField df : dvf) { if (reqFields.contains(df.getDatasetFieldType().getName())) { fields.put(df.getDatasetFieldType().getName(), df); } } - if(fields.containsValue(null)) { + if (fields.containsValue(null)) { logger.fine("DatasetVersion doesn't contain metadata required to trigger announcement"); return null; } - //We do, so constreuct the json-ld body and method - - HttpPost ann = new HttpPost(); + // We do, so construct the json-ld body and method + Map localContext = new HashMap(); JsonObjectBuilder coarContext = Json.createObjectBuilder(); Map emptyCvocMap = new HashMap(); - for(Entry entry: fields.entrySet()) { + boolean includeLocalContext = false; + for (Entry entry : fields.entrySet()) { DatasetField field = entry.getValue(); - DatasetFieldType dft =field.getDatasetFieldType(); - String uri = dft.getUri(); - String dfTypeName=entry.getKey(); - switch(dfTypeName) { - case RELATED_PUBLICATION : + DatasetFieldType dft = field.getDatasetFieldType(); + String dfTypeName = entry.getKey(); + JsonValue jv = OREMap.getJsonLDForField(field, false, emptyCvocMap, localContext); + switch (dfTypeName) { + case RELATED_PUBLICATION: JsonArrayBuilder relArrayBuilder = Json.createArrayBuilder(); publicationIDType = null; publicationIDNumber = null; publicationURL = null; Collection childTypes = dft.getChildDatasetFieldTypes(); - for(DatasetFieldType cdft: childTypes) { + for (DatasetFieldType cdft : childTypes) { switch (cdft.getName()) { case "publicationURL": publicationURL = OREMap.getTermFor(dft, cdft); break; - case "publicationIDType" : + case "publicationIDType": publicationIDType = OREMap.getTermFor(dft, cdft); - break; - case "publicationIDNumber" : + break; + case "publicationIDNumber": publicationIDNumber = OREMap.getTermFor(dft, cdft); -break; + break; } - + } - JsonValue jv = OREMap.getJsonLDForField(field, false, emptyCvocMap, localContext); - if(jv !=null) { + + if (jv != null) { if (jv instanceof JsonArray) { - JsonArray rels = (JsonArray) jv; - for(JsonObject jo: rels.getValuesAs(JsonObject.class)) { - String id = getBestPubId(jo); - - - relArrayBuilder.add(Json.createObjectBuilder().add("id", number).add("ietf:cite-as", number).add("type","sorg:ScholaryArticle").build()); + JsonArray rels = (JsonArray) jv; + for (JsonObject jo : rels.getValuesAs(JsonObject.class)) { + String id = getBestPubId(jo); + relArrayBuilder.add(Json.createObjectBuilder().add("id", id).add("ietf:cite-as", id) + .add("type", "sorg:ScholaryArticle").build()); + } } - } - - } - else { // JsonObject + + else { // JsonObject + String id = getBestPubId((JsonObject) jv); + relArrayBuilder.add(Json.createObjectBuilder().add("id", id).add("ietf:cite-as", id) + .add("type", "sorg:ScholaryArticle").build()); } } - } - - if + coarContext.add("IsSupplementTo", relArrayBuilder); break; default: - JsonValue jv = OREMap.getJsonLDForField(field, false, emptyCvocMap, localContext); - if(jv!=null) { - coarContext.add(OREMap.getTermFor(dft).getLabel(), jv); - } + if (jv != null) { + includeLocalContext = true; + coarContext.add(OREMap.getTermFor(dft).getLabel(), jv); + } + } } dvf.get(0).getDatasetFieldType().getName(); JsonObjectBuilder job = Json.createObjectBuilder(); - - job.add("@context", Json.createArrayBuilder().add("https://purl.org/coar/notify").add("https://www.w3.org/ns/activitystreams").build()); + JsonArrayBuilder context = Json.createArrayBuilder().add("https://purl.org/coar/notify") + .add("https://www.w3.org/ns/activitystreams"); + if (includeLocalContext && !localContext.isEmpty()) { + JsonObjectBuilder contextBuilder = Json.createObjectBuilder(); + for (Entry e : localContext.entrySet()) { + contextBuilder.add(e.getKey(), e.getValue()); + } + context.add(contextBuilder); + } + job.add("@context", context); job.add("id", "urn:uuid:" + UUID.randomUUID().toString()); - job.add("actor", Json.createObjectBuilder().add("id", SystemConfig.getDataverseSiteUrlStatic()).add("name",BrandingUtil.getInstallationBrandName()).add("type","Service")); + job.add("actor", Json.createObjectBuilder().add("id", SystemConfig.getDataverseSiteUrlStatic()) + .add("name", BrandingUtil.getInstallationBrandName()).add("type", "Service")); + job.add("context", coarContext); + Dataset d = ctxt.getDataset(); + job.add("object", + Json.createObjectBuilder().add("id", d.getLocalURL()) + .add("ietf:cite-as", d.getGlobalId().toURL().toExternalForm()) + .add("sorg:name", d.getDisplayName()).add("type", "sorg:Dataset")); + job.add("origin", Json.createObjectBuilder().add("id", SystemConfig.getDataverseSiteUrlStatic()) + .add("name", SystemConfig.getDataverseSiteUrlStatic() + "/api/inbox").add("type", "Service")); + job.add("target", target); + job.add("type", Json.createArrayBuilder().add("Announce").add("coar-notify:ReleaseAction")); - /* - { - "@context": [ - "https://purl.org/coar/notify", - "https://www.w3.org/ns/activitystreams" - ], - "id": "urn:uuid:a301c520-f790-4f3d-87b1-a18b2b617683", - "actor": { - "id": "http://ec2-35-170-82-7.compute-1.amazonaws.com", - "name": "Dataverse Repository", - "type": "Service" - }, - "context": { - "IsSupplementTo": [ - { - "id": "https://dashv7-dev.lib.harvard.edu/handle/123456789/34723317", - "ietf:cite-as": "https://dashv7-dev.lib.harvard.edu/handle/123456789/34723317", - "type": "sorg:ScholarlyArticle" - } - ] - }, - "object": { - "id": "http://ec2-35-170-82-7.compute-1.amazonaws.com/dataset.xhtml?persistentId=doi:10.5072/FK2/OMSPHN", - "ietf:cite-as": "https://doi.org/10.5072/FK2/OMSPHN", - "sorg:name": "An Interesting Dataset", - "type": "sorg:Dataset" - }, - "origin": { - "id": "http://ec2-35-170-82-7.compute-1.amazonaws.com", - "inbox": "http://ec2-35-170-82-7.compute-1.amazonaws.com/api/inbox", - "type": "Service" - }, - "target": { - "id": "https://dashv7-dev.lib.harvard.edu", - "inbox": "https://dashv7-api-dev.lib.harvard.edu/server/ldn/inbox", - "type": "Service" - }, - "type": [ - "Announce", - "coar-notify:ReleaseAction" - ] - } - */ - Map templateParams = new HashMap<>(); - templateParams.put( "invocationId", ctxt.getInvocationId() ); - templateParams.put( "dataset.id", Long.toString(ctxt.getDataset().getId()) ); - templateParams.put( "dataset.identifier", ctxt.getDataset().getIdentifier() ); - templateParams.put( "dataset.globalId", ctxt.getDataset().getGlobalIdString() ); - templateParams.put( "dataset.displayName", ctxt.getDataset().getDisplayName() ); - templateParams.put( "dataset.citation", ctxt.getDataset().getCitation() ); - templateParams.put( "minorVersion", Long.toString(ctxt.getNextMinorVersionNumber()) ); - templateParams.put( "majorVersion", Long.toString(ctxt.getNextVersionNumber()) ); - templateParams.put( "releaseStatus", (ctxt.getType()==TriggerType.PostPublishDataset) ? "done":"in-progress" ); - - m.addRequestHeader("Content-Type", params.getOrDefault("contentType", "text/plain")); - - String urlKey = rollback ? "rollbackUrl":"url"; - String url = params.get(urlKey); - try { - m.setURI(new URI(process(url,templateParams), true) ); - } catch (URIException ex) { - throw new IllegalStateException("Illegal URL: '" + url + "'"); - } - - String bodyKey = (rollback ? "rollbackBody" : "body"); - if ( params.containsKey(bodyKey) && m instanceof EntityEnclosingMethod ) { - String body = params.get(bodyKey); - ((EntityEnclosingMethod)m).setRequestEntity(new StringRequestEntity(process( body, templateParams))); - } - - return m; + HttpPost annPost = new HttpPost(); + annPost.setURI(new URI(target.getString("inbox"))); + String body = JsonUtil.prettyPrint(job.build()); + logger.fine("Body: " + body); + annPost.setEntity(new StringEntity(JsonUtil.prettyPrint(job.build()), "utf-8")); + annPost.setHeader("Content-Type", "application/ld+json"); + return annPost; } private String getBestPubId(JsonObject jo) { - String id=null; - if(jo.containsKey(publicationURL.getLabel()) ) { - id=jo.getString(publicationURL.getLabel()); - } else if(jo.containsKey(publicationIDType.getLabel())) { - if((jo.containsKey(publicationIDNumber.getLabel())) ) { + String id = null; + if (jo.containsKey(publicationURL.getLabel())) { + id = jo.getString(publicationURL.getLabel()); + } else if (jo.containsKey(publicationIDType.getLabel())) { + if ((jo.containsKey(publicationIDNumber.getLabel()))) { String number = jo.getString(publicationIDNumber.getLabel()); - - switch (jo.getString(publicationIDType.getLabel())) { + + switch (jo.getString(publicationIDType.getLabel())) { case "doi": - if(number.startsWith("https://doi.org/")) { - id = number; - } else if(number.startsWith("doi:")) { - id = "https://doi.org/" + doi.substring(4); - } - + if (number.startsWith("https://doi.org/")) { + id = number; + } else if (number.startsWith("doi:")) { + id = "https://doi.org/" + number.substring(4); + } + break; case "DASH-URN": - if(number.startsWith("http")) { - id=number; - } -break; - } + if (number.startsWith("http")) { + id = number; + } + break; + } } } return id; From 7cc96a127427bc0fc2e6e858d876c216d7bf81d8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 18 Mar 2022 09:21:49 -0400 Subject: [PATCH 19/66] add step to internal spi --- .../dataverse/workflow/internalspi/InternalWorkflowStepSP.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/InternalWorkflowStepSP.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/InternalWorkflowStepSP.java index ef11d306cd3..d99e0901d3c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/InternalWorkflowStepSP.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/InternalWorkflowStepSP.java @@ -25,6 +25,8 @@ public WorkflowStep getStep(String stepType, Map stepParameters) return new AuthorizedExternalStep(stepParameters); case "archiver": return new ArchivalSubmissionWorkflowStep(stepParameters); + case "ldnannounce": + return new LDNAnnounceDatasetVersionStep(stepParameters); default: throw new IllegalArgumentException("Unsupported step type: '" + stepType + "'."); } From b4e39eee0762337f15f07daa9f1edc13921a22ce Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 24 Mar 2022 13:50:57 -0400 Subject: [PATCH 20/66] name should be inbox --- .../workflow/internalspi/LDNAnnounceDatasetVersionStep.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index d4e245ec69d..2cbdad6dd5d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -215,7 +215,7 @@ HttpPost buildAnnouncement(boolean b, WorkflowContext ctxt, JsonObject target) t .add("ietf:cite-as", d.getGlobalId().toURL().toExternalForm()) .add("sorg:name", d.getDisplayName()).add("type", "sorg:Dataset")); job.add("origin", Json.createObjectBuilder().add("id", SystemConfig.getDataverseSiteUrlStatic()) - .add("name", SystemConfig.getDataverseSiteUrlStatic() + "/api/inbox").add("type", "Service")); + .add("inbox", SystemConfig.getDataverseSiteUrlStatic() + "/api/inbox").add("type", "Service")); job.add("target", target); job.add("type", Json.createArrayBuilder().add("Announce").add("coar-notify:ReleaseAction")); From 7fd93c2fd4fe02ee886d567edd5f385dd1dada11 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 4 Apr 2022 15:29:58 -0400 Subject: [PATCH 21/66] temporary setting for custom instructions --- .../harvard/iq/dataverse/SettingsWrapper.java | 17 ++++++++++++++++- .../dataverse/settings/SettingsServiceBean.java | 4 +++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java b/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java index acc53528f5f..88ec2b8c8b8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java @@ -13,6 +13,7 @@ import edu.harvard.iq.dataverse.util.MailUtil; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; +import edu.harvard.iq.dataverse.util.json.JsonUtil; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -634,5 +635,19 @@ public boolean isCustomLicenseAllowed() { } return customLicenseAllowed; } -} + + JsonObject allInstructions = null; + +public JsonObject getCustomInstructionsFor(String alias){ + if(allInstructions==null) { + try { + allInstructions = JsonUtil.getJsonObject(getValueForKey(SettingsServiceBean.Key.TempInstructions, "{}")); + } catch (Exception e) { + logger.warning("Failed to read " + SettingsServiceBean.Key.TempInstructions.toString() + " : " + e.getMessage() ); + return null; + } + } + return allInstructions.getJsonObject(alias); + } +} \ No newline at end of file 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 9e16a8b2e73..53d78d06c0b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -498,7 +498,9 @@ Whether Harvesting (OAI) service is enabled /** * LDN Inbox Allowed Hosts - a comma separated list of IP addresses allowed to submit messages to the inbox */ - MessageHosts + MessageHosts, + //Temporary key for adding instructions in templates + TempInstructions ; @Override From 5f3f9133d91cb41f0dd6153e063aa02c7534f30d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 4 Apr 2022 15:30:10 -0400 Subject: [PATCH 22/66] display custom instructions --- src/main/webapp/metadataFragment.xhtml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 88d66148a56..35d227f7d13 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -154,6 +154,7 @@ +

@@ -203,6 +204,7 @@ jsf:rendered="#{((editMode == 'METADATA' or dsf.datasetFieldType.displayOnCreate or !dsf.isEmpty() or dsf.required) and dsf.include) or (!datasetPage and dsf.include)}"> + From ccae650828bc9843029b7f51741b8ba4414ba670 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 4 Apr 2022 16:24:55 -0400 Subject: [PATCH 23/66] can't job.build twice --- .../workflow/internalspi/LDNAnnounceDatasetVersionStep.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index 2cbdad6dd5d..7ce65359968 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -223,7 +223,7 @@ HttpPost buildAnnouncement(boolean b, WorkflowContext ctxt, JsonObject target) t annPost.setURI(new URI(target.getString("inbox"))); String body = JsonUtil.prettyPrint(job.build()); logger.fine("Body: " + body); - annPost.setEntity(new StringEntity(JsonUtil.prettyPrint(job.build()), "utf-8")); + annPost.setEntity(new StringEntity(JsonUtil.prettyPrint(body), "utf-8")); annPost.setHeader("Content-Type", "application/ld+json"); return annPost; } From 3ae929f1f2cd57ecd7a3853116675ad5f521a62f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 4 Apr 2022 16:41:51 -0400 Subject: [PATCH 24/66] typos --- src/main/webapp/metadataFragment.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 35d227f7d13..dfb60e46ea4 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -204,7 +204,7 @@ jsf:rendered="#{((editMode == 'METADATA' or dsf.datasetFieldType.displayOnCreate or !dsf.isEmpty() or dsf.required) and dsf.include) or (!datasetPage and dsf.include)}"> - + From 6e19a1958930013f18056243ebe5dcb094de88d1 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 12 Apr 2022 12:31:40 -0400 Subject: [PATCH 25/66] typos - don't make variable a string :-) --- src/main/webapp/metadataFragment.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index a6334519866..7e57604bc66 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -204,7 +204,7 @@ jsf:rendered="#{((editMode == 'METADATA' or dsf.datasetFieldType.displayOnCreate or !dsf.isEmpty() or dsf.required) and dsf.include) or (!datasetPage and dsf.include)}"> - + From 8c4c3d356274054c4fb5719e099af52bdfe1098f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 12 Apr 2022 13:15:57 -0400 Subject: [PATCH 26/66] put message to right of title for primitive and compound fields --- src/main/webapp/metadataFragment.xhtml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 7e57604bc66..e2c86bdc784 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -208,13 +208,18 @@ - +

+ #{dsf.datasetFieldType.localeTitle} - -
+ + +
+
+
+
@@ -272,17 +277,23 @@
+
-
+
+
#{dsf.datasetFieldType.localeTitle} -
+
+
+
+
+

From 51b743e0cc54018f5911440e8f4653ec1814a140 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 12 Apr 2022 13:27:53 -0400 Subject: [PATCH 27/66] protect against null TermsOfUseAndAccess --- .../edu/harvard/iq/dataverse/api/Datasets.java | 3 +-- .../api/datadeposit/SwordServiceBean.java | 3 ++- .../iq/dataverse/dataset/DatasetUtil.java | 18 ++++++++++++++---- .../harvard/iq/dataverse/util/FileUtil.java | 3 ++- .../iq/dataverse/util/json/JsonPrinter.java | 2 +- 5 files changed, 20 insertions(+), 9 deletions(-) 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 e21396dd487..a02448286b2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -1588,8 +1588,7 @@ public Response getCustomTermsTab(@PathParam("id") String id, @PathParam("versio User user = session.getUser(); String persistentId; try { - if (getDatasetVersionOrDie(createDataverseRequest(user), versionId, findDatasetOrDie(id), uriInfo, headers) - .getTermsOfUseAndAccess().getLicense() != null) { + if (DatasetUtil.getLicense(getDatasetVersionOrDie(createDataverseRequest(user), versionId, findDatasetOrDie(id), uriInfo, headers)) != null) { return error(Status.NOT_FOUND, "This Dataset has no custom license"); } persistentId = getRequestParameter(":persistentId".substring(1)); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java index 46c38e04153..4a51363cc1c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/SwordServiceBean.java @@ -9,6 +9,7 @@ import edu.harvard.iq.dataverse.TermsOfUseAndAccess; import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser; import edu.harvard.iq.dataverse.authorization.users.User; +import edu.harvard.iq.dataverse.dataset.DatasetUtil; import edu.harvard.iq.dataverse.license.License; import edu.harvard.iq.dataverse.license.LicenseServiceBean; import edu.harvard.iq.dataverse.util.BundleUtil; @@ -153,7 +154,7 @@ public void setDatasetLicenseAndTermsOfUse(DatasetVersion datasetVersionToMutate TermsOfUseAndAccess terms = new TermsOfUseAndAccess(); datasetVersionToMutate.setTermsOfUseAndAccess(terms); if (listOfLicensesProvided == null) { - License existingLicense = datasetVersionToMutate.getTermsOfUseAndAccess().getLicense(); + License existingLicense = DatasetUtil.getLicense(datasetVersionToMutate); if (existingLicense != null) { // leave the license alone but set terms of use setTermsOfUse(datasetVersionToMutate, dcterms, existingLicense); diff --git a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java index ccf947b8868..b45d958e918 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataset/DatasetUtil.java @@ -5,6 +5,7 @@ import edu.harvard.iq.dataverse.DatasetField; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.FileMetadata; +import edu.harvard.iq.dataverse.TermsOfUseAndAccess; import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress; import edu.harvard.iq.dataverse.dataaccess.DataAccess; import static edu.harvard.iq.dataverse.dataaccess.DataAccess.getStorageIO; @@ -538,14 +539,23 @@ public static boolean validateDatasetMetadataExternally(Dataset ds, String execu } + public static License getLicense(DatasetVersion dsv) { + License license = null; + TermsOfUseAndAccess tua = dsv.getTermsOfUseAndAccess(); + if(tua!=null) { + license = tua.getLicense(); + } + return license; + } + public static String getLicenseName(DatasetVersion dsv) { - License license = dsv.getTermsOfUseAndAccess().getLicense(); + License license = DatasetUtil.getLicense(dsv); return license != null ? license.getName() : BundleUtil.getStringFromBundle("license.custom"); } public static String getLicenseURI(DatasetVersion dsv) { - License license = dsv.getTermsOfUseAndAccess().getLicense(); + License license = DatasetUtil.getLicense(dsv); // Return the URI // For standard licenses, just return the stored URI return (license != null) ? license.getUri().toString() @@ -560,12 +570,12 @@ public static String getLicenseURI(DatasetVersion dsv) { } public static String getLicenseIcon(DatasetVersion dsv) { - License license = dsv.getTermsOfUseAndAccess().getLicense(); + License license = DatasetUtil.getLicense(dsv); return license != null && license.getIconUrl() != null ? license.getIconUrl().toString() : null; } public static String getLicenseDescription(DatasetVersion dsv) { - License license = dsv.getTermsOfUseAndAccess().getLicense(); + License license = DatasetUtil.getLicense(dsv); return license != null ? license.getShortDescription() : BundleUtil.getStringFromBundle("license.custom.description"); } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java index 8d3d63da99d..8f5344299e2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/FileUtil.java @@ -33,6 +33,7 @@ import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter; import edu.harvard.iq.dataverse.dataaccess.S3AccessIO; import edu.harvard.iq.dataverse.dataset.DatasetThumbnail; +import edu.harvard.iq.dataverse.dataset.DatasetUtil; import edu.harvard.iq.dataverse.datasetutility.FileExceedsMaxSizeException; import static edu.harvard.iq.dataverse.datasetutility.FileSizeChecker.bytesToHumanReadable; import edu.harvard.iq.dataverse.ingest.IngestReport; @@ -1515,7 +1516,7 @@ private static Boolean popupDueToStateOrTerms(DatasetVersion datasetVersion) { } // 1. License and Terms of Use: if (datasetVersion.getTermsOfUseAndAccess() != null) { - License license = datasetVersion.getTermsOfUseAndAccess().getLicense(); + License license = DatasetUtil.getLicense(datasetVersion); if ((license == null && StringUtils.isNotBlank(datasetVersion.getTermsOfUseAndAccess().getTermsOfUse())) || (license != null && !license.isDefault())) { logger.fine("Popup required because of license or terms of use."); 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 ed3460b6759..bcc748eaa74 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 @@ -334,7 +334,7 @@ public static JsonObjectBuilder json(DatasetVersion dsv) { .add("UNF", dsv.getUNF()).add("archiveTime", format(dsv.getArchiveTime())) .add("lastUpdateTime", format(dsv.getLastUpdateTime())).add("releaseTime", format(dsv.getReleaseTime())) .add("createTime", format(dsv.getCreateTime())); - License license = dsv.getTermsOfUseAndAccess().getLicense(); + License license = DatasetUtil.getLicense(dsv);; if (license != null) { // Standard license bld.add("license", jsonObjectBuilder() From cd6bf585271d451d2cc0275959447ba9f68339f3 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 12 Apr 2022 18:06:03 -0400 Subject: [PATCH 28/66] remove extra copy of instructions --- src/main/webapp/metadataFragment.xhtml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index e2c86bdc784..23a5abedbb0 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -204,7 +204,6 @@ jsf:rendered="#{((editMode == 'METADATA' or dsf.datasetFieldType.displayOnCreate or !dsf.isEmpty() or dsf.required) and dsf.include) or (!datasetPage and dsf.include)}"> - From e4402368e95883e1be46fab6a0a3df0ee66a6cd9 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 16 May 2022 10:47:26 -0400 Subject: [PATCH 29/66] update for #8592 semantic mapping update --- .../internalspi/LDNAnnounceDatasetVersionStep.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index 7ce65359968..3388e54e5bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -155,13 +155,13 @@ HttpPost buildAnnouncement(boolean b, WorkflowContext ctxt, JsonObject target) t for (DatasetFieldType cdft : childTypes) { switch (cdft.getName()) { case "publicationURL": - publicationURL = OREMap.getTermFor(dft, cdft); + publicationURL = cdft.getJsonLDTerm(); break; case "publicationIDType": - publicationIDType = OREMap.getTermFor(dft, cdft); + publicationIDType = cdft.getJsonLDTerm(); break; case "publicationIDNumber": - publicationIDNumber = OREMap.getTermFor(dft, cdft); + publicationIDNumber = cdft.getJsonLDTerm(); break; } @@ -188,7 +188,7 @@ HttpPost buildAnnouncement(boolean b, WorkflowContext ctxt, JsonObject target) t default: if (jv != null) { includeLocalContext = true; - coarContext.add(OREMap.getTermFor(dft).getLabel(), jv); + coarContext.add(dft.getJsonLDTerm().getLabel(), jv); } } From 874de7684d04d2726637a50a08fae828f696a77b Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 16 May 2022 12:54:19 -0400 Subject: [PATCH 30/66] add missing method --- src/main/java/edu/harvard/iq/dataverse/Dataverse.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java index 342aaec187a..db5f9d172cd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataverse.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataverse.java @@ -5,6 +5,8 @@ import edu.harvard.iq.dataverse.dataaccess.DataAccess; import edu.harvard.iq.dataverse.search.savedsearch.SavedSearch; import edu.harvard.iq.dataverse.util.BundleUtil; +import edu.harvard.iq.dataverse.util.SystemConfig; + import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -765,4 +767,8 @@ public boolean isAncestorOf( DvObject other ) { } return false; } + + public String getLocalURL() { + return SystemConfig.getDataverseSiteUrlStatic() + "/dataverse/" + this.getAlias(); + } } From 381d180a7e5ac3a0d0ee390ed9d25b8faa737e2d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 2 Jun 2022 08:35:44 -0400 Subject: [PATCH 31/66] initial changes to store/use template instructions --- .../edu/harvard/iq/dataverse/Dataset.java | 14 +++++- .../edu/harvard/iq/dataverse/Template.java | 47 ++++++++++++++++++- src/main/webapp/dataset.xhtml | 2 + src/main/webapp/metadataFragment.xhtml | 16 +++++-- src/main/webapp/template.xhtml | 3 +- 5 files changed, 75 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index c73aa370521..a4f82d41bac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -33,7 +33,6 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; @@ -153,6 +152,19 @@ public void setCitationDateDatasetFieldType(DatasetFieldType citationDateDataset this.citationDateDatasetFieldType = citationDateDatasetFieldType; } + + @ManyToOne + @JoinColumn(name="template_id",nullable = true) + private Template template; + + public Template getTemplate() { + return template; + } + + public void setTemplate(Template template) { + this.template = template; + } + public Dataset() { DatasetVersion datasetVersion = new DatasetVersion(); datasetVersion.setDataset(this); diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index b9a1762714a..76360989fa9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -1,7 +1,6 @@ package edu.harvard.iq.dataverse; import java.io.Serializable; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -10,6 +9,11 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + +import javax.json.Json; +import javax.json.JsonObjectBuilder; +import javax.json.JsonString; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -28,6 +32,8 @@ import javax.validation.constraints.Size; import edu.harvard.iq.dataverse.util.DateUtil; +import edu.harvard.iq.dataverse.util.json.JsonUtil; + import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import org.hibernate.validator.constraints.NotBlank; @@ -125,7 +131,13 @@ public void setTermsOfUseAndAccess(TermsOfUseAndAccess termsOfUseAndAccess) { public List getDatasetFields() { return datasetFields; } + + @Column(columnDefinition="TEXT", nullable = true ) + private String instructions; + @Transient + private Map instructionsMap = null; + @Transient private Map> metadataBlocksForView = new HashMap<>(); @Transient @@ -379,6 +391,39 @@ private List getFlatDatasetFields(List dsfList) { return retList; } + //Cache values in map for reading + private Map getInstructionsMap() { + if(instructionsMap==null) + if(instructions != null) { + instructionsMap = JsonUtil.getJsonObject(instructions).entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(),entry -> ((JsonString)entry.getValue()).getString())); + } else { + instructionsMap = new HashMap(); + } + return instructionsMap; + } + + //Get the cutstom instructions defined for a give fieldType + public String getInstructionsFor(String fieldType) { + return getInstructionsMap().get(fieldType); + } + + //Add/change or remove (null instructionString) instructions for a given fieldType + public void setInstructionsFor(String fieldType, String instructionString) { + if(instructionString==null) { + getInstructionsMap().remove(fieldType); + } else { + getInstructionsMap().put(fieldType, instructionString); + } + updateInstructions(); + } + //Keep instructions up-to-date on any change + private void updateInstructions() { + JsonObjectBuilder builder = Json.createObjectBuilder(); + getInstructionsMap().forEach(builder::add); + instructions = JsonUtil.prettyPrint(builder.build()); + } + + @Override public int hashCode() { int hash = 0; diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index b08c06e1568..b55847f68f8 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -749,6 +749,7 @@ + @@ -886,6 +887,7 @@

+ diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 626e1bda292..ec1d362dc29 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -154,7 +154,6 @@ -

@@ -199,11 +198,20 @@

- +
+ + + + + + + + + @@ -214,7 +222,7 @@ - +
@@ -287,7 +295,7 @@
-
+
diff --git a/src/main/webapp/template.xhtml b/src/main/webapp/template.xhtml index 91a9efaf2c3..726ce27f54a 100644 --- a/src/main/webapp/template.xhtml +++ b/src/main/webapp/template.xhtml @@ -47,13 +47,14 @@ - + + From 6975f5cdae44cc256e478101436f9663b1e128e1 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 2 Jun 2022 08:35:57 -0400 Subject: [PATCH 32/66] add DASh-NRS to properties file --- src/main/java/propertyFiles/citation.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/propertyFiles/citation.properties b/src/main/java/propertyFiles/citation.properties index 70cb98a98e4..899a069c13b 100644 --- a/src/main/java/propertyFiles/citation.properties +++ b/src/main/java/propertyFiles/citation.properties @@ -265,6 +265,7 @@ controlledvocabulary.publicationIDType.purl=purl controlledvocabulary.publicationIDType.upc=upc controlledvocabulary.publicationIDType.url=url controlledvocabulary.publicationIDType.urn=urn +controlledvocabulary.publicationIDType.dash-nrs=DASH-NRS controlledvocabulary.contributorType.data_collector=Data Collector controlledvocabulary.contributorType.data_curator=Data Curator controlledvocabulary.contributorType.data_manager=Data Manager From 4110bc127dceb9355a3d51f4d11a34453655e3f6 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 2 Jun 2022 13:55:25 -0400 Subject: [PATCH 33/66] initial working edit in place in template --- .../edu/harvard/iq/dataverse/Template.java | 13 +++++---- .../harvard/iq/dataverse/TemplatePage.java | 8 +++++ src/main/java/propertyFiles/Bundle.properties | 1 + src/main/webapp/metadataFragment.xhtml | 29 +++++++++++-------- src/main/webapp/template.xhtml | 1 - 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index 76360989fa9..433cf756cfd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -392,7 +392,7 @@ private List getFlatDatasetFields(List dsfList) { } //Cache values in map for reading - private Map getInstructionsMap() { + public Map getInstructionsMap() { if(instructionsMap==null) if(instructions != null) { instructionsMap = JsonUtil.getJsonObject(instructions).entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(),entry -> ((JsonString)entry.getValue()).getString())); @@ -401,12 +401,13 @@ private Map getInstructionsMap() { } return instructionsMap; } - + //Get the cutstom instructions defined for a give fieldType public String getInstructionsFor(String fieldType) { return getInstructionsMap().get(fieldType); } - + + /* //Add/change or remove (null instructionString) instructions for a given fieldType public void setInstructionsFor(String fieldType, String instructionString) { if(instructionString==null) { @@ -416,10 +417,12 @@ public void setInstructionsFor(String fieldType, String instructionString) { } updateInstructions(); } + */ + //Keep instructions up-to-date on any change - private void updateInstructions() { + public void updateInstructions() { JsonObjectBuilder builder = Json.createObjectBuilder(); - getInstructionsMap().forEach(builder::add); + getInstructionsMap().forEach((key, value) -> {if(value !=null) builder.add(key, value);}); instructions = JsonUtil.prettyPrint(builder.build()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java index 19beaf75349..71dd66bebef 100644 --- a/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java +++ b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java @@ -184,6 +184,8 @@ public String save(String redirectPage) { DatasetFieldUtil.tidyUpFields( template.getDatasetFields(), false ); + template.updateInstructions(); + if (editMode == EditMode.CREATE) { template.setCreateTime(new Timestamp(new Date().getTime())); template.setUsageCount(new Long(0)); @@ -253,5 +255,11 @@ public String deleteTemplate(Long templateId) { } return "/manage-templates.xhtml?dataverseId=" + dataverse.getId() + "&faces-redirect=true"; } + + //Get the cutstom instructions defined for a give fieldType + public String getInstructionsLabelFor(String fieldType) { + String fieldInstructions = template.getInstructionsMap().get(fieldType); + return (fieldInstructions!=null && !fieldInstructions.isBlank()) ? fieldInstructions : BundleUtil.getStringFromBundle("template.instructions.empty.label"); + } } diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index e467233efe8..425cb6e8c38 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2470,6 +2470,7 @@ template.delete.error=The dataset template cannot be deleted. template.update=Template data updated template.update.error=Template update failed template.makeDefault.error=The dataset template cannot be made default. +template.instructions.empty.label=None (Click to Add) page.copy=Copy of #RolePermissionFragment.java diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index ec1d362dc29..64e86953646 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -203,15 +203,6 @@ jsf:rendered="#{((editMode == 'METADATA' or dsf.datasetFieldType.displayOnCreate or !dsf.isEmpty() or dsf.required) and dsf.include) or (!datasetPage and dsf.include)}"> - - - - - - - - - @@ -222,7 +213,13 @@ - + + + + + + +
@@ -291,11 +288,19 @@
#{dsf.datasetFieldType.localeTitle} - +
-
+ +
+ + + + + + +
diff --git a/src/main/webapp/template.xhtml b/src/main/webapp/template.xhtml index 726ce27f54a..7ccfbc19301 100644 --- a/src/main/webapp/template.xhtml +++ b/src/main/webapp/template.xhtml @@ -47,7 +47,6 @@ - From af0aaceb0249067c514e1aa59191443312e6d239 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 2 Jun 2022 17:54:00 -0400 Subject: [PATCH 34/66] start adding support to see instructions in template view mode --- .../edu/harvard/iq/dataverse/Template.java | 24 +++++++++---------- src/main/webapp/manage-templates.xhtml | 3 ++- src/main/webapp/metadataFragment.xhtml | 10 ++++++++ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index 433cf756cfd..fdf3b22442b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -250,18 +250,12 @@ private void initMetadataBlocksForCreate() { metadataBlocksForView.clear(); metadataBlocksForEdit.clear(); for (MetadataBlock mdb : this.getDataverse().getMetadataBlocks()) { - List datasetFieldsForView = new ArrayList<>(); List datasetFieldsForEdit = new ArrayList<>(); for (DatasetField dsf : this.getDatasetFields()) { - if (dsf.getDatasetFieldType().getMetadataBlock().equals(mdb)) { datasetFieldsForEdit.add(dsf); } } - - if (!datasetFieldsForView.isEmpty()) { - metadataBlocksForView.put(mdb, sortDatasetFields(datasetFieldsForView)); - } if (!datasetFieldsForEdit.isEmpty()) { metadataBlocksForEdit.put(mdb, sortDatasetFields(datasetFieldsForEdit)); } @@ -273,27 +267,31 @@ public void setMetadataValueBlocks() { metadataBlocksForView.clear(); metadataBlocksForEdit.clear(); List filledInFields = this.getDatasetFields(); - + + Map instructionsMap = getInstructionsMap(); List actualMDB = new ArrayList<>(); + //The metadatablocks in this template include any from the Dataverse it is associated with + //plus any others where the template has a displayable field (i.e. from before a block was dropped in the dataverse/collection) actualMDB.addAll(this.getDataverse().getMetadataBlocks()); - for (DatasetField dsfv : filledInFields) { - if (!dsfv.isEmptyForDisplay()) { - MetadataBlock mdbTest = dsfv.getDatasetFieldType().getMetadataBlock(); + for (DatasetField dsf : filledInFields) { + if (!dsf.isEmptyForDisplay()) { + MetadataBlock mdbTest = dsf.getDatasetFieldType().getMetadataBlock(); if (!actualMDB.contains(mdbTest)) { actualMDB.add(mdbTest); } } - } - + } + for (MetadataBlock mdb : actualMDB) { List datasetFieldsForView = new ArrayList<>(); List datasetFieldsForEdit = new ArrayList<>(); for (DatasetField dsf : this.getDatasetFields()) { if (dsf.getDatasetFieldType().getMetadataBlock().equals(mdb)) { datasetFieldsForEdit.add(dsf); - if (!dsf.isEmpty()) { + //For viewing, show the filed if it has a value or custom instructions + if (!dsf.isEmpty() || instructionsMap.containsKey(dsf.getDatasetFieldType().getName())) { datasetFieldsForView.add(dsf); } } diff --git a/src/main/webapp/manage-templates.xhtml b/src/main/webapp/manage-templates.xhtml index 1af6760534f..8e99462e172 100644 --- a/src/main/webapp/manage-templates.xhtml +++ b/src/main/webapp/manage-templates.xhtml @@ -181,7 +181,8 @@ - + +
diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 64e86953646..47fda00a250 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -76,6 +76,11 @@ + + + + + @@ -109,6 +114,11 @@

+ + + + + From de5adc7cc8bc805c98c39b62940d5308bd167e60 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 2 Jun 2022 18:29:21 -0400 Subject: [PATCH 35/66] add template in correct include --- src/main/webapp/manage-templates.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/manage-templates.xhtml b/src/main/webapp/manage-templates.xhtml index 8e99462e172..3187c3b339f 100644 --- a/src/main/webapp/manage-templates.xhtml +++ b/src/main/webapp/manage-templates.xhtml @@ -178,11 +178,11 @@ + -
From 2226fa5ec242566ff032ab9c42b2b5027f6778de Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 10:49:38 -0400 Subject: [PATCH 36/66] formatting/text changes, tooltip --- src/main/java/propertyFiles/Bundle.properties | 3 ++ src/main/webapp/metadataFragment.xhtml | 31 +++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 425cb6e8c38..58053cbabeb 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2470,7 +2470,10 @@ template.delete.error=The dataset template cannot be deleted. template.update=Template data updated template.update.error=Template update failed template.makeDefault.error=The dataset template cannot be made default. +template.instructions.label=Custom Instructions +template.instructions.label.tip=Click to Edit template.instructions.empty.label=None (Click to Add) + page.copy=Copy of #RolePermissionFragment.java diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 47fda00a250..d333c0f5ff8 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -76,11 +76,12 @@ - - - - - + +
+ + +
+
@@ -115,8 +116,10 @@

- - +
+ + +
@@ -216,7 +219,7 @@ -
+
#{dsf.datasetFieldType.localeTitle} @@ -224,10 +227,12 @@ data-toggle="tooltip" data-placement="auto right" data-original-title="#{dsf.datasetFieldType.localeDescription}"> - - - - +
+ + + + +
@@ -305,7 +310,7 @@
- + From 37a82ec07b19f3c8a11f775f2db8251c1bee5863 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 15:37:01 -0400 Subject: [PATCH 37/66] further formatting/text changes --- src/main/java/propertyFiles/Bundle.properties | 4 ++-- src/main/webapp/metadataFragment.xhtml | 16 ++++++++-------- src/main/webapp/resources/css/structure.css | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 58053cbabeb..a3eef192f11 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2470,9 +2470,9 @@ template.delete.error=The dataset template cannot be deleted. template.update=Template data updated template.update.error=Template update failed template.makeDefault.error=The dataset template cannot be made default. -template.instructions.label=Custom Instructions +template.instructions.label=Custom Instructions: template.instructions.label.tip=Click to Edit -template.instructions.empty.label=None (Click to Add) +template.instructions.empty.label=(None - click to add) page.copy=Copy of diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index d333c0f5ff8..1e2a41cfc92 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -78,7 +78,7 @@
- +
@@ -117,7 +117,7 @@
- +
@@ -227,14 +227,14 @@ data-toggle="tooltip" data-placement="auto right" data-original-title="#{dsf.datasetFieldType.localeDescription}">
-
- +
+
- +
@@ -308,14 +308,14 @@ data-toggle="tooltip" data-placement="auto right" data-original-title="#{dsf.datasetFieldType.localeDescription}">
-
+
- + - +
diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index 86016f91eeb..5ba00e65024 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -99,6 +99,7 @@ td.col-select-width, th.col-select-width {width:36px;} .no-margin-top {margin-top:0 !important;} .no-margin-bottom {margin-bottom:0 !important;} .margin-sides {margin-left:1em; margin-right:1em;} +.margin-right {margin-right:1em;} .padding-12 {padding: 12px;} .padding-6 {padding: 6px;} .padding-none {padding: 0 !important;} From cf0c784668b8ead994f71c77a68e4faa25fbc811 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 15:37:29 -0400 Subject: [PATCH 38/66] set template to default/selected during create --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 251f3865104..5be92ea6eae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -1762,6 +1762,7 @@ public void handleChangeButton() { workingVersion.initDefaultValues(licenseServiceBean.getDefault()); updateDatasetFieldInputLevels(); } + dataset.setTemplate(selectedTemplate); /* Issue 8646: necessary for the access popup which is shared by the dataset page and the file page */ @@ -2049,6 +2050,8 @@ private String init(boolean initFull) { selectedTemplate = testT; } } + //Initalize with the default if there is one + dataset.setTemplate(selectedTemplate); workingVersion = dataset.getEditVersion(selectedTemplate, null); updateDatasetFieldInputLevels(); } else { @@ -3559,6 +3562,7 @@ public String save() { if (editMode == EditMode.CREATE) { //Lock the metadataLanguage once created dataset.setMetadataLanguage(getEffectiveMetadataLanguage()); + //ToDo - could drop use of selectedTemplate and just use the persistent dataset.getTemplate() if ( selectedTemplate != null ) { if ( isSessionUserAuthenticated() ) { cmd = new CreateNewDatasetCommand(dataset, dvRequestService.getDataverseRequest(), false, selectedTemplate); From 2e7563d507480af822896b7d2f6e1be0ef738c69 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 15:37:40 -0400 Subject: [PATCH 39/66] comment typo --- src/main/java/edu/harvard/iq/dataverse/Template.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index fdf3b22442b..d6948353a53 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -290,7 +290,7 @@ public void setMetadataValueBlocks() { for (DatasetField dsf : this.getDatasetFields()) { if (dsf.getDatasetFieldType().getMetadataBlock().equals(mdb)) { datasetFieldsForEdit.add(dsf); - //For viewing, show the filed if it has a value or custom instructions + //For viewing, show the field if it has a value or custom instructions if (!dsf.isEmpty() || instructionsMap.containsKey(dsf.getDatasetFieldType().getName())) { datasetFieldsForView.add(dsf); } From 5f1d2b4809ea794ac59635f49df86979237fd592 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 15:38:03 -0400 Subject: [PATCH 40/66] add template param in metadata view mode --- src/main/webapp/template.xhtml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/webapp/template.xhtml b/src/main/webapp/template.xhtml index 7ccfbc19301..7562157f169 100644 --- a/src/main/webapp/template.xhtml +++ b/src/main/webapp/template.xhtml @@ -96,6 +96,7 @@ + From d984405f0a5d15828dbe6bf4dd9a7517716d508e Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 16:22:08 -0400 Subject: [PATCH 41/66] adjust spacing --- src/main/webapp/resources/css/structure.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index 5ba00e65024..9a68cf7f5c0 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -99,7 +99,7 @@ td.col-select-width, th.col-select-width {width:36px;} .no-margin-top {margin-top:0 !important;} .no-margin-bottom {margin-bottom:0 !important;} .margin-sides {margin-left:1em; margin-right:1em;} -.margin-right {margin-right:1em;} +.margin-right {margin-right:.5em;} .padding-12 {padding: 12px;} .padding-6 {padding: 6px;} .padding-none {padding: 0 !important;} From 31e721b7e60b0e5a7b7576520fc97f0a525962d4 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 16:22:28 -0400 Subject: [PATCH 42/66] show instructions on template page view mode --- src/main/webapp/metadataFragment.xhtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 1e2a41cfc92..0104615025c 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -76,7 +76,7 @@ - +
@@ -115,7 +115,7 @@

- +
From afdc9ea295e72e3676e606b1bd2c53d9be30824d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 16:22:43 -0400 Subject: [PATCH 43/66] update close to clone instructions --- src/main/java/edu/harvard/iq/dataverse/Template.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index d6948353a53..1fd31fa4506 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -350,6 +350,9 @@ public Template cloneNewTemplate(Template source) { } terms.setTemplate(newTemplate); newTemplate.setTermsOfUseAndAccess(terms); + + newTemplate.getInstructionsMap().putAll(source.getInstructionsMap()); + newTemplate.updateInstructions(); return newTemplate; } From c132c8e28748418b0ed52fe99f3b174e07dea0d5 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 3 Jun 2022 16:53:05 -0400 Subject: [PATCH 44/66] expand width of editor --- src/main/webapp/resources/css/structure.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index 9a68cf7f5c0..aef9e00cd4e 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -1117,3 +1117,8 @@ span.label-default { background-color: #757575 } .login-container h1 { font-size:30px; } #embargoInputs label { font-weight: normal; } + +/*Template Instructions Editing*/ +.ui-inplace .ui-inputfield { + width:60% +} From 3a8f005736ca39dfae623d8b88c352d564702735 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 6 Jun 2022 14:30:57 -0400 Subject: [PATCH 45/66] cleanup - remove temp setting --- .../harvard/iq/dataverse/SettingsWrapper.java | 15 --------------- .../edu/harvard/iq/dataverse/Template.java | 5 ++++- .../harvard/iq/dataverse/api/LDNInbox.java | 19 +++++-------------- .../settings/SettingsServiceBean.java | 4 +--- ..._1234-hdc-3b.sql => V5.11.0.1__hdc-3b.sql} | 0 5 files changed, 10 insertions(+), 33 deletions(-) rename src/main/resources/db/migration/{V5.10.0.1__1234-hdc-3b.sql => V5.11.0.1__hdc-3b.sql} (100%) diff --git a/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java b/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java index 06d92163418..8370030e44b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java +++ b/src/main/java/edu/harvard/iq/dataverse/SettingsWrapper.java @@ -647,19 +647,4 @@ public boolean isCustomLicenseAllowed() { } return customLicenseAllowed; } - - - JsonObject allInstructions = null; - -public JsonObject getCustomInstructionsFor(String alias){ - if(allInstructions==null) { - try { - allInstructions = JsonUtil.getJsonObject(getValueForKey(SettingsServiceBean.Key.TempInstructions, "{}")); - } catch (Exception e) { - logger.warning("Failed to read " + SettingsServiceBean.Key.TempInstructions.toString() + " : " + e.getMessage() ); - return null; - } - } - return allInstructions.getJsonObject(alias); - } } \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/Template.java b/src/main/java/edu/harvard/iq/dataverse/Template.java index 1fd31fa4506..ff3e53dd61f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Template.java +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java @@ -423,7 +423,10 @@ public void setInstructionsFor(String fieldType, String instructionString) { //Keep instructions up-to-date on any change public void updateInstructions() { JsonObjectBuilder builder = Json.createObjectBuilder(); - getInstructionsMap().forEach((key, value) -> {if(value !=null) builder.add(key, value);}); + getInstructionsMap().forEach((key, value) -> { + if (value != null) + builder.add(key, value); + }); instructions = JsonUtil.prettyPrint(builder.build()); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index dbaf62d9fad..4e8625a99fd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -38,7 +38,6 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @Path("inbox") @@ -115,7 +114,7 @@ public Response acceptMessage(String body) { if (citingType.startsWith(JsonLDNamespace.schema.getUrl())) { citingType = citingType.replace(JsonLDNamespace.schema.getUrl(), ""); } - if(msgObject.containsKey(JsonLDTerm.schemaOrg("name").getUrl())) { + if (msgObject.containsKey(JsonLDTerm.schemaOrg("name").getUrl())) { name = msgObject.getString(JsonLDTerm.schemaOrg("name").getUrl()); } logger.fine("Citing Type: " + citingType); @@ -142,7 +141,8 @@ public Response acceptMessage(String body) { Dataset dataset = datasetSvc.findByGlobalId(pid); if (dataset != null) { JsonObject citingResource = Json.createObjectBuilder().add("@id", citingPID) - .add("@type", citingType).add("relationship", relationship).add("name", name).build(); + .add("@type", citingType).add("relationship", relationship) + .add("name", name).build(); StringWriter sw = new StringWriter(128); try (JsonWriter jw = Json.createWriter(sw)) { jw.write(citingResource); @@ -171,10 +171,6 @@ public Response acceptMessage(String body) { }); sent = true; } - // .forEach( au -> userNotificationService.sendNotificationInNewTransaction(au, - // timestamp, type, dataset.getLatestVersion().getId()) ); - -// Subject: <<>>. Body: Root Support, the Root has just been notified that the http://schema.org/ScholarlyArticle http://ec2-3-236-45-73.compute-1.amazonaws.com cites "Une Démonstration.

You may contact us for support at qqmyers@hotmail.com.

Thank you,
Root Support } } } @@ -190,15 +186,10 @@ public Response acceptMessage(String body) { "Unable to process message. Please contact the administrators."); } } - } else - - { + } else { logger.info("Ignoring message from IP address: " + origin.toString()); throw new ForbiddenException("Inbox does not acept messages from this address"); } - - return - - ok("Message Received"); + return ok("Message Received"); } } 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 8b7ade26d52..4729887d656 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -526,9 +526,7 @@ Whether Harvesting (OAI) service is enabled /** * LDN Inbox Allowed Hosts - a comma separated list of IP addresses allowed to submit messages to the inbox */ - MessageHosts, - //Temporary key for adding instructions in templates - TempInstructions + MessageHosts ; @Override diff --git a/src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql b/src/main/resources/db/migration/V5.11.0.1__hdc-3b.sql similarity index 100% rename from src/main/resources/db/migration/V5.10.0.1__1234-hdc-3b.sql rename to src/main/resources/db/migration/V5.11.0.1__hdc-3b.sql From 944aa4e46af8896702d1f125f57371d516171b8e Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 8 Jun 2022 15:15:00 -0400 Subject: [PATCH 46/66] fix display width in dataset md edit mode --- src/main/webapp/metadataFragment.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/metadataFragment.xhtml b/src/main/webapp/metadataFragment.xhtml index 0104615025c..324fd2e0b84 100755 --- a/src/main/webapp/metadataFragment.xhtml +++ b/src/main/webapp/metadataFragment.xhtml @@ -315,7 +315,7 @@ - +
From 1e728238c9e26eda66bf40a3ff94b13b4ee09dc2 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 8 Jun 2022 15:15:15 -0400 Subject: [PATCH 47/66] flyway for instructions column in template --- .../db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql diff --git a/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql b/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql new file mode 100644 index 00000000000..ee58d91333d --- /dev/null +++ b/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql @@ -0,0 +1 @@ +ALTER TABLE template ADD COLUMN IF NOT EXISTS instructions TEXT; From 67c215b54678f2ff6d1726c1eea64a8d1ee6ac0f Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 13 Jun 2022 21:36:04 -0400 Subject: [PATCH 48/66] update flyway --- .../V5.11.0.2__hdc-3b2-template-instructions.sql | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql b/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql index ee58d91333d..df1d3068159 100644 --- a/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql +++ b/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql @@ -1 +1,14 @@ ALTER TABLE template ADD COLUMN IF NOT EXISTS instructions TEXT; + +ALTER TABLE dataset ADD COLUMN IF NOT EXISTS template_id BIGINT; + +DO $$ +BEGIN + + BEGIN + ALTER TABLE dataset ADD CONSTRAINT fx_dataset_template_id FOREIGN KEY (template_id) REFERENCES template(id); + EXCEPTION + WHEN duplicate_object THEN RAISE NOTICE 'Table constraint fk_dataset_template_id already exists'; + END; + +END $$; From 63a20204efe256b278dc2bbb16743a826f4dea0d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 13 Jun 2022 23:37:38 -0400 Subject: [PATCH 49/66] OK when metadata doesn't exist and won't send message --- .../workflow/internalspi/LDNAnnounceDatasetVersionStep.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index 3388e54e5bf..5b570fe2e96 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -81,6 +81,10 @@ public WorkflowStepResult run(WorkflowContext context) { } catch (URISyntaxException e) { return new Failure("LDNAnnounceDatasetVersion workflow step failed: unable to parse inbox in :LDNTarget setting."); } + if(announcement==null) { + logger.info(context.getDataset().getGlobalId().asString() + "does not have metadata required to send LDN message. Nothing sent."); + return OK; + } // execute try (CloseableHttpResponse response = client.execute(announcement)) { int code = response.getStatusLine().getStatusCode(); @@ -114,7 +118,7 @@ public void rollback(WorkflowContext context, Failure reason) { throw new UnsupportedOperationException("Not supported yet."); // This class does not need to resume. } - HttpPost buildAnnouncement(boolean b, WorkflowContext ctxt, JsonObject target) throws URISyntaxException { + HttpPost buildAnnouncement(boolean qb, WorkflowContext ctxt, JsonObject target) throws URISyntaxException { // First check that we have what is required DatasetVersion dv = ctxt.getDataset().getReleasedVersion(); From 70b38b33de99f12dc633ea97b6e46193ec061596 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 24 Jun 2022 17:02:05 -0400 Subject: [PATCH 50/66] fix missing field check --- .../workflow/internalspi/LDNAnnounceDatasetVersionStep.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java index 5b570fe2e96..3478d9398f0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java +++ b/src/main/java/edu/harvard/iq/dataverse/workflow/internalspi/LDNAnnounceDatasetVersionStep.java @@ -130,7 +130,7 @@ HttpPost buildAnnouncement(boolean qb, WorkflowContext ctxt, JsonObject target) } Set reqFields = fields.keySet(); for (DatasetField df : dvf) { - if (reqFields.contains(df.getDatasetFieldType().getName())) { + if(!df.isEmpty() && reqFields.contains(df.getDatasetFieldType().getName())) { fields.put(df.getDatasetFieldType().getName(), df); } } From 1bca0447b9102be47e9250b273caf2d6d8a552bf Mon Sep 17 00:00:00 2001 From: qqmyers Date: Tue, 5 Jul 2022 16:38:02 -0400 Subject: [PATCH 51/66] missing property --- src/main/java/propertyFiles/Bundle.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index a3eef192f11..394a437a3f2 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -266,6 +266,7 @@ notification.typeDescription.WORKFLOW_SUCCESS=External workflow run has succeede notification.typeDescription.WORKFLOW_FAILURE=External workflow run has failed notification.typeDescription.STATUSUPDATED=Status of dataset has been updated notification.typeDescription.DATASETCREATED=Dataset was created by user +notification.typeDescription.DATASETMENTIONED=Dataset was referenced in remote system groupAndRoles.manageTips=Here is where you can access and manage all the groups you belong to, and the roles you have been assigned. user.message.signup.label=Create Account From b9c4bbac004a6ef6b01dd428389441e9b761ed34 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 27 Jul 2022 11:13:58 -0400 Subject: [PATCH 52/66] update script names --- .../db/migration/{V5.11.0.1__hdc-3b.sql => V5.11.0.3__hdc-3b.sql} | 0 ...tructions.sql => V5.11.0.4__hdc-3b2-template-instructions.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V5.11.0.1__hdc-3b.sql => V5.11.0.3__hdc-3b.sql} (100%) rename src/main/resources/db/migration/{V5.11.0.2__hdc-3b2-template-instructions.sql => V5.11.0.4__hdc-3b2-template-instructions.sql} (100%) diff --git a/src/main/resources/db/migration/V5.11.0.1__hdc-3b.sql b/src/main/resources/db/migration/V5.11.0.3__hdc-3b.sql similarity index 100% rename from src/main/resources/db/migration/V5.11.0.1__hdc-3b.sql rename to src/main/resources/db/migration/V5.11.0.3__hdc-3b.sql diff --git a/src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql b/src/main/resources/db/migration/V5.11.0.4__hdc-3b2-template-instructions.sql similarity index 100% rename from src/main/resources/db/migration/V5.11.0.2__hdc-3b2-template-instructions.sql rename to src/main/resources/db/migration/V5.11.0.4__hdc-3b2-template-instructions.sql From c9c6f8628ce22c8209b7fdab22c6f2b6498ec9b8 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 3 Aug 2022 18:55:41 -0400 Subject: [PATCH 53/66] rename scripts per review --- .../db/migration/{V5.11.0.3__hdc-3b.sql => V5.11.1.3__hdc-3b.sql} | 0 ...tructions.sql => V5.11.1.4__hdc-3b2-template-instructions.sql} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V5.11.0.3__hdc-3b.sql => V5.11.1.3__hdc-3b.sql} (100%) rename src/main/resources/db/migration/{V5.11.0.4__hdc-3b2-template-instructions.sql => V5.11.1.4__hdc-3b2-template-instructions.sql} (100%) diff --git a/src/main/resources/db/migration/V5.11.0.3__hdc-3b.sql b/src/main/resources/db/migration/V5.11.1.3__hdc-3b.sql similarity index 100% rename from src/main/resources/db/migration/V5.11.0.3__hdc-3b.sql rename to src/main/resources/db/migration/V5.11.1.3__hdc-3b.sql diff --git a/src/main/resources/db/migration/V5.11.0.4__hdc-3b2-template-instructions.sql b/src/main/resources/db/migration/V5.11.1.4__hdc-3b2-template-instructions.sql similarity index 100% rename from src/main/resources/db/migration/V5.11.0.4__hdc-3b2-template-instructions.sql rename to src/main/resources/db/migration/V5.11.1.4__hdc-3b2-template-instructions.sql From 0ced73a6f1dd3089d97c79b348ec68f9a7cb9f9e Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 4 Aug 2022 13:28:45 -0400 Subject: [PATCH 54/66] change setting to use LDN, flip default to no hosts allowed --- src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java | 2 +- .../edu/harvard/iq/dataverse/settings/SettingsServiceBean.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java index 4e8625a99fd..3912b9102e2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/LDNInbox.java @@ -70,7 +70,7 @@ public class LDNInbox extends AbstractApiBean { @Consumes("application/ld+json, application/json-ld") public Response acceptMessage(String body) { IpAddress origin = new DataverseRequest(null, httpRequest).getSourceAddress(); - String whitelist = settingsService.get(SettingsServiceBean.Key.MessageHosts.toString(), "*"); + String whitelist = settingsService.get(SettingsServiceBean.Key.LDNMessageHosts.toString(), ""); // Only do something if we listen to this host if (whitelist.equals("*") || whitelist.contains(origin.toString())) { String citingPID = null; 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 4729887d656..e2be7050cae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -526,7 +526,7 @@ Whether Harvesting (OAI) service is enabled /** * LDN Inbox Allowed Hosts - a comma separated list of IP addresses allowed to submit messages to the inbox */ - MessageHosts + LDNMessageHosts ; @Override From 84a4826d6fc7815c8a9e4f3de53fdabc90c23858 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 4 Aug 2022 13:31:53 -0400 Subject: [PATCH 55/66] docs for receive api and send workflow --- .../source/api/linkeddatanotification.rst | 65 +++++++++++++++++++ .../source/developers/workflows.rst | 28 ++++++++ .../source/installation/config.rst | 7 +- 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 doc/sphinx-guides/source/api/linkeddatanotification.rst diff --git a/doc/sphinx-guides/source/api/linkeddatanotification.rst b/doc/sphinx-guides/source/api/linkeddatanotification.rst new file mode 100644 index 00000000000..5d22c9d3624 --- /dev/null +++ b/doc/sphinx-guides/source/api/linkeddatanotification.rst @@ -0,0 +1,65 @@ +Linked Data Notification API +============================ + +Dataverse has a limited, experimental API implementing a Linked Data Notification inbox allowing it to receive messages indicating a link between an external resource and a Dataverse dataset. +The motivating use case is to support a use case where Dataverse administrators may wish to create back-links to the remote resource (e.g. as a Related Publication, Related Material, etc.). + +Upon receipt of a relevant message, Dataverse will create Announcement Received notifications to superusers who can edit the dataset involved. (In the motivating use case, these users may then add an appropriate relationship and use the Update Curent Version publishing option to add it to the most recently published version of the dataset.) + +The ``:LDNMessageHosts`` setting is a comma-separated whitelist of hosts from which Dataverse will accept and process messages. By default, no hosts are allowed. ``*`` can be used in testing to indicate all hosts are allowed. + +Messages can be sent via POST, using the application/ld+json ContentType: + +.. code-block:: bash + + export SERVER_URL=https://demo.dataverse.org + + curl -X POST -H 'ContentType:application/ld+json' $SERVER_URL/api/inbox --upload-file message.jsonld + +The supported message format is desribed by `our preliminary specification`_. The format is expected to change in the near future to match the standard for relationship announcements being developed as part of `the COAR Notify Project`_. + +An example message is shown below. It indicates that a resource with the name "An Interesting Title" exists and "IsSupplementedBy" the dataset with DOI https://doi.org/10.5072/FK2/GGCCDL. If this dataset is managed in the receiving Dataverse, a notification will be sent to user with the relevant permissions (as described above). + +.. code:: json + +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://purl.org/coar/notify" + ], + "id": "urn:uuid:94ecae35-dcfd-4182-8550-22c7164fe23f", + "actor": { + "id": "https://research-organisation.org/dspace", + "name": "DSpace Repository", + "type": "Service" + }, + "context": { + "IsSupplementedBy": + { + "id": "http://dev-hdc3b.lib.harvard.edu/dataset.xhtml?persistentId=doi:10.5072/FK2/GGCCDL", + "ietf:cite-as": "https://doi.org/10.5072/FK2/GGCCDL", + "type": "sorg:Dataset" + } + }, + "object": { + "id": "https://research-organisation.org/dspace/item/35759679-5df3-4633-b7e5-4cf24b4d0614", + "ietf:cite-as": "https://research-organisation.org/authority/resolve/35759679-5df3-4633-b7e5-4cf24b4d0614", + "sorg:name": "An Interesting Title", + "type": "sorg:ScholarlyArticle" + }, + "origin": { + "id": "https://research-organisation.org/dspace", + "inbox": "https://research-organisation.org/dspace/inbox/", + "type": "Service" + }, + "target": { + "id": "https://research-organisation.org/dataverse", + "inbox": "https://research-organisation.org/dataverse/inbox/", + "type": "Service" + }, + "type": [ + "Announce", + "coar-notify:ReleaseAction" + ] +} + diff --git a/doc/sphinx-guides/source/developers/workflows.rst b/doc/sphinx-guides/source/developers/workflows.rst index df63bf239fe..c9a31e8c568 100644 --- a/doc/sphinx-guides/source/developers/workflows.rst +++ b/doc/sphinx-guides/source/developers/workflows.rst @@ -201,3 +201,31 @@ Note - the example step includes two settings required for any archiver, three ( } } + +ldnannounce ++++++++++++ + +An experimental step that sends a Linked Data Notification (LDN) message to a specific LDN Inbox announcing the publication/availability of a dataset meeting certain criteria. + +The two parameters are +* ``:LDNAnnounceRequiredFields`` - a list of metadata fields that must exist to trigger the message. Currently, the message also includes the values for these fields but future versions may only send the dataset's persistent identifier (making the receiver responsible for making a call-back to get any metadata). +* ``:LDNTarget`` - a JSON object containing an ``inbox`` key whose value is the URL of the target LDN inbox to which messages should be sent, e.g. ``{"id": "https://dashv7-dev.lib.harvard.edu","inbox": "https://dashv7-api-dev.lib.harvard.edu/server/ldn/inbox","type": "Service"}`` ). + +The supported message format is desribed by `our preliminary specification`_. The format is expected to change in the near future to match the standard for relationship announcements being developed as part of `the COAR Notify Project`_. + + +.. code:: json + + + { + "provider":":internal", + "stepType":"ldnannounce", + "parameters": { + "stepName":"LDN Announce" + }, + "requiredSettings": { + ":LDNAnnounceRequiredFields": "string", + ":LDNTarget": "string" + } + } + diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 5c227417271..f86377d0c3a 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -2566,7 +2566,7 @@ Number of errors to display to the user when creating DataFiles from a file uplo .. _:BagItHandlerEnabled: :BagItHandlerEnabled -+++++++++++++++++++++ +++++++++++++++++++++ Part of the database settings to configure the BagIt file handler. Enables the BagIt file handler. By default, the handler is disabled. @@ -2849,3 +2849,8 @@ For configuration details, see :ref:`mute-notifications`. Overrides the default empty list of never muted notifications. Never muted notifications cannot be muted by the users. Always muted notifications are grayed out and are not adjustable by the user. For configuration details, see :ref:`mute-notifications`. + +:LDNMessageHosts +++++++++++++++++ + +The comma-separated list of hosts allowed to send Dataverse Linked Data Notification messages. See :doc:`/api/linkeddatanotification` for details. ``*`` allows messages from anywhere (not recommended for production). By default, messages are not accepted from anywhere. From 6fa670abf910be6aeaeedc59e9a34460f5e73f62 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 5 Aug 2022 16:15:29 -0400 Subject: [PATCH 56/66] add indent --- .../source/api/linkeddatanotification.rst | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/doc/sphinx-guides/source/api/linkeddatanotification.rst b/doc/sphinx-guides/source/api/linkeddatanotification.rst index 5d22c9d3624..3a194ac77dc 100644 --- a/doc/sphinx-guides/source/api/linkeddatanotification.rst +++ b/doc/sphinx-guides/source/api/linkeddatanotification.rst @@ -22,44 +22,44 @@ An example message is shown below. It indicates that a resource with the name "A .. code:: json -{ - "@context": [ - "https://www.w3.org/ns/activitystreams", - "https://purl.org/coar/notify" - ], - "id": "urn:uuid:94ecae35-dcfd-4182-8550-22c7164fe23f", - "actor": { - "id": "https://research-organisation.org/dspace", - "name": "DSpace Repository", - "type": "Service" - }, - "context": { - "IsSupplementedBy": - { - "id": "http://dev-hdc3b.lib.harvard.edu/dataset.xhtml?persistentId=doi:10.5072/FK2/GGCCDL", - "ietf:cite-as": "https://doi.org/10.5072/FK2/GGCCDL", - "type": "sorg:Dataset" - } - }, - "object": { - "id": "https://research-organisation.org/dspace/item/35759679-5df3-4633-b7e5-4cf24b4d0614", - "ietf:cite-as": "https://research-organisation.org/authority/resolve/35759679-5df3-4633-b7e5-4cf24b4d0614", - "sorg:name": "An Interesting Title", - "type": "sorg:ScholarlyArticle" - }, - "origin": { - "id": "https://research-organisation.org/dspace", - "inbox": "https://research-organisation.org/dspace/inbox/", - "type": "Service" - }, - "target": { - "id": "https://research-organisation.org/dataverse", - "inbox": "https://research-organisation.org/dataverse/inbox/", - "type": "Service" - }, - "type": [ - "Announce", - "coar-notify:ReleaseAction" - ] -} + { + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://purl.org/coar/notify" + ], + "id": "urn:uuid:94ecae35-dcfd-4182-8550-22c7164fe23f", + "actor": { + "id": "https://research-organisation.org/dspace", + "name": "DSpace Repository", + "type": "Service" + }, + "context": { + "IsSupplementedBy": + { + "id": "http://dev-hdc3b.lib.harvard.edu/dataset.xhtml?persistentId=doi:10.5072/FK2/GGCCDL", + "ietf:cite-as": "https://doi.org/10.5072/FK2/GGCCDL", + "type": "sorg:Dataset" + } + }, + "object": { + "id": "https://research-organisation.org/dspace/item/35759679-5df3-4633-b7e5-4cf24b4d0614", + "ietf:cite-as": "https://research-organisation.org/authority/resolve/35759679-5df3-4633-b7e5-4cf24b4d0614", + "sorg:name": "An Interesting Title", + "type": "sorg:ScholarlyArticle" + }, + "origin": { + "id": "https://research-organisation.org/dspace", + "inbox": "https://research-organisation.org/dspace/inbox/", + "type": "Service" + }, + "target": { + "id": "https://research-organisation.org/dataverse", + "inbox": "https://research-organisation.org/dataverse/inbox/", + "type": "Service" + }, + "type": [ + "Announce", + "coar-notify:ReleaseAction" + ] + } From b0a6af946d228f60109fe41c625d6aa403970c8a Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 5 Aug 2022 16:24:41 -0400 Subject: [PATCH 57/66] typos --- doc/sphinx-guides/source/api/linkeddatanotification.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/sphinx-guides/source/api/linkeddatanotification.rst b/doc/sphinx-guides/source/api/linkeddatanotification.rst index 3a194ac77dc..d55dc4da084 100644 --- a/doc/sphinx-guides/source/api/linkeddatanotification.rst +++ b/doc/sphinx-guides/source/api/linkeddatanotification.rst @@ -1,10 +1,10 @@ Linked Data Notification API ============================ -Dataverse has a limited, experimental API implementing a Linked Data Notification inbox allowing it to receive messages indicating a link between an external resource and a Dataverse dataset. +Dataverse has a limited, experimental API implementing a Linked Data Notification inbox allowing it to receive messages indicating a link between an external resource and a Dataverse dataset. The motivating use case is to support a use case where Dataverse administrators may wish to create back-links to the remote resource (e.g. as a Related Publication, Related Material, etc.). -Upon receipt of a relevant message, Dataverse will create Announcement Received notifications to superusers who can edit the dataset involved. (In the motivating use case, these users may then add an appropriate relationship and use the Update Curent Version publishing option to add it to the most recently published version of the dataset.) +Upon receipt of a relevant message, Dataverse will create Announcement Received notifications for superusers, who can edit the dataset involved. (In the motivating use case, these users may then add an appropriate relationship and use the Update Curent Version publishing option to add it to the most recently published version of the dataset.) The ``:LDNMessageHosts`` setting is a comma-separated whitelist of hosts from which Dataverse will accept and process messages. By default, no hosts are allowed. ``*`` can be used in testing to indicate all hosts are allowed. @@ -16,9 +16,9 @@ Messages can be sent via POST, using the application/ld+json ContentType: curl -X POST -H 'ContentType:application/ld+json' $SERVER_URL/api/inbox --upload-file message.jsonld -The supported message format is desribed by `our preliminary specification`_. The format is expected to change in the near future to match the standard for relationship announcements being developed as part of `the COAR Notify Project`_. +The supported message format is described by `our preliminary specification `_. The format is expected to change in the near future to match the standard for relationship announcements being developed as part of `the COAR Notify Project `_. -An example message is shown below. It indicates that a resource with the name "An Interesting Title" exists and "IsSupplementedBy" the dataset with DOI https://doi.org/10.5072/FK2/GGCCDL. If this dataset is managed in the receiving Dataverse, a notification will be sent to user with the relevant permissions (as described above). +An example message is shown below. It indicates that a resource with the name "An Interesting Title" exists and "IsSupplementedBy" the dataset with DOI https://doi.org/10.5072/FK2/GGCCDL. If this dataset is managed in the receiving Dataverse, a notification will be sent to user with the relevant permissions (as described above). .. code:: json From fc2d67d169e350b0e357ba949527acc2ec853e44 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 5 Aug 2022 16:32:46 -0400 Subject: [PATCH 58/66] missing spaces --- doc/sphinx-guides/source/developers/workflows.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/sphinx-guides/source/developers/workflows.rst b/doc/sphinx-guides/source/developers/workflows.rst index c9a31e8c568..38ca6f4e141 100644 --- a/doc/sphinx-guides/source/developers/workflows.rst +++ b/doc/sphinx-guides/source/developers/workflows.rst @@ -211,7 +211,7 @@ The two parameters are * ``:LDNAnnounceRequiredFields`` - a list of metadata fields that must exist to trigger the message. Currently, the message also includes the values for these fields but future versions may only send the dataset's persistent identifier (making the receiver responsible for making a call-back to get any metadata). * ``:LDNTarget`` - a JSON object containing an ``inbox`` key whose value is the URL of the target LDN inbox to which messages should be sent, e.g. ``{"id": "https://dashv7-dev.lib.harvard.edu","inbox": "https://dashv7-api-dev.lib.harvard.edu/server/ldn/inbox","type": "Service"}`` ). -The supported message format is desribed by `our preliminary specification`_. The format is expected to change in the near future to match the standard for relationship announcements being developed as part of `the COAR Notify Project`_. +The supported message format is desribed by `our preliminary specification `_. The format is expected to change in the near future to match the standard for relationship announcements being developed as part of `the COAR Notify Project `_. .. code:: json From 99300ae00ce4c0d0cf0c2bdc39a08083222c578d Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 5 Aug 2022 16:37:16 -0400 Subject: [PATCH 59/66] add to toc --- doc/sphinx-guides/source/api/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/sphinx-guides/source/api/index.rst b/doc/sphinx-guides/source/api/index.rst index 9fc58ef4e5a..c9e79098546 100755 --- a/doc/sphinx-guides/source/api/index.rst +++ b/doc/sphinx-guides/source/api/index.rst @@ -21,5 +21,6 @@ API Guide client-libraries external-tools curation-labels + linkeddatanotification apps faq From e137a9b2ba16a276944c3746e0e44bf6b1b907a1 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Mon, 8 Aug 2022 16:22:24 -0400 Subject: [PATCH 60/66] change test that counts citation block elements --- src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java index c34ee2dd4bf..8b36f28b4fc 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/AdminIT.java @@ -761,7 +761,8 @@ public void testLoadMetadataBlock_NoErrorPath() { Map>> data = JsonPath.from(body).getMap("data"); assertEquals(1, data.size()); List> addedElements = data.get("added"); - assertEquals(321, addedElements.size()); + //Note -test depends on the number of elements in the production citation block, so any changes to the # of elements there can break this test + assertEquals(322, addedElements.size()); Map statistics = new HashMap<>(); for (Map unit : addedElements) { From 95d8ffabf04a74e09f0f6030c0ff13d9f9850a86 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 11 Aug 2022 15:01:08 -0400 Subject: [PATCH 61/66] add workflow settings to main list per qa --- doc/sphinx-guides/source/installation/config.rst | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 2d294980720..3405285fefb 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -943,7 +943,7 @@ Some external tools are also ready to be translated, especially if they are usin Tools for Translators -+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++ The list below depicts a set of tools that can be used to ease the amount of work necessary for translating the Dataverse software by facilitating this collaborative effort and enabling the reuse of previous work: @@ -2865,4 +2865,15 @@ For configuration details, see :ref:`mute-notifications`. :LDNMessageHosts ++++++++++++++++ -The comma-separated list of hosts allowed to send Dataverse Linked Data Notification messages. See :doc:`/api/linkeddatanotification` for details. ``*`` allows messages from anywhere (not recommended for production). By default, messages are not accepted from anywhere. +The comma-separated list of hosts allowed to send Dataverse Linked Data Notification messages. See :doc:`/api/linkeddatanotification` for details. ``*`` allows messages from anywhere (not recommended for production). By default, messages are not accepted from anywhere. + + +:LDN_TARGET ++++++++++++ + +The URL of an LDN Inbox to which the LDN Announce workflow step will send messages. See :doc:`/developers/workflows` for details. + +:LDNAnnounceRequiredFields +++++++++++++++++++++++++++ + +The list of parent dataset field names for which the LDN Announce workflow step should send messages. See :doc:`/developers/workflows` for details. From 1d76db0a4f9db646548fd606fc96630fe2f91825 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 11 Aug 2022 19:37:46 -0400 Subject: [PATCH 62/66] add template custom instructions info --- .../source/user/dataverse-management.rst | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/sphinx-guides/source/user/dataverse-management.rst b/doc/sphinx-guides/source/user/dataverse-management.rst index efe98e8327c..ed90497da8c 100755 --- a/doc/sphinx-guides/source/user/dataverse-management.rst +++ b/doc/sphinx-guides/source/user/dataverse-management.rst @@ -44,7 +44,7 @@ To edit your Dataverse collection, navigate to your Dataverse collection's landi - :ref:`Theme `: upload a logo for your Dataverse collection, add a link to your department or personal website, add a custom footer image, and select colors for your Dataverse collection in order to brand it - :ref:`Widgets `: get code to add to your website to have your Dataverse collection display on it - :ref:`Permissions `: give other users permissions to your Dataverse collection, i.e.-can edit datasets, and see which users already have which permissions for your Dataverse collection -- :ref:`Dataset Templates `: these are useful when you have several datasets that have the same information in multiple metadata fields that you would prefer not to have to keep manually typing in +- :ref:`Dataset Templates `: these are useful when you want to provide custom instructions on how to fill out fields or have several datasets that have the same information in multiple metadata fields that you would prefer not to have to keep manually typing in - :ref:`Dataset Guestbooks `: allows you to collect data about who is downloading the files from your datasets - :ref:`Featured Dataverse collections `: if you have one or more Dataverse collection, you can use this option to show them at the top of your Dataverse collection page to help others easily find interesting or important Dataverse collections - **Delete Dataverse**: you are able to delete your Dataverse collection as long as it is not published and does not have any draft datasets @@ -52,7 +52,7 @@ To edit your Dataverse collection, navigate to your Dataverse collection's landi .. _general-information: General Information ---------------------- +------------------- The General Information page is how you edit the information you filled in while creating your Dataverse collection. If you need to change or add a contact email address, this is the place to do it. Additionally, you can update the metadata elements used for datasets within the Dataverse collection, change which metadata fields are hidden, required, or optional, and update the facets you would like displayed for browsing the Dataverse collection. If you plan on using templates, you need to select the metadata fields on the General Information page. @@ -60,8 +60,8 @@ Tip: The metadata fields you select as required will appear on the Create Datase .. _theme: -Theme ---------- +Theme +----- The Theme features provides you with a way to customize the look of your Dataverse collection. You can: @@ -77,7 +77,7 @@ Supported image types for logo images and footer images are JPEG, TIFF, or PNG a .. _dataverse-widgets: Widgets --------------- +------- The Widgets feature provides you with code for you to put on your personal website to have your Dataverse collection displayed there. There are two types of Widgets for a Dataverse collection, a Dataverse collection Search Box widget and a Dataverse collection Listing widget. Once a Dataverse collection has been published, from the Widgets tab on the Dataverse collection's Theme + Widgets page, it is possible to copy the code snippets for the widget(s) you would like to add to your website. If you need to adjust the height of the widget on your website, you may do so by editing the `heightPx=500` parameter in the code snippet. @@ -94,7 +94,7 @@ The Dataverse Collection Listing Widget provides a listing of all your Dataverse .. _openscholar-dataverse-level: Adding Widgets to an OpenScholar Website -****************************************** +**************************************** #. Log in to your OpenScholar website #. Either build a new page or navigate to the page you would like to use to show the Dataverse collection widgets. #. Click on the Settings Cog and select Layout @@ -102,8 +102,8 @@ Adding Widgets to an OpenScholar Website .. _dataverse-permissions: -Roles & Permissions ---------------------- +Roles & Permissions +------------------- Dataverse installation user accounts can be granted roles that define which actions they are allowed to take on specific Dataverse collections, datasets, and/or files. Each role comes with a set of permissions, which define the specific actions that users may take. Roles and permissions may also be granted to groups. Groups can be defined as a collection of Dataverse installation user accounts, a collection of IP addresses (e.g. all users of a library's computers), or a collection of all users who log in using a particular institutional login (e.g. everyone who logs in with a particular university's account credentials). @@ -127,7 +127,7 @@ When you access a Dataverse collection's permissions page, you will see three se Please note that even on a newly created Dataverse collection, you may see user and groups have already been granted role(s) if your installation has ``:InheritParentRoleAssignments`` set. For more on this setting, see the :doc:`/installation/config` section of the Installation Guide. Setting Access Configurations -******************************* +***************************** Under the Permissions tab, you can click the "Edit Access" button to open a box where you can add to your Dataverse collection and what permissions are granted to those who add to your Dataverse collection. @@ -140,7 +140,7 @@ The second question on this page allows you to choose the role (and thus the per Both of these settings can be changed at any time. Assigning Roles to Users and Groups -************************************* +*********************************** Under the Users/Groups tab, you can add, edit, or remove the roles granted to users and groups on your Dataverse collection. A role is a set of permissions granted to a user or group when they're using your Dataverse collection. For example, giving your research assistant the "Contributor" role would give them the following self-explanatory permissions on your Dataverse collection and all datasets within your Dataverse collection: "ViewUnpublishedDataset", "DownloadFile", "EditDataset", and "DeleteDatasetDraft". They would, however, lack the "PublishDataset" permission, and thus would be unable to publish datasets on your Dataverse collection. If you wanted to give them that permission, you would give them a role with that permission, like the Curator role. Users and groups can hold multiple roles at the same time if needed. Roles can be removed at any time. All roles and their associated permissions are listed under the "Roles" tab of the same page. @@ -155,15 +155,16 @@ Note: If you need to assign a role to ALL user accounts in a Dataverse installat .. _dataset-templates: Dataset Templates -------------------- +----------------- -Templates are useful when you have several datasets that have the same information in multiple metadata fields that you would prefer not to have to keep manually typing in, or if you want to use a custom set of Terms of Use and Access for multiple datasets in a Dataverse collection. In Dataverse Software 4.0+, templates are created at the Dataverse collection level, can be deleted (so it does not show for future datasets), set to default (not required), or can be copied so you do not have to start over when creating a new template with similar metadata from another template. When a template is deleted, it does not impact the datasets that have used the template already. +Templates are useful when you want to provide custom instructions on how to fill out a field, have several datasets that have the same information in multiple metadata fields that you would prefer not to have to keep manually typing in, or if you want to use a custom set of Terms of Use and Access for multiple datasets in a Dataverse collection. In Dataverse Software 4.0+, templates are created at the Dataverse collection level, can be deleted (so it does not show for future datasets), set to default (not required), or can be copied so you do not have to start over when creating a new template with similar metadata from another template. When a template is deleted, it does not impact the datasets that have used the template already. How do you create a template? #. Navigate to your Dataverse collection, click on the Edit Dataverse button and select Dataset Templates. #. Once you have clicked on Dataset Templates, you will be brought to the Dataset Templates page. On this page, you can 1) decide to use the dataset templates from your parent Dataverse collection 2) create a new dataset template or 3) do both. #. Click on the Create Dataset Template to get started. You will see that the template is the same as the create dataset page with an additional field at the top of the page to add a name for the template. +#. To add custom instructions, click on ''(None - click to add)'' and enter the instructions you wish users to see. If you wish to edit existing instructions, click on them to make the text editable. #. After adding information into the metadata fields you have information for and clicking Save and Add Terms, you will be brought to the page where you can add custom Terms of Use and Access. If you do not need custom Terms of Use and Access, click the Save Dataset Template, and only the metadata fields will be saved. #. After clicking Save Dataset Template, you will be brought back to the Manage Dataset Templates page and should see your template listed there now with the make default, edit, view, or delete options. #. A Dataverse collection does not have to have a default template and users can select which template they would like to use while on the Create Dataset page. @@ -174,7 +175,7 @@ How do you create a template? .. _dataset-guestbooks: Dataset Guestbooks ------------------------------ +------------------ Guestbooks allow you to collect data about who is downloading the files from your datasets. You can decide to collect account information (username, given name & last name, affiliation, etc.) as well as create custom questions (e.g., What do you plan to use this data for?). You are also able to download the data collected from the enabled guestbooks as CSV files to store and use outside of the Dataverse installation. @@ -227,7 +228,7 @@ Similarly to dataset linking, Dataverse collection linking allows a Dataverse co If you need to have a Dataverse collection linked to your Dataverse collection, please contact the support team for the Dataverse installation you are using. Publish Your Dataverse Collection -================================================================= +================================= Once your Dataverse collection is ready to go public, go to your Dataverse collection page, click on the "Publish" button on the right hand side of the page. A pop-up will appear to confirm that you are ready to actually Publish, since once a Dataverse collection From ec108ab221b119b68910454304818aed38c2ad80 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Fri, 12 Aug 2022 12:52:29 -0400 Subject: [PATCH 63/66] fix npes on template page --- src/main/webapp/dataset-license-terms.xhtml | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/main/webapp/dataset-license-terms.xhtml b/src/main/webapp/dataset-license-terms.xhtml index 1a190064a42..7d83b15fb89 100644 --- a/src/main/webapp/dataset-license-terms.xhtml +++ b/src/main/webapp/dataset-license-terms.xhtml @@ -248,7 +248,7 @@
-
+

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