diff --git a/pom.xml b/pom.xml index c751ca0..96025e1 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,6 @@ ch.qos.logback logback-classic - 1.0.13 test diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2Zenodo.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2Zenodo.java index 953e8db..bd7d82a 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2Zenodo.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2Zenodo.java @@ -1,10 +1,16 @@ package org.gcube.data.publishing.ckan2zenodo; +import java.util.List; import java.util.Set; import java.util.concurrent.Future; import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; import org.gcube.data.publishing.ckan2zenodo.model.CkanResource; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ConfigurationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.GcatException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.InvalidItemException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.TransformationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; public interface Ckan2Zenodo { @@ -24,32 +30,40 @@ public interface Ckan2Zenodo { * * @param itemName * @return + * @throws GcatException */ - public CkanItemDescriptor read(String itemName); + public CkanItemDescriptor read(String itemName) throws GcatException; /** - * Translates @param desc into a ZenodoDeposition using mappings declared in current VRE + * Translates @param desc into a ZenodoDeposition using mappings declared in current VRE and previous existing Zenodo Deposition if any * * @param desc * @return + * @throws InvalidItemException + * @throws ZenodoException + * @throws ConfigurationException + * @throws TransformationException */ - public ZenodoDeposition translate(CkanItemDescriptor desc); + public ZenodoDeposition translate(CkanItemDescriptor desc) throws InvalidItemException, ZenodoException, ConfigurationException, TransformationException; /** * Create / update metadata of @param toUpdate into the Zenodo instance declared in current VRE * * @param toUpdate * @return + * @throws ZenodoException */ - public ZenodoDeposition updatedMetadata(ZenodoDeposition toUpdate); + public ZenodoDeposition updatedMetadata(ZenodoDeposition toUpdate) throws ZenodoException; /** * Filters ckan resources of @param desc by using mappings declared in current VRE * * @param desc * @return + * @throws ConfigurationException + * @throws TransformationException */ - public CkanResource filterResources(CkanItemDescriptor desc); + public List filterResources(CkanItemDescriptor desc) throws ConfigurationException, TransformationException; /** * Uploads @param toUpload resources associating them to given @param deposition @@ -57,8 +71,9 @@ public interface Ckan2Zenodo { * @param toUpload * @param deposition * @return + * @throws ZenodoException */ - public Future uploadFiles(Set toUpload,ZenodoDeposition deposition); + public Future uploadFiles(Set toUpload,ZenodoDeposition deposition) throws ZenodoException; /** * Publishes @param dep, setting/updateing DOI reference into @param toUpdate @@ -66,7 +81,8 @@ public interface Ckan2Zenodo { * @param dep * @param toUpdate * @return + * @throws ZenodoException */ - public ZenodoDeposition publish(ZenodoDeposition dep, CkanItemDescriptor toUpdate); + public ZenodoDeposition publish(ZenodoDeposition dep, CkanItemDescriptor toUpdate) throws ZenodoException; } diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2ZenodoImpl.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2ZenodoImpl.java index 37dd821..720f535 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2ZenodoImpl.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/Ckan2ZenodoImpl.java @@ -1,31 +1,119 @@ package org.gcube.data.publishing.ckan2zenodo; -import java.net.MalformedURLException; +import java.util.List; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; +import org.gcube.data.publishing.ckan2zenodo.clients.FileUploaderManager; import org.gcube.data.publishing.ckan2zenodo.clients.GCat; import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo; import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; -import org.gcube.data.publishing.ckan2zenodo.model.ZenodoCredentials; +import org.gcube.data.publishing.ckan2zenodo.model.CkanRelatedIdentifier; +import org.gcube.data.publishing.ckan2zenodo.model.CkanResource; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ConfigurationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.GcatException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.InvalidItemException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.TransformationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException; +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; -public class Ckan2ZenodoImpl { +import lombok.extern.slf4j.Slf4j; + + +@Slf4j +public class Ckan2ZenodoImpl implements Ckan2Zenodo{ + + @Override + public CkanItemDescriptor read(String itemName) throws GcatException { + try{ + return GCat.getByID(itemName); + }catch(Throwable e) { + log.warn("Unable to load "+itemName+" from gCat",e); + throw new GcatException("Unable to load item from gCat"); + } + } + + @Override + public ZenodoDeposition translate(CkanItemDescriptor desc) throws InvalidItemException, ZenodoException, ConfigurationException, TransformationException { + ZenodoDeposition toUpdate=null; + CkanRelatedIdentifier doi=desc.getZenodoDoi(); + if(doi!=null) { + Zenodo z=Zenodo.get(); + toUpdate=z.readDeposition(doi.getZenodoId()); + } + Translator tr=new TransformerManager().getByProfile(desc.getProfile()); + return tr.transform(desc, toUpdate); + } + + @Override + public ZenodoDeposition updatedMetadata(ZenodoDeposition toUpdate) throws ZenodoException { + if(toUpdate.getSubmitted()) + Zenodo.get().unlockPublished(toUpdate.getId()); + + return Zenodo.get().updateMetadata(toUpdate); + } + + @Override + public List filterResources(CkanItemDescriptor desc) throws ConfigurationException, TransformationException { + Translator tr=new TransformerManager().getByProfile(desc.getProfile()); + return tr.filterResources(desc); + } + + @Override + public Future uploadFiles(Set toUpload, ZenodoDeposition deposition) throws ZenodoException { + final Zenodo z=Zenodo.get(); + + if(deposition.getSubmitted()) + Zenodo.get().unlockPublished(deposition.getId()); + + Callable call=new Callable() { + @Override + public ZenodoDeposition call() throws Exception { + ZenodoDeposition dep=deposition; + for(CkanResource r:toUpload) { + try { + dep.getFiles().add(z.uploadFile(dep, r.getName(), r.getUrl())); + }catch(Throwable t) { + throw new Exception("Unable to upload "+r.getName()+".",t); + } + } + return z.readDeposition(dep.getId()); + } + }; + + return FileUploaderManager.submitForDeposition(call); + } + + @Override + public ZenodoDeposition publish(ZenodoDeposition dep, CkanItemDescriptor toUpdate) throws ZenodoException { + if(dep.getSubmitted()) + Zenodo.get().unlockPublished(dep.getId()); + + return Zenodo.get().publish(dep); + } - public static void publish(String itemName) throws MalformedURLException { - // looking for gcat.. - GCat gCat=new GCat(); - // looking for item - CkanItemDescriptor desc=gCat.getByID(itemName); - - //transforming -// ZenodoDeposition deposition=TransformerManager.transform(desc); - - // publishing / update to zenodo - Zenodo z=new Zenodo(getZenodoToken()); - - - } +// public static void preview(String itemName) throws MalformedURLException { +// // looking for gcat.. +// GCat gCat=new GCat(); +// // looking for item +// CkanItemDescriptor desc=gCat.getByID(itemName); +// +// //transforming +//// ZenodoDeposition deposition=TransformerManager.transform(desc); +// +// // publishing / update to zenodo +// Zenodo z=new Zenodo(getZenodoToken()); +// +// +// } +// +// private static final ZenodoCredentials getZenodoToken() { +// throw new RuntimeException(); +// } + + + - private static final ZenodoCredentials getZenodoToken() { - throw new RuntimeException(); - } } diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/TransformerManager.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/TransformerManager.java index 16a9851..f735574 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/TransformerManager.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/TransformerManager.java @@ -6,6 +6,7 @@ import javax.xml.parsers.ParserConfigurationException; import org.gcube.common.resources.gcore.GenericResource; import org.gcube.data.publishing.ckan2zenodo.commons.IS; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ConfigurationException; import lombok.Synchronized; @@ -25,12 +26,12 @@ public class TransformerManager { return builder; } - public Translator getByProfile(String profile) throws Exception { + public Translator getByProfile(String profile) throws ConfigurationException { for(GenericResource r: IS.queryForGenericResources("Ckan-Zenodo-Mappings")){ if (r.profile().name().equals(profile)) return new Translator(IS.readMappings(r),IS.readResourceFilters(r)); } - throw new Exception("No transformer found for profile "+profile); + throw new ConfigurationException("No transformer found for profile "+profile); } diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/FileUploaderManager.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/FileUploaderManager.java index bb0391d..f006f50 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/FileUploaderManager.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/clients/FileUploaderManager.java @@ -4,7 +4,6 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; import javax.ws.rs.core.Response; @@ -14,19 +13,22 @@ import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; public class FileUploaderManager { - static ExecutorService service=null; + static ExecutorService uploadService=null; + static ExecutorService requestService=null; + static { - service=Executors.newFixedThreadPool(Integer.parseInt(LocalConfiguration.getProperty(Configuration.THREAD_POOL_SIZE))); + uploadService=Executors.newFixedThreadPool(Integer.parseInt(LocalConfiguration.getProperty(Configuration.THREAD_POOL_SIZE))*3); + requestService=Executors.newFixedThreadPool(Integer.parseInt(LocalConfiguration.getProperty(Configuration.THREAD_POOL_SIZE))); } - public FutureTask createTask(Callable call ){ - return new FutureTask (call); + public static Future submitForDeposition(Callable call ){ + return requestService.submit(call); } - public static Future submit(Callable call){ - return service.submit(call); + public static Future submitForResponse(Callable call){ + return uploadService.submit(call); } } 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 a2c1da4..00ebd3c 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 @@ -45,6 +45,9 @@ public class Zenodo { private static final String PUBLISH_URL_PRE="deposit/depositions"; private static final String PUBLISH_URL_POST="actions/publish"; + + private static final String UNLOCK_URL_PRE="deposit/depositions"; + private static final String UNLOCK_URL_POST="actions/edit"; private static final String ACCESS_TOKEN="access_token"; @@ -58,6 +61,12 @@ public class Zenodo { } + public static final Zenodo get() { + // READ FROM IS + throw new RuntimeException("IMPLEMENT THIS"); + } + + @NonNull private ZenodoCredentials credentials; @@ -72,9 +81,9 @@ public class Zenodo { return client; } - public ZenodoDeposition readDeposition(String id) throws ZenodoException { + public ZenodoDeposition readDeposition(Integer id) throws ZenodoException { Response resp= getWebClient().target(credentials.getBaseUrl()). - path(DEPOSITION_BASE_URL).path(id). + path(DEPOSITION_BASE_URL).path(id+""). queryParam(ACCESS_TOKEN, credentials.getKey()).request(CONTENT_TYPE) .get(); return check(resp,ZenodoDeposition.class); @@ -95,7 +104,7 @@ public class Zenodo { } } - public ZenodoDeposition updateMetadata(ZenodoDeposition dep) throws ZenodoException, JsonProcessingException { + public ZenodoDeposition updateMetadata(ZenodoDeposition dep) throws ZenodoException { return updateMetadata(dep.getId(), dep.getMetadata()); } @@ -141,7 +150,7 @@ public class Zenodo { log.debug("Submitting request to upload "+urlString+" to Manager"); - Future resp=FileUploaderManager.submit(call); + Future resp=FileUploaderManager.submitForResponse(call); try { return check(resp.get(),FileDeposition.class); @@ -155,8 +164,9 @@ public class Zenodo { } - private ZenodoDeposition updateMetadata(Integer depositionId,DepositionMetadata meta) throws ZenodoException, JsonProcessingException { - String serialized="{\"metadata\":"+Fixer.fixIncoming(mapper.writeValueAsString(meta))+"}"; + private ZenodoDeposition updateMetadata(Integer depositionId,DepositionMetadata meta) throws ZenodoException { + try{ + String serialized="{\"metadata\":"+Fixer.fixIncoming(mapper.writeValueAsString(meta))+"}"; try { Response resp = getWebClient().target(credentials.getBaseUrl()). path(DEPOSITION_BASE_URL).path(depositionId+""). @@ -167,8 +177,22 @@ public class Zenodo { 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); + } } + public ZenodoDeposition unlockPublished(Integer depositionId) throws ZenodoException { + Response resp = getWebClient().target(credentials.getBaseUrl()). + path(UNLOCK_URL_PRE). + path(depositionId+""). + path(UNLOCK_URL_POST). + queryParam(ACCESS_TOKEN, credentials.getKey()).request(CONTENT_TYPE) + .post(Entity.json("{}")); + return check(resp,ZenodoDeposition.class); + } + public void deleteDeposition(Integer depositionId) throws ZenodoException { Response resp = getWebClient().target(credentials.getBaseUrl()). path(DEPOSITION_BASE_URL).path(depositionId+""). diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanItemDescriptor.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanItemDescriptor.java index 19e600d..19344c9 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanItemDescriptor.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanItemDescriptor.java @@ -2,18 +2,30 @@ package org.gcube.data.publishing.ckan2zenodo.model; import java.util.List; +import org.gcube.data.publishing.ckan2zenodo.commons.Parsing; +import org.gcube.data.publishing.ckan2zenodo.model.faults.InvalidItemException; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.ReadContext; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import net.minidev.json.JSONObject; @RequiredArgsConstructor @NoArgsConstructor public class CkanItemDescriptor { + static private ObjectMapper mapper; + + static { + mapper=Parsing.getMapper(); + } + + private static final String PROFILE="$.extras[?(@.key=='system:type')].value"; private static final String TITLE="$.title"; private static final String NOTES="$.notes"; @@ -30,6 +42,8 @@ public class CkanItemDescriptor { private static final String MAINTAINER="$.maintainer"; private static final String ITEM_URL="$.extras[?(@.key=='Item URL')].value"; private static final String NAME="$.name"; + private static final String ZENODO_DOI="$.extras[?(@.key=='relatedIdentifier:Zenodo.DOI')].value"; + @NonNull @Getter @@ -37,10 +51,10 @@ public class CkanItemDescriptor { @Getter(lazy=true) - private final ReadContext document=document(); + private final DocumentContext document=document(); - private ReadContext document() { + private DocumentContext document() { return JsonPath.parse(content); } @@ -112,4 +126,38 @@ public class CkanItemDescriptor { if(values==null) return null; return values.get(0); } + + private String readRelatedIdentifierString() throws InvalidItemException { + List values=getDocument().read(ZENODO_DOI); + if(values==null || values.isEmpty()) return null; + if(values.size()>1) throw new InvalidItemException("Multiple Zenodo Doi found on item."); + return values.get(0); + } + + public CkanRelatedIdentifier getZenodoDoi() throws InvalidItemException { + try{ + String s=readRelatedIdentifierString(); + if(s==null) return null; + return mapper.readValue(s, CkanRelatedIdentifier.class); + }catch(InvalidItemException e) { + throw e; + }catch(Throwable t) { + throw new InvalidItemException("Unable to parse item ",t); + } + } + + public CkanItemDescriptor setZenodoDoi(CkanRelatedIdentifier toSet) throws InvalidItemException { + if(readRelatedIdentifierString()!=null) throw new InvalidItemException("Item already contains Zenodo DOI"); + try{ + String serialized=mapper.writeValueAsString(toSet); + JSONObject obj=new JSONObject(); + obj.put("key", "relatedIdentifier:Zenodo.DOI"); + obj.put("value", serialized); + getDocument().add("$.extras",obj); + content=getDocument().jsonString(); + return this; + }catch(Throwable t) { + throw new InvalidItemException("Unable to parse item ",t); + } + } } diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanRelatedIdentifier.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanRelatedIdentifier.java new file mode 100644 index 0000000..0dc12f2 --- /dev/null +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/CkanRelatedIdentifier.java @@ -0,0 +1,29 @@ +package org.gcube.data.publishing.ckan2zenodo.model; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +@Getter +@RequiredArgsConstructor +@NoArgsConstructor +@ToString +public class CkanRelatedIdentifier { + + public static CkanRelatedIdentifier getZenodo(String doi) { + return new CkanRelatedIdentifier("URL", "isReferencedBy", doi); + } + + @NonNull + private String relatedIdentifierType; + @NonNull + private String relationType; + @NonNull + private String link; + + public Integer getZenodoId() { + return Integer.parseInt(link.substring(link.lastIndexOf(".")+1)); + } +} diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/faults/GcatException.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/faults/GcatException.java new file mode 100644 index 0000000..403ee8b --- /dev/null +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/faults/GcatException.java @@ -0,0 +1,32 @@ +package org.gcube.data.publishing.ckan2zenodo.model.faults; + +public class GcatException extends Exception { + + public GcatException() { + super(); + // TODO Auto-generated constructor stub + } + + public GcatException(String arg0, Throwable arg1, boolean arg2, boolean arg3) { + super(arg0, arg1, arg2, arg3); + // TODO Auto-generated constructor stub + } + + public GcatException(String arg0, Throwable arg1) { + super(arg0, arg1); + // TODO Auto-generated constructor stub + } + + public GcatException(String arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + public GcatException(Throwable arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/faults/InvalidItemException.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/faults/InvalidItemException.java new file mode 100644 index 0000000..ebfb4be --- /dev/null +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/faults/InvalidItemException.java @@ -0,0 +1,34 @@ +package org.gcube.data.publishing.ckan2zenodo.model.faults; + +public class InvalidItemException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 956698656847887456L; + + public InvalidItemException() { + // TODO Auto-generated constructor stub + } + + public InvalidItemException(String arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + public InvalidItemException(Throwable arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + public InvalidItemException(String arg0, Throwable arg1) { + super(arg0, arg1); + // TODO Auto-generated constructor stub + } + + public InvalidItemException(String arg0, Throwable arg1, boolean arg2, boolean arg3) { + super(arg0, arg1, arg2, arg3); + // TODO Auto-generated constructor stub + } + +} diff --git a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/ZenodoDeposition.java b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/ZenodoDeposition.java index 5244d4c..82a3a92 100644 --- a/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/ZenodoDeposition.java +++ b/src/main/java/org/gcube/data/publishing/ckan2zenodo/model/zenodo/ZenodoDeposition.java @@ -26,4 +26,5 @@ public class ZenodoDeposition { private Boolean submitted; private String title; + } diff --git a/src/test/java/org/gcube/tests/OneHitTest.java b/src/test/java/org/gcube/tests/OneHitTest.java new file mode 100644 index 0000000..c82e398 --- /dev/null +++ b/src/test/java/org/gcube/tests/OneHitTest.java @@ -0,0 +1,55 @@ +package org.gcube.tests; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.gcube.data.publishing.ckan2zenodo.Ckan2Zenodo; +import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; +import org.gcube.data.publishing.ckan2zenodo.model.CkanResource; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ConfigurationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.GcatException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.InvalidItemException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.TransformationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.ZenodoException; +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; + +public class OneHitTest { + + + public static void main(String[] args) throws GcatException, InvalidItemException, ZenodoException, ConfigurationException, TransformationException, InterruptedException, ExecutionException { + TokenSetter.set("/pred4s/preprod/preVRE"); + Ckan2Zenodo client=Ckan2Zenodo.get(); + String toPublishItemName="my_item"; + + // Get the item representation + CkanItemDescriptor item=client.read(toPublishItemName); + + //Get a preview of the deposition to be published + ZenodoDeposition preview=client.translate(item); + + //Filter resources according to VRE policies + List toFilter=client.filterResources(item); + + + //Eventually update values + preview.getMetadata().setAccess_conditions("Ask me"); + + //Actually publish to zenodo : + // Step 1 : metadata + + preview=client.updatedMetadata(preview); + + //Step 2 : publish Resources + Future future_Dep=client.uploadFiles(Collections.singleton(toFilter.get(0)), preview); + preview=future_Dep.get(); + + //Finalize + + client.publish(preview, item); + + } + + +} diff --git a/src/test/java/org/gcube/tests/ParsingTests.java b/src/test/java/org/gcube/tests/ParsingTests.java index 7a9efc7..a672ffd 100644 --- a/src/test/java/org/gcube/tests/ParsingTests.java +++ b/src/test/java/org/gcube/tests/ParsingTests.java @@ -9,8 +9,12 @@ import java.util.List; import org.gcube.data.publishing.ckan2zenodo.Fixer; import org.gcube.data.publishing.ckan2zenodo.commons.Parsing; +import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; +import org.gcube.data.publishing.ckan2zenodo.model.CkanRelatedIdentifier; import org.gcube.data.publishing.ckan2zenodo.model.faults.ConfigurationException; +import org.gcube.data.publishing.ckan2zenodo.model.faults.InvalidItemException; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata; +import org.gcube.data.publishing.ckan2zenodo.model.zenodo.RelatedIdentifier; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; import org.junit.Assert; import org.junit.BeforeClass; @@ -131,4 +135,16 @@ public class ParsingTests { System.out.println(s); } } + + + @Test + public void addDOI() throws InvalidItemException { + String json=TestCommons.convertStreamToString(TransformationTests.class.getResourceAsStream("/ResearchObject.json")); + CkanItemDescriptor desc=new CkanItemDescriptor(json); + Assert.assertNull(desc.getZenodoDoi()); + desc.setZenodoDoi(new CkanRelatedIdentifier("URL", "isReferencedBy", "http://some.dumb.link.com")); + CkanRelatedIdentifier id=desc.getZenodoDoi(); + Assert.assertNotNull(id); + System.out.println(desc.getContent()); + } } diff --git a/src/test/java/org/gcube/tests/ZenodoTests.java b/src/test/java/org/gcube/tests/ZenodoTests.java index 2d5a3b7..9c17a01 100644 --- a/src/test/java/org/gcube/tests/ZenodoTests.java +++ b/src/test/java/org/gcube/tests/ZenodoTests.java @@ -10,6 +10,7 @@ import org.gcube.data.publishing.ckan2zenodo.Translator; import org.gcube.data.publishing.ckan2zenodo.clients.Zenodo; import org.gcube.data.publishing.ckan2zenodo.commons.IS; import org.gcube.data.publishing.ckan2zenodo.model.CkanItemDescriptor; +import org.gcube.data.publishing.ckan2zenodo.model.CkanRelatedIdentifier; import org.gcube.data.publishing.ckan2zenodo.model.CkanResource; import org.gcube.data.publishing.ckan2zenodo.model.ZenodoCredentials; import org.gcube.data.publishing.ckan2zenodo.model.faults.ConfigurationException; @@ -20,10 +21,13 @@ import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata.Acc import org.gcube.data.publishing.ckan2zenodo.model.zenodo.DepositionMetadata.UploadType; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.FileDeposition; import org.gcube.data.publishing.ckan2zenodo.model.zenodo.ZenodoDeposition; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.fasterxml.jackson.core.JsonProcessingException; +import com.jayway.jsonpath.JsonPath; + public class ZenodoTests { @@ -43,7 +47,7 @@ public class ZenodoTests { Zenodo z=new Zenodo(credentials); - System.out.println(z.readDeposition("426312")); + System.out.println(z.readDeposition(426312)); } @@ -89,4 +93,48 @@ public class ZenodoTests { System.out.println(); } + + @Test + public void updateExisting() throws ConfigurationException, Exception { + // publish new + Zenodo z=new Zenodo(credentials); + + GenericResource res=Resources.unmarshal(GenericResource.class, TransformationTests.class.getResourceAsStream("/ResearchObject.xml")); + ZenodoDeposition dep=z.createNew(); + Translator tran=new Translator(IS.readMappings(res),IS.readResourceFilters(res)); + dep=TestCommons.readAndTransform("/ResearchObject.json", tran,dep); + dep=z.updateMetadata(dep); + + System.out.println("Resulting Deposition with metadata : "); + System.out.println(); + String json=TestCommons.convertStreamToString(TransformationTests.class.getResourceAsStream("/ResearchObject.json")); + CkanItemDescriptor desc=new CkanItemDescriptor(json); + + for(CkanResource cRes:tran.filterResources(desc)) { + FileDeposition file=z.uploadFile(dep, cRes.getName(), cRes.getUrl()); + System.out.println("Published "+file); + } + dep=z.publish(dep); + + desc.setZenodoDoi(CkanRelatedIdentifier.getZenodo(dep.getDoi())); + + // Change title + String fakeTitle="Dummy Title"; + + String modifiedJson=JsonPath.parse(desc.getContent()).put("$", "title", fakeTitle).jsonString(); + desc=new CkanItemDescriptor(modifiedJson); + // Publish logic : + + Assert.assertNotNull(desc); + Assert.assertNotNull(desc.getZenodoDoi()); + Assert.assertEquals(fakeTitle, desc.getTitle()); + + dep=z.readDeposition(desc.getZenodoDoi().getZenodoId()); + dep=tran.transform(desc, dep); + z.unlockPublished(dep.getId()); + System.out.println(z.updateMetadata(dep)); + dep=z.publish(dep); + Assert.assertEquals(fakeTitle, dep.getTitle()); + System.out.println(dep); + } }