Date parsing

This commit is contained in:
Fabio Sinibaldi 2019-11-27 18:21:01 +01:00
parent c669ee2971
commit cc8895533d
10 changed files with 245 additions and 43 deletions

View File

@ -50,6 +50,12 @@
<groupId>org.gcube.data-publishing</groupId> <groupId>org.gcube.data-publishing</groupId>
<artifactId>gcat-client</artifactId> <artifactId>gcat-client</artifactId>
<version>[1.2.0,2.0.0-SNAPSHOT)</version> <version>[1.2.0,2.0.0-SNAPSHOT)</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- EXTERNAL --> <!-- EXTERNAL -->
@ -60,12 +66,26 @@
<version>1.14.8</version> <version>1.14.8</version>
</dependency> </dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.jayway.jsonpath</groupId> <groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId> <artifactId>json-path</artifactId>
<version>2.4.0</version> <version>2.4.0</version>
</dependency> </dependency>
<!-- Test log binding -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>

View File

@ -5,7 +5,7 @@ import java.net.MalformedURLException;
import org.gcube.data.publishing.ckan2zenodo.clients.GCat; import org.gcube.data.publishing.ckan2zenodo.clients.GCat;
import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo; import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo;
import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor;
import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; import org.gcube.data.publishing.ckan2zenodo.model.ZenodoCredentials;
public class Ckan2ZenodoImpl { public class Ckan2ZenodoImpl {
@ -25,7 +25,7 @@ public class Ckan2ZenodoImpl {
} }
private static final String getZenodoToken() { private static final ZenodoCredentials getZenodoToken() {
throw new RuntimeException(); throw new RuntimeException();
} }
} }

View File

@ -0,0 +1,64 @@
package org.gcube.data.publishing.ckan2zenodo;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.PathNotFoundException;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Fixer {
public static final String fixIncoming(String toFix) {
DocumentContext ctx=JsonPath.parse(toFix);
ctx=fixIncomingDate(ctx, "$.created");
ctx=fixIncomingDate(ctx, "$.modified");
return ctx.jsonString();
}
public static String fixSending(String toFix) {
DocumentContext ctx=JsonPath.parse(toFix);
fixOutgoingDate(ctx, "$.created");
fixOutgoingDate(ctx, "$.modified");
return ctx.jsonString();
}
//*** INCOMINGs
private static final DocumentContext fixIncomingDate(DocumentContext ctx,String toFixPath) {
try {
StringBuilder toFix=new StringBuilder(ctx.read(toFixPath));
ctx.put(toFixPath.substring(0,toFixPath.lastIndexOf(".")),
toFixPath.substring(toFixPath.lastIndexOf(".")+1),
toFix.deleteCharAt(toFix.lastIndexOf(":")).toString());
}catch(Throwable e) {
log.warn("Unable to fix "+toFixPath+". Cause : ",e);
}
return ctx;
}
//*** OUTGOINGs
private static final DocumentContext fixOutgoingDate(DocumentContext ctx,String toFixPath) {
try{
String toFix=ctx.read(toFixPath);
ctx.put(toFixPath.substring(0,toFixPath.lastIndexOf(".")),
toFixPath.substring(toFixPath.lastIndexOf(".")+1),
toFix.substring(0,toFix.length()-2)+":"+
toFix.substring(toFix.length()-2, toFix.length()));
}catch(Throwable t) {
log.debug("Unable to fix "+toFixPath+".Cause : ",t);
}
return ctx;
}
}

View File

@ -0,0 +1,16 @@
package org.gcube.data.publishing.ckan2zenodo;
import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor;
import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition;
public class Transformer {
public ZenodoDeposition transform(CkanItemDescriptor toTransform) {
ZenodoDeposition dep=new ZenodoDeposition();
// dep.set
throw new RuntimeException("Implment this");
}
}

View File

@ -2,6 +2,8 @@ package org.gcube.data.publishing.ckan2zenodo;
public class TransformerManager { public class TransformerManager {
public Transformer getByProfile(String profile) {
throw new RuntimeException("Implement this");
}
} }

View File

@ -1,65 +1,103 @@
package org.gcube.data.publishing.ckan2zenodo.clients; package org.gcube.data.publishing.ckan2zenodo.clients;
import java.io.IOException;
import javax.ws.rs.client.Client; import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import org.gcube.data.publishing.ckan2zenodo.Fixer;
import org.gcube.data.publishing.ckan2zenodo.model.ZenodoCredentials;
import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException; import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException;
import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata;
import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition;
import org.glassfish.jersey.client.ClientProperties; import org.glassfish.jersey.client.ClientProperties;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j
public class Zenodo { public class Zenodo {
private static final String BASE_URL="https://zenodo.org/api/";
private static final String CONTENT_TYPE="application/json"; private static final String CONTENT_TYPE="application/json";
private static final String DEPOSITION_BASE_URL="deposit/depositions"; private static final String DEPOSITION_BASE_URL="deposit/depositions";
private static final String AUTH="Authorization";
private static final String BEARER="Bearer "; private static final String ACCESS_TOKEN="access_token";
private static ObjectMapper mapper = new ObjectMapper();
static {
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
// mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@NonNull @NonNull
private String tokenValue; private ZenodoCredentials credentials;
Client client; Client client;
private synchronized Client getWebClient() { private synchronized Client getWebClient() {
if(client==null) if(client==null)
client = ClientBuilder.newClient( client = ClientBuilder.newClient()
// new ClientConfig().register(new HTTPBasicProvider(username, password)) .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
)
.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
return client; return client;
} }
public ZenodoDeposition readDeposition(String id) throws ZenodoException { public ZenodoDeposition readDeposition(String id) throws ZenodoException {
Response resp= getWebClient().target(credentials.getBaseUrl()).
// String respString=null; path(DEPOSITION_BASE_URL).path(id).
return getWebClient().target(BASE_URL). queryParam(ACCESS_TOKEN, credentials.getKey()).request(CONTENT_TYPE)
path(DEPOSITION_BASE_URL).path(id).request(CONTENT_TYPE) .get();
.header(AUTH, BEARER+tokenValue) return check(resp,ZenodoDeposition.class);
.get(ZenodoDeposition.class);
// respString=check(resp);
} }
private static <T> T check(Response resp, Class<T> clazz) throws ZenodoException{
private static String check(Response resp) throws ZenodoException {
if(resp.getStatus()<200||resp.getStatus()>=300) { if(resp.getStatus()<200||resp.getStatus()>=300) {
throw new ZenodoException("RESP STATUS IS "+resp.getStatus()+". Message : "+resp.readEntity(String.class)); throw new ZenodoException("RESP STATUS IS "+resp.getStatus()+". Message : "+resp.readEntity(String.class));
}else }else {
return resp.readEntity(String.class); String respString=resp.readEntity(String.class);
try {
return mapper.readValue(Fixer.fixIncoming(respString), clazz);
} catch (IOException e) {
throw new ZenodoException("Unable to parse response from Zenodo. Content was : \n "+respString,e);
}
}
} }
public ZenodoDeposition publishOrUpdate(ZenodoDeposition d) { public ZenodoDeposition Update(ZenodoDeposition d) {
throw new RuntimeException("Implement This"); throw new RuntimeException("Implement This");
} }
public ZenodoDeposition create(DepositionMetadata meta) throws ZenodoException, JsonParseException, JsonMappingException, IOException {
ZenodoDeposition toSend=new ZenodoDeposition();
toSend.setMetadata(meta);
String serialized=Fixer.fixSending(mapper.writeValueAsString(toSend));
try{
Response resp = getWebClient().target(credentials.getBaseUrl()).
path(DEPOSITION_BASE_URL).
queryParam(ACCESS_TOKEN, credentials.getKey()).request(CONTENT_TYPE)
.post(Entity.json(serialized));
return check(resp,ZenodoDeposition.class);
}catch(Throwable t) {
log.debug("Exception while sending : "+serialized);
throw t;
}
}
} }

View File

@ -0,0 +1,15 @@
package org.gcube.data.publishing.ckan2zenodo.model;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public class ZenodoCredentials {
@NonNull
private String key;
@NonNull
private String baseUrl;
}

View File

@ -4,20 +4,20 @@ import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import lombok.Getter; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Setter;
import lombok.ToString;
@Getter import lombok.Data;
@Setter
@ToString @Data
public class ZenodoDeposition { public class ZenodoDeposition {
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ")
private Date created; private Date created;
private String doi; private String doi;
private ArrayList<FileDeposition> files; private ArrayList<FileDeposition> files;
private Integer id; private Integer id;
private DepositionMetadata metadata; private DepositionMetadata metadata;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ")
private Date modified; private Date modified;
private Integer owner; private Integer owner;
private Integer record_id; private Integer record_id;

View File

@ -0,0 +1,36 @@
package org.gcube.tests;
import java.io.IOException;
import java.util.Date;
import org.gcube.data.publishing.ckan2zenodo.Fixer;
import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition;
import org.junit.BeforeClass;
import org.junit.Test;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ParsingTests {
static ObjectMapper mapper=new ObjectMapper();
@BeforeClass
public static void init () {
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
}
@Test
public void DateTest() throws IOException {
ZenodoDeposition z=new ZenodoDeposition();
z.setCreated(new Date(System.currentTimeMillis()));
System.out.println("Write : ");
System.out.println(Fixer.fixSending(mapper.writeValueAsString(z)));
String s="{\"conceptrecid\":\"422982\",\"created\":\"2019-11-26T15:43:49.879+00:00\",\"files\":[],\"id\":422983,\"links\":{\"bucket\":\"https://sandbox.zenodo.org/api/files/a6b09898-1807-4f03-a7ac-ed06b2d3ba2b\",\"discard\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983/actions/discard\",\"edit\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983/actions/edit\",\"files\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983/files\",\"html\":\"https://sandbox.zenodo.org/deposit/422983\",\"latest_draft\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983\",\"latest_draft_html\":\"https://sandbox.zenodo.org/deposit/422983\",\"newversion\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983/actions/newversion\",\"publish\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983/actions/publish\",\"registerconceptdoi\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983/actions/registerconceptdoi\",\"self\":\"https://sandbox.zenodo.org/api/deposit/depositions/422983\"},\"metadata\":{\"prereserve_doi\":{\"doi\":\"10.5072/zenodo.422983\",\"recid\":422983}},\"modified\":\"2019-11-26T15:43:49.876858+00:00\",\"owner\":31041,\"record_id\":422983,\"state\":\"unsubmitted\",\"submitted\":false,\"title\":\"\"}";
System.out.println("READ : ");
System.out.println(mapper.readValue(Fixer.fixIncoming(s), ZenodoDeposition.class));
}
}

View File

@ -5,16 +5,27 @@ import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo; import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo;
import org.gcube.data.publishing.ckan2zenodo.model.ZenodoCredentials;
import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException; import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException;
import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata;
import org.junit.Test; import org.junit.Test;
public class ZenodoTests { public class ZenodoTests {
@Test @Test
public void readFromZenodo() throws IOException, ZenodoException { public void readFromZenodo() throws IOException, ZenodoException {
// private static final String BASE_URL="https://zenodo.org/api/";
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("/home/fabio/workspaces/zenodo.key")).get(0);
System.out.println(new Zenodo(key).readDeposition("10")); System.out.println("Using key : "+key);
Zenodo z=new Zenodo(new ZenodoCredentials(key,BASE_URL));
System.out.println(z.readDeposition("422983"));
System.out.println(z.create(new DepositionMetadata()));
} }
} }