diff --git a/CHANGELOG.md b/CHANGELOG.md index 49c69e7..a48a41a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,8 @@ ### Enhancements - Default Ckan2Zenodo translation to comply with mandatory Zenodo fields (https://support.d4science.org/issues/19489) - Ckan2Zenodo library to provide means to apply default translation only (https://support.d4science.org/issues/19490) --Support to "split" on source values - +-Support to "split" on source values (https://support.d4science.org/issues/19534) +-Support to "append" to target elements (https://support.d4science.org/issues/19535) +-Multiple Date Format parsing (https://support.d4science.org/issues/19540) This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). \ No newline at end of file diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/commons/DateParser.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/commons/DateParser.java new file mode 100644 index 0000000..5578ac0 --- /dev/null +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/commons/DateParser.java @@ -0,0 +1,41 @@ +package org.gcube.data.publishing.ckan2zenodo.commons; + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.Commons; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; + +public class DateParser extends JsonDeserializer{ + + private static final String[] DATE_FORMATS=new String[] { + Commons.ISO_DATE_PATTERN, + "yyyy-MM-dd" + }; + + + @Override + public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { + JsonNode node = p.getCodec().readTree(p); + final String date = node.textValue(); + + for (String DATE_FORMAT : DATE_FORMATS) { + try { + return new SimpleDateFormat(DATE_FORMAT).parse(date); + } catch (ParseException e) { + } + } + throw new JsonParseException("Unable to parse date "+date,null); + } + + + +} 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 037a5cf..0d28c1b 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 @@ -2,19 +2,27 @@ package org.gcube.data.publishing.ckan2zenodo.model.zenodo; import java.util.Date; +import org.gcube.data.publishing.ckan2zenodo.commons.DateParser; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor + public class DateInterval { public static enum Type{ Collected, Valid, Withdrawn } - //TODO multiple patterns -// @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + + @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + @JsonDeserialize(using = DateParser.class) private Date start; -// @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + @JsonFormat(pattern = Commons.ISO_DATE_PATTERN) + @JsonDeserialize(using = DateParser.class) private Date end; // @NonNull private Type type; diff --git a/src/test/java/org/gcube/tests/TestCommons.java b/src/test/java/org/gcube/tests/TestCommons.java index 080f0c3..26301d4 100644 --- a/src/test/java/org/gcube/tests/TestCommons.java +++ b/src/test/java/org/gcube/tests/TestCommons.java @@ -3,6 +3,8 @@ package org.gcube.tests; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import org.gcube.data.publishing.ckan2zenodo.Fixer; import org.gcube.data.publishing.ckan2zenodo.Translator; @@ -20,13 +22,19 @@ public class TestCommons { static ZenodoCredentials loadCredentials() throws IOException { String BASE_URL="https://sandbox.zenodo.org/api/"; - String key=Files.readAllLines(Paths.get("/home/fabio/workspaces/zenodo.key")).get(0); + String key=Files.readAllLines(Paths.get("/Users/FabioISTI/eclipse-workspace/zenodo-sandbox.key")).get(0); System.out.println("Using key : "+key); return new ZenodoCredentials(key,BASE_URL); } + static Map getDefinedMappings(){ + HashMap toReturn=new HashMap(); + toReturn.put("/blue_cloud_dataset.json", "/blue_cloud_dataset.xml"); + return toReturn; + } + static String convertStreamToString(java.io.InputStream is) { java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; diff --git a/src/test/java/org/gcube/tests/TransformationTests.java b/src/test/java/org/gcube/tests/TransformationTests.java index 92a75a9..25cd28e 100644 --- a/src/test/java/org/gcube/tests/TransformationTests.java +++ b/src/test/java/org/gcube/tests/TransformationTests.java @@ -1,6 +1,5 @@ package org.gcube.tests; -import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -19,13 +18,13 @@ public class TransformationTests { static ObjectMapper mapper=null; - static Map mappings=new HashMap(); + static Map mappings; @BeforeClass public static void init () { mapper=TestCommons.getMapper(); - mappings.put("/blue_cloud_dataset.json", "/blue_cloud_dataset.xml"); + mappings=TestCommons.getDefinedMappings(); } diff --git a/src/test/java/org/gcube/tests/ZenodoTests.java b/src/test/java/org/gcube/tests/ZenodoTests.java index 3bd0802..7bbeb22 100644 --- a/src/test/java/org/gcube/tests/ZenodoTests.java +++ b/src/test/java/org/gcube/tests/ZenodoTests.java @@ -3,6 +3,8 @@ package org.gcube.tests; import java.io.IOException; import java.util.Arrays; import java.util.Date; +import java.util.Map; +import java.util.Map.Entry; import org.gcube.common.resources.gcore.GenericResource; import org.gcube.common.resources.gcore.Resources; @@ -34,11 +36,12 @@ import com.jayway.jsonpath.JsonPath; public class ZenodoTests { private static ZenodoCredentials credentials; - + private static Map mappings; @BeforeClass public static final void init() throws IOException { credentials=TestCommons.loadCredentials(); + mappings=TestCommons.getDefinedMappings(); } @@ -144,4 +147,19 @@ public class ZenodoTests { Assert.assertEquals(fakeTitle, dep.getTitle()); System.out.println(dep); } + + + @Test + public void testMappings() throws Exception { + Zenodo z=new Zenodo(credentials); + + for(Entry entry:mappings.entrySet()) { + GenericResource resource=Resources.unmarshal(GenericResource.class, TransformationTests.class.getResourceAsStream(entry.getValue())); + Translator translator=new Translator(IS.readMappings(resource)); + ZenodoDeposition dep=TestCommons.readAndTransform(entry.getKey(), translator,z.createNew()); + dep=z.updateMetadata(dep); + System.out.println("Created "+dep); +// System.out.println("Published "+z.publish(dep)); + } + } } diff --git a/src/test/resources/blue_cloud_dataset.out.xml b/src/test/resources/blue_cloud_dataset.out.xml new file mode 100644 index 0000000..e69de29 diff --git a/src/test/resources/blue_cloud_dataset.xml b/src/test/resources/blue_cloud_dataset.xml index c4140cd..204ad14 100644 --- a/src/test/resources/blue_cloud_dataset.xml +++ b/src/test/resources/blue_cloud_dataset.xml @@ -41,35 +41,7 @@ type - - - - - $.extras[?(@.key=='Identity:Creator')].value - - $.metadata.creators[2] - name - - - - - - - - $.extras[?(@.key=='Identity:Owner')].value - - $.metadata.contributors[*] - name - - - - - ContactPerson - - $.metadata.contributors[*] - type - - +