From 8e91e2e8691098d98536e1f44f5fd82d4872ec8c Mon Sep 17 00:00:00 2001 From: "francesco.mangiacrapa" Date: Wed, 20 Dec 2023 11:56:51 +0100 Subject: [PATCH] Updated Fixer.fixIncomingDateString. Updated the DepositionMetadata dates without Time --- .../data/publishing/ckan2zenodo/Fixer.java | 18 +- .../ckan2zenodo/clients/Zenodo.java | 27 +-- .../ckan2zenodo/model/zenodo/Commons.java | 8 +- .../model/zenodo/DateInterval.java | 8 +- .../model/zenodo/DepositionMetadata.java | 6 +- .../publishing/ckan2zenodo/TestCommons.java | 4 + .../ckan2zenodo/Test_BugFix_26166.java | 189 ++++++++++++++++++ 7 files changed, 227 insertions(+), 33 deletions(-) create mode 100644 src/test/java/org/gcube/data/publishing/ckan2zenodo/Test_BugFix_26166.java diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/Fixer.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/Fixer.java index 5b28a29..4e9c675 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/Fixer.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/Fixer.java @@ -2,7 +2,6 @@ package org.gcube.data.publishing.ckan2zenodo; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -52,6 +51,11 @@ public class Fixer { } + /** + * It seems never used to me - by Francesco M. + * @param toFix + * @return + */ public static String fixSending(String toFix) { DocumentContext ctx=JsonPath.using(Parsing.JSON_PATH_ALWAYS_LIST_CONFIG).parse(toFix); DocumentContext pathCtx=JsonPath.using(Parsing.JSON_PATH_PATHS_CONFIGURATION).parse(toFix); @@ -85,6 +89,12 @@ public class Fixer { return valuesCtx; } + /** + * Updated by Francesco M., see #26166 + * @param toFix + * @return + * @throws Exception + */ public static final String fixIncomingDateString(String toFix) throws Exception { TemporalAccessor accessor=INCOMING_FORMATTER.parse(toFix); @@ -93,7 +103,11 @@ public class Fixer { zTime = LocalDateTime.from(accessor).atZone(ZoneOffset.UTC); else { LocalDate date=LocalDate.from(accessor); - zTime=LocalDateTime.of(date, LocalTime.of(0, 0, 0, 0)).atZone(ZoneOffset.UTC); + //original code + //zTime=LocalDateTime.of(date, LocalTime.of(0, 0, 0, 0)).atZone(ZoneOffset.UTC); + + //new code by Francesco M. returning a date without the Time + return date.toString(); } return zTime.format(INTERNAL_FORMATTER); diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/Zenodo.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/Zenodo.java index 5507d77..d387e44 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/Zenodo.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/Zenodo.java @@ -59,7 +59,9 @@ public class Zenodo { private static final String ACCESS_TOKEN="access_token"; - private static ObjectMapper mapper = new ObjectMapper(); + //private static ObjectMapper mapper = new ObjectMapper(); + //Updated by Francesco M. + public static final ObjectMapper mapper = new ObjectMapper(); static { mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); @@ -223,39 +225,20 @@ public class Zenodo { } private ZenodoDeposition updateMetadata(Integer depositionId,DepositionMetadata meta) throws ZenodoException { - /* - * Original - try{ - String serialized="{\"metadata\":"+Fixer.fixIncoming(mapper.writeValueAsString(meta))+"}"; - try { - Response resp = getWebClient().target(credentials.getBaseUrl()). - path(DEPOSITION_BASE_URL).path(depositionId+""). - queryParam(ACCESS_TOKEN, credentials.getKey()).request(CONTENT_TYPE) - .put(Entity.json(serialized)); - return check(resp,ZenodoDeposition.class); - }catch(Throwable t) { - log.debug("Error while tryin to update "+serialized); - throw t; - } - }catch(JsonProcessingException e) { - log.debug("Error while parsing "+meta,e); - throw new ZenodoException("Internal error.",e); - }*/ - + //Added logs by Francesco M. try{ String serialized="{\"metadata\":"+Fixer.fixIncoming(mapper.writeValueAsString(meta))+"}"; log.debug("updateMetadata - serialized: {}",serialized); try { Entity jsonEnt = Entity.json(serialized); - log.debug("updateMetadata - jsonEntity serialized: {}",jsonEnt.getEntity()); Response resp = getWebClient().target(credentials.getBaseUrl()). path(DEPOSITION_BASE_URL).path(depositionId+""). queryParam(ACCESS_TOKEN, credentials.getKey()).request(CONTENT_TYPE) .put(jsonEnt); return check(resp,ZenodoDeposition.class); }catch(Throwable t) { - log.debug("Error while tryin to update "+serialized); + log.debug("Error while trying to update "+serialized); throw t; } }catch(JsonProcessingException e) { diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/Commons.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/Commons.java index 03a002a..4bb1ce6 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/Commons.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/Commons.java @@ -2,7 +2,9 @@ package org.gcube.data.publishing.ckan2zenodo.model.zenodo; public class Commons { - public static final String ISO_DATE_PATTERN="yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"; - - + public static final String ISO_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ"; + + // Added by Francesco M. #26166 + public static final String ISO_DATE_PATTERN_WITHOUT_TIME = "yyyy-MM-dd"; + } diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DateInterval.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DateInterval.java index 0d28c1b..74ed08b 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DateInterval.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DateInterval.java @@ -17,11 +17,13 @@ public class DateInterval { public static enum Type{ Collected, Valid, Withdrawn } - - @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + + //Updated by Francesco M. #26166 + @JsonFormat(pattern = Commons.ISO_DATE_PATTERN_WITHOUT_TIME) @JsonDeserialize(using = DateParser.class) private Date start; - @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + //Updated by Francesco M. #26166 + @JsonFormat(pattern = Commons.ISO_DATE_PATTERN_WITHOUT_TIME) @JsonDeserialize(using = DateParser.class) private Date end; // @NonNull diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DepositionMetadata.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DepositionMetadata.java index e9f84c3..37d5734 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DepositionMetadata.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/DepositionMetadata.java @@ -66,8 +66,8 @@ public class DepositionMetadata { private UploadType upload_type; private PublicationType publication_type; private ImageType image_type; -// @NonNull - @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) +// @NonNull - Updated by Francesco M. + @JsonFormat(pattern = Commons.ISO_DATE_PATTERN_WITHOUT_TIME) private Date publication_date; // @NonNull private String title; @@ -78,7 +78,7 @@ public class DepositionMetadata { // @NonNull private AccessRights access_right; private String license; // TODO ENUM https://licenses.opendefinition.org/licenses/groups/all.json - @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + @JsonFormat(pattern = Commons.ISO_DATE_PATTERN_WITHOUT_TIME) private Date embargo_date; private String access_conditions; // TODO HTML private String doi; diff --git a/src/test/java/org/gcube/data/publishing/ckan2zenodo/TestCommons.java b/src/test/java/org/gcube/data/publishing/ckan2zenodo/TestCommons.java index 0b0fa8e..0120cfd 100644 --- a/src/test/java/org/gcube/data/publishing/ckan2zenodo/TestCommons.java +++ b/src/test/java/org/gcube/data/publishing/ckan2zenodo/TestCommons.java @@ -4,12 +4,15 @@ import java.io.IOException; import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Paths; +import java.time.Instant; +import java.util.Date; import java.util.HashMap; import java.util.Map; import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; import org.gcube.data.publishing.ckan2zenodo.model.CkanResource; import org.gcube.data.publishing.ckan2zenodo.model.ZenodoCredentials; +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; import com.fasterxml.jackson.annotation.JsonInclude.Include; @@ -74,4 +77,5 @@ public class TestCommons { throw new Exception("Errors with json file "+jsonFile,t); } } + } diff --git a/src/test/java/org/gcube/data/publishing/ckan2zenodo/Test_BugFix_26166.java b/src/test/java/org/gcube/data/publishing/ckan2zenodo/Test_BugFix_26166.java new file mode 100644 index 0000000..aca7f90 --- /dev/null +++ b/src/test/java/org/gcube/data/publishing/ckan2zenodo/Test_BugFix_26166.java @@ -0,0 +1,189 @@ +package org.gcube.data.publishing.ckan2zenodo; + +import java.io.IOException; +import java.time.Instant; +import java.util.Date; + +import javax.ws.rs.client.Entity; + +import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo; +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata; +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * The Class Test_BugFix_26166. + * + * @author Francesco Mangiacrapa at ISTI-CNR francesco.mangiacrapa@isti.cnr.it + * + * Dec 20, 2023 + */ +@Slf4j +public class Test_BugFix_26166 { + + + @Test + public void testDate(){ + + ZenodoDeposition zenodo = new ZenodoDeposition(); + zenodo.setCreated(Date.from(Instant.now())); + zenodo.setModified(Date.from(Instant.now())); + DepositionMetadata metadata = new DepositionMetadata(); + metadata.setPublication_date(Date.from(Instant.now())); + metadata.setEmbargo_date(Date.from(Instant.now())); + zenodo.setMetadata(metadata); + + ObjectMapper mapper = Zenodo.mapper; + + try { + String serialized = "{\"metadata\":" + Fixer.fixIncoming(mapper.writeValueAsString(zenodo)) + "}"; + log.debug("updateMetadata - serialized: {}", serialized); + try { + Entity jsonEnt = Entity.json(serialized); + log.debug("updateMetadata - jsonEntity serialized: {}", jsonEnt.getEntity()); + } catch (Throwable t) { + log.debug("Error while tryin to update " + serialized); + throw t; + } + } catch (JsonProcessingException e) { + log.debug("Error while parsing " + metadata, e); + e.printStackTrace(); + } + } + + @Test + public void testReadDepositionFromZenodo(){ + + String depoisitionString = " {\n" + + " \"created\": \"2023-12-14T11:33:09.650134+00:00\",\n" + + " \"modified\": \"2023-12-14T11:33:09.700320+00:00\",\n" + + " \"id\": 10377042,\n" + + " \"conceptrecid\": \"10377041\",\n" + + " \"metadata\": {\n" + + " \"title\": \"Blue-Cloud 2026 - D4.2 VLabs Implementation Guidelines\",\n" + + " \"publication_date\": \"2023-12-14\",\n" + + " \"description\": \"This deliverable provides guidelines on how to implement the Virtual \\nLaboratories (VLabs) in the Blue-Cloud Virtual Research Environment (VRE). \\nFirst a summary of the activities of WP4 is presented, followed by an \\noverview of the VRE services, that offer a comprehensive array of features, \\nfostering collaboration, facilitating data analytics, enabling result \\ndissemination, and ensuring seamless integration with external systems. In \\nfact, the VRE caters to the entirety of the research lifecycle.\",\n" + + " \"access_right\": \"open\",\n" + + " \"creators\": [\n" + + " {\n" + + " \"name\": \"Assante, Massimiliano\",\n" + + " \"affiliation\": \"National Research Council of Italy - Institute of Information Science and Technologies\",\n" + + " \"orcid\": \"0000-0002-3761-1492\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Martin-Cabrera\",\n" + + " \"affiliation\": \"Flanders Marine Institute (VLIZ)\",\n" + + " \"orcid\": \"0000-0003-3293-5612\"\n" + + " }\n" + + " ],\n" + + " \"contributors\": [\n" + + " {\n" + + " \"name\": \"Vitorino, Joao\",\n" + + " \"affiliation\": null,\n" + + " \"type\": \"Other\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Troupin, Charles, ctroupin@uliege.be, orcid.org/\",\n" + + " \"affiliation\": \"Université de Liège\",\n" + + " \"type\": \"Other\",\n" + + " \"orcid\": \"0000-0002-0265-1021\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Pint, Steven\",\n" + + " \"affiliation\": \"Flanders Marine Institute (VLIZ)\",\n" + + " \"type\": \"Other\",\n" + + " \"orcid\": \"0000-0001-5530-6785\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Palermo, Francesco\",\n" + + " \"affiliation\": \"Centro Euro-Mediterraneo sui Cambiamenti Climatici (CMCC)\",\n" + + " \"type\": \"Other\",\n" + + " \"orcid\": \"0000-0002-0463-4655\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Grasset, Bastien\",\n" + + " \"affiliation\": \"French National Research Institute for Sustainable Development (IRD)\",\n" + + " \"type\": \"Other\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Barth, Alexander\",\n" + + " \"affiliation\": \"Université de Liège\",\n" + + " \"type\": \"Other\",\n" + + " \"orcid\": \"0000-0003-2952-5997\"\n" + + " },\n" + + " {\n" + + " \"name\": \"Barde, Julien\",\n" + + " \"affiliation\": \"French National Research Institute for Sustainable Development (IRD)\",\n" + + " \"type\": \"Other\",\n" + + " \"orcid\": \"0000-0002-3519-6141\"\n" + + " }\n" + + " ],\n" + + " \"keywords\": [\n" + + " \"VLabs\",\n" + + " \"VRE\"\n" + + " ],\n" + + " \"related_identifiers\": [\n" + + " {\n" + + " \"identifier\": \"https://data.d4science.org/ctlg/Blue-Cloud2026Project/d4_2_vlabs_implementation_guidelines\",\n" + + " \"relation\": \"isCompiledBy\",\n" + + " \"scheme\": \"url\"\n" + + " }\n" + + " ],\n" + + " \"version\": \"1\",\n" + + " \"grants\": [\n" + + " {\n" + + " \"id\": \"10.13039/501100000780::101094227\"\n" + + " }\n" + + " ],\n" + + " \"license\": \"cc-by-4.0\",\n" + + " \"imprint_publisher\": \"Zenodo\",\n" + + " \"communities\": [\n" + + " {\n" + + " \"identifier\": \"bluecloud\"\n" + + " }\n" + + " ],\n" + + " \"upload_type\": \"publication\",\n" + + " \"publication_type\": \"deliverable\",\n" + + " \"prereserve_doi\": {\n" + + " \"doi\": \"10.5281/zenodo.10377042\",\n" + + " \"recid\": 10377042\n" + + " }\n" + + " },\n" + + " \"title\": \"Blue-Cloud 2026 - D4.2 VLabs Implementation Guidelines\",\n" + + " \"links\": {\n" + + " \"self\": \"https://zenodo.org/api/records/10377042\",\n" + + " \"html\": \"https://zenodo.org/records/10377042\",\n" + + " \"badge\": \"https://zenodo.org/badge/doi/.svg\",\n" + + " \"files\": \"https://zenodo.org/api/records/10377042/files\",\n" + + " \"latest_draft\": \"https://zenodo.org/api/deposit/depositions/10377042\",\n" + + " \"latest_draft_html\": \"https://zenodo.org/deposit/10377042\",\n" + + " \"publish\": \"https://zenodo.org/api/deposit/depositions/10377042/actions/publish\",\n" + + " \"edit\": \"https://zenodo.org/api/deposit/depositions/10377042/actions/edit\",\n" + + " \"discard\": \"https://zenodo.org/api/deposit/depositions/10377042/actions/discard\",\n" + + " \"newversion\": \"https://zenodo.org/api/deposit/depositions/10377042/actions/newversion\",\n" + + " \"registerconceptdoi\": \"https://zenodo.org/api/deposit/depositions/10377042/actions/registerconceptdoi\"\n" + + " },\n" + + " \"record_id\": 10377042,\n" + + " \"owner\": 82231,\n" + + " \"files\": [],\n" + + " \"state\": \"unsubmitted\",\n" + + " \"submitted\": false\n" + + " }"; + + try { + ObjectMapper mapper = Zenodo.mapper; + ZenodoDeposition dep = mapper.readValue(Fixer.fixIncoming(depoisitionString), ZenodoDeposition.class); + System.out.println("The deposition: "+dep); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + +}