diff --git a/DataMinerAlgorithmsCrawler/pom.xml b/DataMinerAlgorithmsCrawler/pom.xml
index 47051f8..1153219 100644
--- a/DataMinerAlgorithmsCrawler/pom.xml
+++ b/DataMinerAlgorithmsCrawler/pom.xml
@@ -84,7 +84,6 @@
org.codehaus.jackson
jackson-mapper-asl
- 1.9.13
test
diff --git a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java
index 34efc4b..b81cf2a 100644
--- a/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java
+++ b/DataMinerAlgorithmsCrawler/src/main/java/org/gcube/data/publishing/gCatFeeder/collectors/dm/model/ckan/GCatModel.java
@@ -93,7 +93,7 @@ public class GCatModel implements CatalogueFormatData {
}
-
+ @Setter
private String profile=profileXML;
private CkanItem item=null;
diff --git a/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/utils/Files.java b/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/utils/Files.java
new file mode 100644
index 0000000..40139ac
--- /dev/null
+++ b/commons/src/main/java/org/gcube/data/publishing/gCatFeeder/utils/Files.java
@@ -0,0 +1,39 @@
+package org.gcube.data.publishing.gCatFeeder.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.nio.file.Paths;
+
+public class Files {
+
+ public static File getFileFromResources(String fileName) {
+
+ ClassLoader classLoader =Files.class.getClassLoader();
+
+ URL resource = classLoader.getResource(fileName);
+ if (resource == null) {
+ throw new IllegalArgumentException("file is not found!");
+ } else {
+ return new File(resource.getFile());
+ }
+
+ }
+
+
+ public static String readFileAsString(String path, Charset encoding)
+ throws IOException
+ {
+ byte[] encoded = java.nio.file.Files.readAllBytes(Paths.get(path));
+ return new String(encoded, encoding);
+ }
+
+
+ public static String getName(String path) {
+
+ return path.substring((path.contains(File.separator)?path.lastIndexOf(File.separator)+1:0)
+ ,(path.contains(".")?path.lastIndexOf("."):path.length()));
+
+ }
+}
diff --git a/oai-harvester/pom.xml b/oai-harvester/pom.xml
new file mode 100644
index 0000000..09a2449
--- /dev/null
+++ b/oai-harvester/pom.xml
@@ -0,0 +1,116 @@
+
+ 4.0.0
+
+ org.gcube.data-publishing.gCat-Feeder
+ gCat-Feeder-Suite
+ 1.0.1
+
+ oai-harvester
+ oai-harvester
+
+
+ https://code-repo.d4science.org/gCubeSystem
+
+
+
+ scm:git:${gitBaseUrl}/gFeed
+ scm:git:${gitBaseUrl}/gFeed
+ ${gitBaseUrl}/gFeed
+
+
+
+
+
+ org.gcube.distribution
+ gcube-bom
+ 1.4.0
+ pom
+ import
+
+
+
+
+
+
+
+
+ org.gcube.common
+ common-authorization
+ provided
+
+
+
+ org.gcube.core
+ common-scope
+ provided
+
+
+
+ org.gcube.data-publishing.gCat-Feeder
+ collectors-plugin-framework
+ [1.0.0,2.0.0-SNAPSHOT)
+ provided
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ provided
+
+
+
+
+
+ org.slf4j
+ slf4j-api
+ provided
+
+
+
+ org.gcube.data-publishing
+ gcat-client
+ [1.2.0,2.0.0-SNAPSHOT)
+
+
+
+
+
+ org.gcube.data-publishing.gCat-Feeder
+ test-commons
+ [1.0.0,2.0.0-SNAPSHOT)
+ test
+
+
+
+
+ org.codehaus.jackson
+ jackson-mapper-asl
+ test
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ make-uberjar
+ package
+
+
+ make-servicearchive
+ package
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/Constants.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/Constants.java
new file mode 100644
index 0000000..63004c0
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/Constants.java
@@ -0,0 +1,10 @@
+package org.gcube.data.publishing.gFeed.collectors.oai;
+
+public class Constants {
+
+
+ public static final String GCAT_TYPE="GCAT";
+
+ public static final String PLUGIN_ID="OAI_COLLECTOR";
+
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/GCATRetriever.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/GCATRetriever.java
new file mode 100644
index 0000000..84657df
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/GCATRetriever.java
@@ -0,0 +1,24 @@
+package org.gcube.data.publishing.gFeed.collectors.oai;
+
+import org.gcube.data.publishing.gCatFeeder.model.CatalogueInstanceDescriptor;
+import org.gcube.data.publishing.gCatfeeder.collectors.CatalogueRetriever;
+
+public class GCATRetriever implements CatalogueRetriever {
+
+ private static GCATRetriever instance=null;
+
+ static synchronized GCATRetriever get() {
+ if(instance==null) instance =new GCATRetriever();
+ return instance;
+ }
+
+
+
+ @Override
+ public CatalogueInstanceDescriptor getInstance() {
+// throw new RuntimeException("Implement this");
+// GCoreEndpoint ep=ISUtils.queryForGCoreEndpoint("NO", "NO");
+ return new CatalogueInstanceDescriptor();
+ }
+
+}
\ No newline at end of file
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAIClient.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAIClient.java
new file mode 100644
index 0000000..392a49b
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAIClient.java
@@ -0,0 +1,126 @@
+package org.gcube.data.publishing.gFeed.collectors.oai;
+
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Response;
+import javax.xml.bind.JAXB;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import org.gcube.data.publishing.gFeed.collectors.oai.model.DCRecordMetadata;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.MetadataHolder;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIInteractionException;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIMetadata;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAI_PMH;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAI_PMH.Token;
+import org.glassfish.jersey.client.ClientProperties;
+
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@RequiredArgsConstructor
+public class OAIClient {
+
+ private static JAXBContext jaxbContext=null;
+
+
+ private static synchronized JAXBContext getContext() throws JAXBException {
+ if(jaxbContext==null)
+ jaxbContext = JAXBContext.newInstance(OAIRecord.class,
+ MetadataHolder.class,
+ OAIMetadata.class,
+ DCRecordMetadata.class,
+ OAI_PMH.class);
+ return jaxbContext;
+ }
+
+
+
+ public static final String DC_METADATA_PREFIX="oai_dc";
+
+ @NonNull
+ private String baseUrl;
+
+
+ Client client;
+
+ private synchronized Client getWebClient() {
+ if(client==null) {
+ client = ClientBuilder.newClient()
+ .property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
+ }
+ return client;
+ }
+
+
+
+ public Collection getAll(String metadataPrefix) throws JAXBException, OAIInteractionException{
+ ArrayList toReturn=new ArrayList();
+
+ String resumptionToken=null;
+
+ // call & iterate
+ boolean isComplete=false;
+ while(!isComplete) {
+
+ WebTarget target=getWebClient().target(baseUrl).
+ queryParam("verb","ListRecords");
+
+
+
+ if(resumptionToken==null)
+ target=target.queryParam("metadataPrefix",metadataPrefix);
+ else
+ target=target.queryParam("resumptionToken", resumptionToken);
+
+
+ Response resp=target.request("application/xml").get();
+
+ OAI_PMH msg=check(resp);
+
+ if(msg.isError()) throw new OAIInteractionException(msg.getError().getCode()+ " : "+msg.getError().getMessage());
+
+ toReturn.addAll(msg.getResponseRecords().getRecords());
+
+ Token t=msg.getResponseRecords().getResumptionToken();
+ log.debug("Obtained token : "+t);
+ if(t!=null && t.getId()!=null && !t.getId().isEmpty()) {
+ resumptionToken=t.getId();
+ }else isComplete=true; //no token = completion
+ }
+ return toReturn;
+ }
+
+
+
+ private static OAI_PMH check(Response resp) throws JAXBException {
+ if(resp.getStatus()<200||resp.getStatus()>=300) {
+ // exception
+ throw new RuntimeException("Implement fault");
+ }else {
+
+
+ String respString=resp.readEntity(String.class);
+ Unmarshaller jaxbUnmarshaller = getContext().createUnmarshaller();
+ OAI_PMH obj=(OAI_PMH) jaxbUnmarshaller.unmarshal(new StringReader(respString));
+
+ return obj;
+
+// OAI_PMH response = (OAI_PMH) jaxbUnmarshaller.unmarshal(
+// new StreamSource(new StringReader(respString)));
+
+ }
+
+ }
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAICollector.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAICollector.java
new file mode 100644
index 0000000..f2d98f9
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAICollector.java
@@ -0,0 +1,42 @@
+package org.gcube.data.publishing.gFeed.collectors.oai;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.gcube.common.resources.gcore.ServiceEndpoint;
+import org.gcube.data.publishing.gCatFeeder.utils.ISUtils;
+import org.gcube.data.publishing.gCatfeeder.collectors.DataCollector;
+import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CollectorFault;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class OAICollector implements DataCollector {
+
+ @Override
+ public Set collect() throws CollectorFault {
+ try {
+ HashSet toReturn=new HashSet();
+ String oaiCategory="";
+ String oaiPlatform="";
+ for(ServiceEndpoint epr:ISUtils.queryForServiceEndpoints(oaiCategory, oaiPlatform)) {
+ log.info("Found OAI Repo in resource "+epr.id()+" NAME : "+epr.profile().name());
+
+ String baseUrl=epr.profile().accessPoints().asCollection().iterator().next().address();
+ log.debug("Address is "+baseUrl);
+ OAIClient client = new OAIClient(baseUrl);
+
+ toReturn.addAll(client.getAll(OAIClient.DC_METADATA_PREFIX));
+ }
+
+ return toReturn;
+ }catch(Throwable t) {
+ throw new CollectorFault(t);
+ }
+ }
+
+
+
+
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAIHarvester.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAIHarvester.java
new file mode 100644
index 0000000..2eeedca
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/OAIHarvester.java
@@ -0,0 +1,76 @@
+package org.gcube.data.publishing.gFeed.collectors.oai;
+
+import java.util.Collections;
+import java.util.Set;
+
+import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
+import org.gcube.data.publishing.gCatFeeder.model.ControllerConfiguration;
+import org.gcube.data.publishing.gCatFeeder.model.EnvironmentConfiguration;
+import org.gcube.data.publishing.gCatfeeder.collectors.CatalogueRetriever;
+import org.gcube.data.publishing.gCatfeeder.collectors.CollectorPlugin;
+import org.gcube.data.publishing.gCatfeeder.collectors.DataCollector;
+import org.gcube.data.publishing.gCatfeeder.collectors.DataTransformer;
+import org.gcube.data.publishing.gCatfeeder.collectors.model.PluginDescriptor;
+import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CatalogueNotSupportedException;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.ckan.GCatTransformer;
+
+public class OAIHarvester implements CollectorPlugin{
+
+ @Override
+ public PluginDescriptor getDescriptor() {
+ return new PluginDescriptor(Constants.PLUGIN_ID);
+ }
+
+ @Override
+ public CatalogueRetriever getRetrieverByCatalogueType(String catalogueType) throws CatalogueNotSupportedException {
+ switch(catalogueType) {
+ case Constants.GCAT_TYPE : return GCATRetriever.get();
+ default : throw new CatalogueNotSupportedException("No support for "+catalogueType);
+ }
+ }
+
+ @Override
+ public Set getSupportedCatalogueTypes() {
+ return Collections.singleton(Constants.GCAT_TYPE);
+ }
+
+ @Override
+ public DataTransformer extends CatalogueFormatData, OAIRecord> getTransformerByCatalogueType(String catalogueType)
+ throws CatalogueNotSupportedException {
+ switch(catalogueType) {
+ case Constants.GCAT_TYPE : return new GCatTransformer();
+ default : throw new CatalogueNotSupportedException("No support for "+catalogueType);
+ }
+ }
+
+ @Override
+ public DataCollector getCollector() {
+ return new OAICollector();
+ }
+
+ @Override
+ public ControllerConfiguration getPublisherControllerConfiguration(String catalogueType)
+ throws CatalogueNotSupportedException {
+ return new ControllerConfiguration();
+ }
+
+ @Override
+ public void init() throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void initInScope() throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setEnvironmentConfiguration(EnvironmentConfiguration env) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/DCRecordMetadata.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/DCRecordMetadata.java
new file mode 100644
index 0000000..b03e881
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/DCRecordMetadata.java
@@ -0,0 +1,59 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Getter
+@Setter
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "dc", namespace="http://www.openarchives.org/OAI/2.0/oai_dc/")
+public class DCRecordMetadata extends OAIMetadata{
+
+ public static final String NS="http://purl.org/dc/elements/1.1/";
+
+ @XmlElement(namespace=NS)
+ private String contributor;
+ @XmlElement(namespace=NS)
+ private String coverage;
+ @XmlElement(namespace=NS)
+ private String creator;
+ @XmlElement(namespace=NS)
+ private String date;
+ @XmlElement(namespace=NS)
+ private String description;
+ @XmlElement(namespace=NS)
+ private String format;
+ @XmlElement(namespace=NS)
+ private String identifier;
+ @XmlElement(namespace=NS)
+ private String language;
+ @XmlElement(namespace=NS)
+ private String publisher;
+
+ @XmlElement(namespace=NS)
+ private String relation;
+ @XmlElement(namespace=NS)
+ private String rights;
+ @XmlElement(namespace=NS)
+ private String source;
+ @XmlElement(namespace=NS)
+ private String subject;
+
+ @XmlElement(namespace=NS)
+ private String title;
+ @XmlElement(namespace=NS)
+ private String type;
+
+
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/MetadataHolder.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/MetadataHolder.java
new file mode 100644
index 0000000..d2b77bd
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/MetadataHolder.java
@@ -0,0 +1,29 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlElements;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Getter
+@Setter
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "metadata", namespace="http://www.openarchives.org/OAI/2.0/")
+public class MetadataHolder{
+ @XmlElementRef
+// @XmlElements({
+// @XmlElement(name="dc",namespace="http://www.openarchives.org/OAI/2.0/oai_dc/", type=DCRecordMetadata.class)
+// })
+ public OAIMetadata metadata;
+}
\ No newline at end of file
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/Namespaces.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/Namespaces.java
new file mode 100644
index 0000000..46a89ce
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/Namespaces.java
@@ -0,0 +1,7 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+public class Namespaces {
+
+ public static final String OAI_PMH_NS="http://www.openarchives.org/OAI/2.0/";
+
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIInteractionException.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIInteractionException.java
new file mode 100644
index 0000000..f107b02
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIInteractionException.java
@@ -0,0 +1,30 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+public class OAIInteractionException extends Exception {
+
+ public OAIInteractionException() {
+ // TODO Auto-generated constructor stub
+ }
+
+ public OAIInteractionException(String message) {
+ super(message);
+ // TODO Auto-generated constructor stub
+ }
+
+ public OAIInteractionException(Throwable cause) {
+ super(cause);
+ // TODO Auto-generated constructor stub
+ }
+
+ public OAIInteractionException(String message, Throwable cause) {
+ super(message, cause);
+ // TODO Auto-generated constructor stub
+ }
+
+ public OAIInteractionException(String message, Throwable cause, boolean enableSuppression,
+ boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ // TODO Auto-generated constructor stub
+ }
+
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIMetadata.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIMetadata.java
new file mode 100644
index 0000000..66109a4
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIMetadata.java
@@ -0,0 +1,8 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+import javax.xml.bind.annotation.XmlSeeAlso;
+
+//@XmlSeeAlso({DCRecordMetadata.class})
+public abstract class OAIMetadata{
+
+}
\ No newline at end of file
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIRecord.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIRecord.java
new file mode 100644
index 0000000..53b291a
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAIRecord.java
@@ -0,0 +1,49 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.gcube.data.publishing.gCatfeeder.collectors.model.CustomData;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@XmlRootElement(name = "record", namespace=Namespaces.OAI_PMH_NS)
+@XmlAccessorType(XmlAccessType.FIELD)
+@Getter
+@Setter
+public class OAIRecord implements CustomData{
+
+
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @ToString
+ @Getter
+ @Setter
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlRootElement(namespace=Namespaces.OAI_PMH_NS)
+ public static class Header{
+ @XmlElement(namespace=Namespaces.OAI_PMH_NS)
+ private String identifier;
+ @XmlElement(name = "datestamp", namespace=Namespaces.OAI_PMH_NS)
+ private String dateStamp;
+ @XmlElement(namespace=Namespaces.OAI_PMH_NS)
+ private List setSpec;
+ }
+
+
+ @XmlElement(namespace=Namespaces.OAI_PMH_NS)
+ private Header header;
+ @XmlElement(name = "metadata", namespace=Namespaces.OAI_PMH_NS)
+ public MetadataHolder metadata;
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAI_PMH.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAI_PMH.java
new file mode 100644
index 0000000..aa39188
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/OAI_PMH.java
@@ -0,0 +1,103 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlValue;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@XmlRootElement(name="OAI-PMH", namespace=Namespaces.OAI_PMH_NS)
+//@XmlRootElement(name="OAI-PMH")
+@XmlAccessorType(XmlAccessType.FIELD)
+@Getter
+@Setter
+public class OAI_PMH {
+
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @ToString
+ @Getter
+ @Setter
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class Request{
+ @XmlAttribute
+ private String metadataPrefix;
+ @XmlAttribute
+ private String verb;
+ @XmlValue
+ private String path;
+
+ }
+
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @ToString
+ @Getter
+ @Setter
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class Token{
+ @XmlAttribute
+ private int cursor;
+ @XmlValue
+ private String id;
+ }
+
+
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @ToString
+ @Getter
+ @Setter
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class ListRecords{
+ @XmlElement(name = "record",namespace=Namespaces.OAI_PMH_NS)
+ private List records;
+ @XmlElement(name = "resumptionToken",namespace=Namespaces.OAI_PMH_NS)
+ private Token resumptionToken;
+ }
+
+
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @ToString
+ @Getter
+ @Setter
+ @XmlAccessorType(XmlAccessType.FIELD)
+ public static class Error{
+ @XmlAttribute
+ private String code;
+ @XmlValue
+ private String message;
+ }
+
+
+ @XmlElement(namespace=Namespaces.OAI_PMH_NS)
+ private String responseDate;
+
+ @XmlElement(namespace=Namespaces.OAI_PMH_NS)
+ private Request request;
+
+ @XmlElement(namespace=Namespaces.OAI_PMH_NS)
+ private Error error;
+
+ @XmlElement(name="ListRecords", namespace=Namespaces.OAI_PMH_NS)
+ private ListRecords responseRecords;
+
+
+ public boolean isError() {
+ return error!=null;
+ }
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/CkanItem.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/CkanItem.java
new file mode 100644
index 0000000..00ac554
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/CkanItem.java
@@ -0,0 +1,56 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model.ckan;
+
+import java.util.ArrayList;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class CkanItem {
+
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ @ToString
+ public static class CKanExtraField {
+
+ private String key;
+ private String value;
+ }
+
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @RequiredArgsConstructor
+ @ToString
+ public static class Tag{
+ @NonNull
+ private String name;
+ }
+
+
+
+ private String name;
+ private String title;
+ private String version;
+ @JsonProperty("private")
+ private Boolean privateFlag;
+ private String license_id;
+ private String author;
+ private String maintainer;
+ private String notes;
+ private ArrayList tags=new ArrayList();
+
+ private ArrayList extras=new ArrayList<>();
+}
\ No newline at end of file
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/GCatModel.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/GCatModel.java
new file mode 100644
index 0000000..663caf1
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/GCatModel.java
@@ -0,0 +1,58 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model.ckan;
+
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+
+import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
+import org.gcube.data.publishing.gCatFeeder.model.InternalConversionException;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@NoArgsConstructor
+@AllArgsConstructor
+public class GCatModel implements CatalogueFormatData {
+
+
+ @Getter
+ @Setter
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class CkanResource {
+
+ private String name;
+ private String url;
+ private String format;
+ private String description;
+
+ }
+
+
+ private static ObjectMapper mapper=new ObjectMapper();
+
+ @Setter
+ private String profile=null;
+
+ @Setter
+ private CkanItem item;
+
+ @Setter
+ private ArrayList resources=new ArrayList<>();
+
+ @Override
+ public String toCatalogueFormat() throws InternalConversionException {
+ try{
+ ByteArrayOutputStream baos=new ByteArrayOutputStream();
+ mapper.writeValue(baos, this);
+ return baos.toString();
+ }catch(Throwable t) {
+ throw new InternalConversionException("Unable to convert",t);
+ }
+ }
+}
diff --git a/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/GCatTransformer.java b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/GCatTransformer.java
new file mode 100644
index 0000000..1957901
--- /dev/null
+++ b/oai-harvester/src/main/java/org/gcube/data/publishing/gFeed/collectors/oai/model/ckan/GCatTransformer.java
@@ -0,0 +1,139 @@
+package org.gcube.data.publishing.gFeed.collectors.oai.model.ckan;
+
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.gcube.data.publishing.gCatFeeder.utils.Files;
+import org.gcube.data.publishing.gCatfeeder.collectors.DataTransformer;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.DCRecordMetadata;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIMetadata;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.ckan.CkanItem.CKanExtraField;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.ckan.GCatModel.CkanResource;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class GCatTransformer implements DataTransformer{
+
+
+
+ @Override
+ public Set transform(Collection collectedData) {
+ boolean useProfile=true;
+
+ HashSet toReturn=new HashSet<>();
+ for(OAIRecord record:collectedData) {
+ GCatModel toPublish=translate(record,useProfile);
+ if(useProfile) {
+ useProfile=false;
+ }
+ toReturn.add(toPublish);
+ }
+ return toReturn;
+ }
+
+
+ /**
+ * (Common) Title
+ * (Common) Description
+ * (Common) Tags: free list of keywords
+ * (Common) License
+ * (Common) Visibility: either public or private
+ * (Common) Version
+ * (Common) Author: the creator of metadata. Only one occurrence is supported;
+ * (Common) Maintainer:
+ * (Method specific) Creator: the author of the method (with email and ORCID). Repeatable field;
+ * (Method specific) Creation date: when the method has been released;
+ * (Method specific) Input: Repeatable field;
+ * (Method specific) Output: Repeatable field;
+ * (Method specific) RelatedPaper: a reference to an associated paper;
+ * (Method specific) Restrictions On Use: an optional text
+ * (Method specific) Attribution requirements: the text to use to acknowledge method usage;
+ */
+ private static GCatModel translate(OAIRecord toTranslate,Boolean useProfile) {
+ GCatModel toReturn = new GCatModel();
+
+ CkanItem item=new CkanItem();
+
+ item.setName(toTranslate.getHeader().getIdentifier());
+ OAIMetadata meta=toTranslate.getMetadata().getMetadata();
+ if(meta instanceof DCRecordMetadata) {
+ String profileID="Harvested Object";
+
+ DCRecordMetadata dcMeta=(DCRecordMetadata) meta;
+
+ item.setTitle(dcMeta.getTitle());
+ item.setNotes(dcMeta.getDescription());
+ item.setAuthor(dcMeta.getPublisher());
+ item.setMaintainer(dcMeta.getPublisher());
+ item.setVersion("n.a.");
+ item.setPrivateFlag(false);
+ item.setLicense_id("CC-BY-NC-SA-4.0");
+
+
+ item.getExtras().add(new CKanExtraField("system:type", profileID));
+
+ if(dcMeta.getContributor()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":contributor", dcMeta.getContributor()));
+ if(dcMeta.getCoverage()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":coverage", dcMeta.getCoverage()));
+ if(dcMeta.getCreator()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":creator", dcMeta.getCreator()));
+ if(dcMeta.getDate()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":date", dcMeta.getDate()));
+ if(dcMeta.getDescription()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":description", dcMeta.getDescription()));
+ if(dcMeta.getFormat()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":format", dcMeta.getFormat()));
+ if(dcMeta.getIdentifier()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":identifier", dcMeta.getIdentifier()));
+ if(dcMeta.getLanguage()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":language", dcMeta.getLanguage()));
+ if(dcMeta.getPublisher()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":publisher", dcMeta.getPublisher()));
+ if(dcMeta.getRelation()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":relation", dcMeta.getRelation()));
+ if(dcMeta.getRights()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":rights", dcMeta.getRights()));
+ if(dcMeta.getSource()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":source", dcMeta.getSource()));
+ if(dcMeta.getSubject()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":subject", dcMeta.getSubject()));
+ if(dcMeta.getTitle()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":title", dcMeta.getTitle()));
+ if(dcMeta.getType()!=null)
+ item.getExtras().add(new CKanExtraField(profileID+":type", dcMeta.getType()));
+
+
+ try {
+ URL url=new URL(dcMeta.getIdentifier());
+ CkanResource res=new CkanResource("Record", url+"", url.getProtocol(), "Original record");
+ ArrayList list=new ArrayList<>();
+ toReturn.setResources(list);
+ }catch(Throwable t) {
+ log.debug("Unable to set identifier "+dcMeta.getIdentifier()+"as resource ",t);
+ }
+
+ }
+
+ toReturn.setItem(item);
+
+ try {
+ if(useProfile)
+ toReturn.setProfile(Files.readFileAsString(
+ Files.getFileFromResources("HarvesterObject.xml").getAbsolutePath(),
+ Charset.defaultCharset())); //"Harvested Object”
+ }catch(Throwable t) {
+ log.error("Unable to set profile ",t);
+
+ }
+ return toReturn;
+ }
+
+
+}
diff --git a/oai-harvester/src/main/resources/META-INF/services/org.gcube.data.publishing.gCatfeeder.collectors.CollectorPlugin b/oai-harvester/src/main/resources/META-INF/services/org.gcube.data.publishing.gCatfeeder.collectors.CollectorPlugin
new file mode 100644
index 0000000..eb0dd2c
--- /dev/null
+++ b/oai-harvester/src/main/resources/META-INF/services/org.gcube.data.publishing.gCatfeeder.collectors.CollectorPlugin
@@ -0,0 +1 @@
+org.gcube.data.publishing.gFeed.collectors.oai.OAIHarvester.java
\ No newline at end of file
diff --git a/oai-harvester/src/main/resources/profiles/HarvestedObject.xml b/oai-harvester/src/main/resources/profiles/HarvestedObject.xml
new file mode 100644
index 0000000..50d1162
--- /dev/null
+++ b/oai-harvester/src/main/resources/profiles/HarvestedObject.xml
@@ -0,0 +1,99 @@
+
+
+
+
+ contributor
+ *
+ false
+ String
+
+
+ coverage
+ *
+ false
+ String
+
+
+ creator
+ *
+ false
+ String
+
+
+ date
+ *
+ false
+ String
+
+
+ description
+ *
+ false
+ String
+
+
+ format
+ *
+ false
+ String
+
+
+ identifier
+ *
+ false
+ String
+
+
+ language
+ *
+ false
+ String
+
+
+ publisher
+ *
+ false
+ String
+
+
+ relation
+ *
+ false
+ String
+
+
+ rights
+ *
+ false
+ String
+
+
+ source
+ *
+ false
+ String
+
+
+ subject
+ *
+ false
+ String
+
+
+ title
+ *
+ false
+ String
+
+
+ type
+ *
+ false
+ String
+
+
\ No newline at end of file
diff --git a/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/CKANTest.java b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/CKANTest.java
new file mode 100644
index 0000000..1ff909e
--- /dev/null
+++ b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/CKANTest.java
@@ -0,0 +1,51 @@
+package org.gcube.application.gfeed.oai;
+
+import java.io.ByteArrayOutputStream;
+import java.net.MalformedURLException;
+
+import org.gcube.data.publishing.gCatFeeder.model.InternalConversionException;
+import org.gcube.data.publishing.gCatFeeder.tests.TokenSetter;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.DCRecordMetadata;
+import org.gcube.gcat.client.Item;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+public class CKANTest {
+
+
+ public static void main (String args[]) {
+ TokenSetter.set("/pred4s/preprod/preVRE");
+
+ }
+
+
+ private static ObjectMapper mapper=new ObjectMapper();
+
+
+ public static void updateItem(String name, String itemContent) throws MalformedURLException {
+ new Item().update(name, itemContent);
+ }
+
+ public static void createItem(String itemContent) throws MalformedURLException {
+ new Item().create(itemContent);
+ }
+
+
+ public static void getItem(String name) throws MalformedURLException {
+ new Item().read(name);
+ }
+
+ public String toCatalogueFormat() throws InternalConversionException {
+ try{
+ ByteArrayOutputStream baos=new ByteArrayOutputStream();
+ mapper.writeValue(baos, this);
+ return baos.toString();
+ }catch(Throwable t) {
+ throw new InternalConversionException("Unable to convert",t);
+ }
+ }
+
+
+
+}
diff --git a/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/OAIClientTests.java b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/OAIClientTests.java
new file mode 100644
index 0000000..35e028a
--- /dev/null
+++ b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/OAIClientTests.java
@@ -0,0 +1,23 @@
+package org.gcube.application.gfeed.oai;
+
+import java.util.Collection;
+
+import javax.xml.bind.JAXBException;
+
+import org.gcube.data.publishing.gFeed.collectors.oai.OAIClient;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIInteractionException;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+
+public class OAIClientTests {
+
+
+ public static void main (String[] args) throws JAXBException, OAIInteractionException {
+ String baseUrl="https://data.inrae.fr/oai";
+ OAIClient client=new OAIClient(baseUrl);
+ Collection records=client.getAll(OAIClient.DC_METADATA_PREFIX);
+
+ System.out.println("Records size = "+records.size());
+
+ }
+
+}
diff --git a/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/ParsingTests.java b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/ParsingTests.java
new file mode 100644
index 0000000..ec729d2
--- /dev/null
+++ b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/ParsingTests.java
@@ -0,0 +1,89 @@
+package org.gcube.application.gfeed.oai;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.nio.file.Paths;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import org.gcube.data.publishing.gFeed.collectors.oai.model.DCRecordMetadata;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.MetadataHolder;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIMetadata;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAI_PMH;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class ParsingTests {
+
+ static JAXBContext jaxbContext;
+
+ @BeforeClass
+ public static void init() throws JAXBException {
+
+ jaxbContext = JAXBContext.newInstance(OAIRecord.class,
+ MetadataHolder.class,
+ OAIMetadata.class,
+ DCRecordMetadata.class,
+ OAI_PMH.class);
+ }
+
+ @Test
+ public void parseDC() throws JAXBException {
+ File toRead=getFileFromResources("resp_dc.xml");
+
+ Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
+
+ OAI_PMH response = (OAI_PMH) jaxbUnmarshaller.unmarshal(toRead);
+
+ Assert.assertNotNull(response);
+ Assert.assertNotNull(response.getResponseRecords().getRecords());
+
+ assertTrue(response.getResponseRecords().getRecords().size()>0);
+
+ for(OAIRecord record : response.getResponseRecords().getRecords()) {
+ log.debug("Record is "+record);
+ }
+
+// System.out.println(response);
+
+
+ }
+
+ @Test
+ public void marshal() throws JAXBException {
+// jaxbContext.createMarshaller().marshal(new OAI_PMH("dummy"),System.out);
+ }
+
+
+ public static File getFileFromResources(String fileName) {
+
+ ClassLoader classLoader =ParsingTests.class.getClassLoader();
+
+ URL resource = classLoader.getResource(fileName);
+ if (resource == null) {
+ throw new IllegalArgumentException("file is not found!");
+ } else {
+ return new File(resource.getFile());
+ }
+
+ }
+
+
+ public static String readFileAsString(String path, Charset encoding)
+ throws IOException
+ {
+ byte[] encoded = java.nio.file.Files.readAllBytes(Paths.get(path));
+ return new String(encoded, encoding);
+ }
+}
diff --git a/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/TranslationTest.java b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/TranslationTest.java
new file mode 100644
index 0000000..7744527
--- /dev/null
+++ b/oai-harvester/src/test/java/org/gcube/application/gfeed/oai/TranslationTest.java
@@ -0,0 +1,46 @@
+package org.gcube.application.gfeed.oai;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Set;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.gcube.data.publishing.gCatFeeder.model.CatalogueFormatData;
+import org.gcube.data.publishing.gCatFeeder.model.InternalConversionException;
+import org.gcube.data.publishing.gCatFeeder.tests.BaseCollectorTest;
+import org.gcube.data.publishing.gCatfeeder.collectors.CollectorPlugin;
+import org.gcube.data.publishing.gCatfeeder.collectors.DataCollector;
+import org.gcube.data.publishing.gCatfeeder.collectors.DataTransformer;
+import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CatalogueNotSupportedException;
+import org.gcube.data.publishing.gCatfeeder.collectors.model.faults.CollectorFault;
+import org.gcube.data.publishing.gFeed.collectors.oai.OAIHarvester;
+import org.gcube.data.publishing.gFeed.collectors.oai.model.OAIRecord;
+import org.junit.Assume;
+import org.junit.Test;
+
+public class TranslationTest extends BaseCollectorTest{
+
+ @Test
+ public void testTranslation() throws CollectorFault, CatalogueNotSupportedException, JsonGenerationException, JsonMappingException, IOException, InternalConversionException {
+ Assume.assumeTrue(isTestInfrastructureEnabled());
+
+ System.out.println("Entering Infrastructure enabled tests..");
+ ObjectMapper mapper = new ObjectMapper();
+
+ CollectorPlugin plugin=new OAIHarvester();
+ plugin.setEnvironmentConfiguration(getEnvironmentConfiguration());
+ DataCollector collector=plugin.getCollector();
+ Collection collected=collector.collect();
+ System.out.println("Found "+collected.size()+" elements");
+ for(Object obj:collected)
+ System.out.println(mapper.writeValueAsString(obj)+"\n");
+
+ for(String destinationcatalogue : (Set)plugin.getSupportedCatalogueTypes()) {
+ DataTransformer extends CatalogueFormatData, OAIRecord> transformer=plugin.getTransformerByCatalogueType(destinationcatalogue);
+ for(Object data:transformer.transform(collected))
+ System.out.println(((CatalogueFormatData)data).toCatalogueFormat());
+ }
+ }
+}
diff --git a/oai-harvester/src/test/resources/dc-record.xml b/oai-harvester/src/test/resources/dc-record.xml
new file mode 100644
index 0000000..bbfb561
--- /dev/null
+++ b/oai-harvester/src/test/resources/dc-record.xml
@@ -0,0 +1,25 @@
+
+
+ doi:10.15454/000PKT
+ 2019-10-28T10:32:34Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Beet:AKER_8354
+ https://doi.org/10.15454/000PKT
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_8354 is a Beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
\ No newline at end of file
diff --git a/oai-harvester/src/test/resources/err-resp_dc.xml b/oai-harvester/src/test/resources/err-resp_dc.xml
new file mode 100644
index 0000000..842e489
--- /dev/null
+++ b/oai-harvester/src/test/resources/err-resp_dc.xml
@@ -0,0 +1,5 @@
+
+ 2020-05-07T14:32:09Z
+ https://data.inrae.fr/oai
+ ResumptionToken cannot be sent together with from, until, metadataPrefix or set parameters
+
\ No newline at end of file
diff --git a/oai-harvester/src/test/resources/resp_dc.xml b/oai-harvester/src/test/resources/resp_dc.xml
new file mode 100644
index 0000000..d18722c
--- /dev/null
+++ b/oai-harvester/src/test/resources/resp_dc.xml
@@ -0,0 +1,2208 @@
+
+ 2020-04-29T13:29:22Z
+ https://data.inrae.fr/oai
+
+
+
+ doi:10.15454/000PKT
+ 2019-10-28T10:32:34Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Beet:AKER_8354
+ https://doi.org/10.15454/000PKT
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_8354 is a Beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/002GAC
+ 2019-10-28T10:05:50Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:322Bdx10
+ https://doi.org/10.15454/002GAC
+ GnpIS
+ Portail Data Inra
+ Abstract:CABERNET SAUVIGNON is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/005YD0
+ 2019-10-28T12:39:43Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA, CNRS:Sunflower:SUN_LINE0055A
+ https://doi.org/10.15454/005YD0
+ GnpIS
+ Portail Data Inra
+ Abstract:89A18/A is a Sunflower accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-09-01
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/006YZ4
+ 2019-10-28T11:27:58Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Citrus fruit:SRA 442
+ https://doi.org/10.15454/006YZ4
+ GnpIS
+ Portail Data Inra
+ Abstract:Mandarine Zanzibar SG is a Citrus fruit accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/0091PE
+ 2019-10-28T11:36:13Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Quercus robur:162
+ https://doi.org/10.15454/0091PE
+ GnpIS
+ Portail Data Inra
+ Abstract:162 is a Quercus robur accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00GM19
+ 2019-10-28T12:57:21Z
+ UMR_AMAP
+ ALL
+
+
+
+ ONF:Quercus petraea:QP.06_853p1
+ https://doi.org/10.15454/00GM19
+ GnpIS
+ Portail Data Inra
+ Abstract:QP.06_FONTAINEBLEAU_853p1 is a Quercus petraea accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-01-02
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00GY47
+ 2019-10-28T10:57:01Z
+ ALL
+ UMR_AMAP
+
+
+
+ USDA:Beta vulgaris vulgaris cv. Sugar beet:PI 26963
+ https://doi.org/10.15454/00GY47
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_11472 is a Beta vulgaris vulgaris cv. Sugar beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00HHY9
+ 2019-10-28T11:59:15Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Lettuce:LC0468
+ https://doi.org/10.15454/00HHY9
+ GnpIS
+ Portail Data Inra
+ Abstract:Ravel is a Lettuce accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00IGXY
+ 2019-10-28T10:52:00Z
+ UMR_AMAP
+ ALL
+
+
+
+ USDA:Beta trigyna:Ames 4467
+ https://doi.org/10.15454/00IGXY
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_11651 is a Beta trigyna accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00LAVB
+ 2019-12-21T06:24:43Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Pea:VCL194
+ https://doi.org/10.15454/00LAVB
+ GnpIS
+ Portail Data Inra
+ Abstract:SERPETTE EXPRESS VERDATRE is a Pea accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-12-19
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00M7HF
+ 2019-10-28T11:14:14Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:300Mtp20
+ https://doi.org/10.15454/00M7HF
+ GnpIS
+ Portail Data Inra
+ Abstract:Sauvignon blanc n°1 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00NTLJ
+ 2019-10-28T10:34:49Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Beet:AKER_5235
+ https://doi.org/10.15454/00NTLJ
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_5235 is a Beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00OTC3
+ 2019-12-21T06:28:46Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Plum:P3730
+ https://doi.org/10.15454/00OTC3
+ GnpIS
+ Portail Data Inra
+ Abstract:Couilles du Pape Béranger is a Plum accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-12-19
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00P2IG
+ 2019-10-28T11:04:15Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus x generosa:661301496
+ https://doi.org/10.15454/00P2IG
+ GnpIS
+ Portail Data Inra
+ Abstract:661301496 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/00PK6P
+ 2019-10-28T10:21:25Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Thale cress:441AV
+ https://doi.org/10.15454/00PK6P
+ GnpIS
+ Portail Data Inra
+ Abstract:Fei-0 is a Thale cress accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/010UEF
+ 2019-10-28T12:57:14Z
+ UMR_AMAP
+ ALL
+
+
+
+ ONF:Quercus petraea:QP.02_125
+ https://doi.org/10.15454/010UEF
+ GnpIS
+ Portail Data Inra
+ Abstract:QP.02_BERCE_125 is a Quercus petraea accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-01-02
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/013R4O
+ 2019-10-28T10:47:52Z
+ UMR_AMAP
+ ALL
+
+
+
+ USDA:Beta vulgaris vulgaris:PI 199224
+ https://doi.org/10.15454/013R4O
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_10598 is a Beta vulgaris vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/014HYI
+ 2019-10-28T10:59:49Z
+ UMR_AMAP
+ ALL
+
+
+
+ VIR:Beta vulgaris:VIR506201744
+ https://doi.org/10.15454/014HYI
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_2427 is a Beta vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/019OYK
+ 2019-10-28T10:18:23Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus x generosa:661300231
+ https://doi.org/10.15454/019OYK
+ GnpIS
+ Portail Data Inra
+ Abstract:661300231 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01AAZB
+ 2019-10-28T12:11:59Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Wheat:1356
+ https://doi.org/10.15454/01AAZB
+ GnpIS
+ Portail Data Inra
+ Abstract:BIMA-4 is a Wheat accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01DCVR
+ 2019-10-28T11:38:12Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Pea:POIS IRANIEN 57 B
+ https://doi.org/10.15454/01DCVR
+ GnpIS
+ Portail Data Inra
+ Abstract:POIS IRANIEN 57 B is a Pea accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01EK9B
+ 2019-10-28T10:39:01Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Thale cress:697AV
+ https://doi.org/10.15454/01EK9B
+ GnpIS
+ Portail Data Inra
+ Abstract:Pre-6 is a Thale cress accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01HDDW
+ 2019-10-28T12:22:49Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Wheat:36228
+ https://doi.org/10.15454/01HDDW
+ GnpIS
+ Portail Data Inra
+ Abstract:SALUTA is a Wheat accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01HGHY
+ 2019-10-28T12:27:38Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Wheat:16171
+ https://doi.org/10.15454/01HGHY
+ GnpIS
+ Portail Data Inra
+ Abstract:PBW65 is a Wheat accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01NZHT
+ 2019-10-28T12:44:19Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA, CNRS:Sunflower:SUN_PAC2RHA266_RIL039
+ https://doi.org/10.15454/01NZHT
+ GnpIS
+ Portail Data Inra
+ Abstract:PAC2*RHA266_RIL39 is a Sunflower accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-09-01
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01O2ED
+ 2019-10-28T10:04:31Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Rapeseed:RAPSO_144
+ https://doi.org/10.15454/01O2ED
+ GnpIS
+ Portail Data Inra
+ Abstract:Bellini is a Rapeseed accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01OMSM
+ 2019-10-28T11:33:44Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Pinus pinaster:H12L-63
+ https://doi.org/10.15454/01OMSM
+ GnpIS
+ Portail Data Inra
+ Abstract:H12L-63 is a Pinus pinaster accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01TVVQ
+ 2019-10-28T11:11:59Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:0Mtp376
+ https://doi.org/10.15454/01TVVQ
+ GnpIS
+ Portail Data Inra
+ Abstract:Figous is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01VJ6G
+ 2019-10-28T11:42:31Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Quercus robur:A622
+ https://doi.org/10.15454/01VJ6G
+ GnpIS
+ Portail Data Inra
+ Abstract:A622 is a Quercus robur accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01VOOC
+ 2019-10-28T12:48:49Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA-ONF:Populus nigra:EYN-039
+ https://doi.org/10.15454/01VOOC
+ GnpIS
+ Portail Data Inra
+ Abstract:EYN-039 is a Populus nigra accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-01-02
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/01WUPZ
+ 2019-10-28T11:52:18Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Lucerne:L000047
+ https://doi.org/10.15454/01WUPZ
+ GnpIS
+ Portail Data Inra
+ Abstract:L000047 is a Lucerne accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/021KKA
+ 2019-10-28T10:47:11Z
+ UMR_AMAP
+ ALL
+
+
+
+ USDA:Beta vulgaris vulgaris:PI 260336
+ https://doi.org/10.15454/021KKA
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_10824 is a Beta vulgaris vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/022L7S
+ 2019-10-28T13:04:34Z
+ ALL
+ UMR_AMAP
+
+
+
+ Aegean Agricultural Research Institute:Almond:2913
+ https://doi.org/10.15454/022L7S
+ GnpIS
+ Portail Data Inra
+ Abstract:2913 is a Almond accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/022W6V
+ 2019-10-28T12:32:06Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Sorbus domestica:3016
+ https://doi.org/10.15454/022W6V
+ GnpIS
+ Portail Data Inra
+ Abstract:SD071 is a Sorbus domestica accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-12-09
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02BWYM
+ 2019-10-28T10:19:10Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus x generosa:661302738
+ https://doi.org/10.15454/02BWYM
+ GnpIS
+ Portail Data Inra
+ Abstract:661302738 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02BZ5T
+ 2019-10-28T12:01:40Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:194Col3123
+ https://doi.org/10.15454/02BZ5T
+ GnpIS
+ Portail Data Inra
+ Abstract:Pinot blanc B3123 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02E1SI
+ 2019-10-28T11:05:47Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:0Mtp265
+ https://doi.org/10.15454/02E1SI
+ GnpIS
+ Portail Data Inra
+ Abstract:Colha de Gado is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02F6WA
+ 2019-10-28T10:33:21Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Beet:AKER_62
+ https://doi.org/10.15454/02F6WA
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_62 is a Beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02G9RQ
+ 2019-10-28T12:46:43Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus nigra:BAS-025
+ https://doi.org/10.15454/02G9RQ
+ GnpIS
+ Portail Data Inra
+ Abstract:BAS-025 is a Populus nigra accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-01-02
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02H6PB
+ 2019-10-28T10:00:40Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:199Mtp38
+ https://doi.org/10.15454/02H6PB
+ GnpIS
+ Portail Data Inra
+ Abstract:Keknyelü (par erreur) is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02JDF3
+ 2019-10-28T13:08:11Z
+ ALL
+ UMR_AMAP
+ NoGeneticResource
+
+
+
+ CREA:Maize:Lo1242_bergamo
+ https://doi.org/10.15454/02JDF3
+ GnpIS
+ Portail Data Inra
+ Abstract:Lo1242_bergamo is a Maize accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-10-01
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02KFIV
+ 2019-10-28T11:24:27Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Wheat:32909
+ https://doi.org/10.15454/02KFIV
+ GnpIS
+ Portail Data Inra
+ Abstract:AKTEUR is a Wheat accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02L4GW
+ 2019-10-28T11:02:30Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus x generosa:661300206
+ https://doi.org/10.15454/02L4GW
+ GnpIS
+ Portail Data Inra
+ Abstract:661300206 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02MU2T
+ 2019-10-28T11:26:41Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Maize:Lo249_bergamo
+ https://doi.org/10.15454/02MU2T
+ GnpIS
+ Portail Data Inra
+ Abstract:Lo249_bergamo is a Maize accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02OQWG
+ 2019-10-28T13:04:55Z
+ ALL
+ UMR_AMAP
+
+
+
+ Nikitskyi Botanical Gardens:Almond:UN7800034
+ https://doi.org/10.15454/02OQWG
+ GnpIS
+ Portail Data Inra
+ Abstract:CHernomorets is a Almond accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02RJ5L
+ 2019-10-28T11:00:47Z
+ ALL
+ UMR_AMAP
+
+
+
+ VIR:Beta vulgaris:VIR506202349
+ https://doi.org/10.15454/02RJ5L
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_2415 is a Beta vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02UFOV
+ 2019-10-28T11:34:15Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:6327Mtp1
+ https://doi.org/10.15454/02UFOV
+ GnpIS
+ Portail Data Inra
+ Abstract:Malègue 1157-1 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02V8GL
+ 2019-10-28T12:15:50Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:1989Mtp1
+ https://doi.org/10.15454/02V8GL
+ GnpIS
+ Portail Data Inra
+ Abstract:Bruni 381 (par erreur) is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02WGIJ
+ 2019-10-28T10:00:04Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Beet:AKER_4995
+ https://doi.org/10.15454/02WGIJ
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_4995 is a Beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02WLQC
+ 2019-10-28T11:54:36Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Quercus robur:Q305a
+ https://doi.org/10.15454/02WLQC
+ GnpIS
+ Portail Data Inra
+ Abstract:Q305a is a Quercus robur accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02XACC
+ 2019-10-28T10:04:02Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA Rennes:Pea:DCG0655
+ https://doi.org/10.15454/02XACC
+ GnpIS
+ Portail Data Inra
+ Abstract:AeD99OSW- 37-3-4 is a Pea accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02XB4V
+ 2019-10-28T11:29:48Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:19Mtp3
+ https://doi.org/10.15454/02XB4V
+ GnpIS
+ Portail Data Inra
+ Abstract:Carignan blanc is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02XWVJ
+ 2019-10-28T12:03:32Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:5937Mtp3
+ https://doi.org/10.15454/02XWVJ
+ GnpIS
+ Portail Data Inra
+ Abstract:Seyve Villard 19-228 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/02YJSQ
+ 2019-10-28T11:07:06Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus x generosa:661302049
+ https://doi.org/10.15454/02YJSQ
+ GnpIS
+ Portail Data Inra
+ Abstract:661302049 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/031QUX
+ 2019-10-28T10:46:00Z
+ UMR_AMAP
+ ALL
+
+
+
+ IPK:Beta vulgaris:BETA 1326
+ https://doi.org/10.15454/031QUX
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_1323 is a Beta vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03AWOS
+ 2019-10-28T11:28:55Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Lettuce:LC0461
+ https://doi.org/10.15454/03AWOS
+ GnpIS
+ Portail Data Inra
+ Abstract:Radichetta is a Lettuce accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03DKKZ
+ 2019-10-28T11:31:46Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Pinus pinaster:M421T-120
+ https://doi.org/10.15454/03DKKZ
+ GnpIS
+ Portail Data Inra
+ Abstract:M421T-120 is a Pinus pinaster accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03E6IC
+ 2019-10-28T11:16:25Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:1061Mtp1
+ https://doi.org/10.15454/03E6IC
+ GnpIS
+ Portail Data Inra
+ Abstract:Pirovano 477 a is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03FDTZ
+ 2019-10-28T11:46:45Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Lucerne:L000660
+ https://doi.org/10.15454/03FDTZ
+ GnpIS
+ Portail Data Inra
+ Abstract:L000660 is a Lucerne accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03HKKL
+ 2019-10-28T11:05:16Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:585Bdx99
+ https://doi.org/10.15454/03HKKL
+ GnpIS
+ Portail Data Inra
+ Abstract:CHASSELAS BE 248 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03HZJJ
+ 2019-10-28T11:55:18Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Maize:FRA0411343
+ https://doi.org/10.15454/03HZJJ
+ GnpIS
+ Portail Data Inra
+ Abstract:NGT 39 1 is a Maize accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03IF3R
+ 2019-10-28T12:26:04Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Wheat:7276
+ https://doi.org/10.15454/03IF3R
+ GnpIS
+ Portail Data Inra
+ Abstract:VAKKA is a Wheat accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03J35I
+ 2019-10-28T11:08:24Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:50Mtp1
+ https://doi.org/10.15454/03J35I
+ GnpIS
+ Portail Data Inra
+ Abstract:Alfrocheiro is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03JZOX
+ 2019-10-28T11:22:55Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus nigra:662200085
+ https://doi.org/10.15454/03JZOX
+ GnpIS
+ Portail Data Inra
+ Abstract:662200085 is a Populus nigra accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03KBSY
+ 2019-10-28T10:15:05Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA-ONF:Populus nigra:662200765
+ https://doi.org/10.15454/03KBSY
+ GnpIS
+ Portail Data Inra
+ Abstract:662200765 is a Populus nigra accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03NS6G
+ 2019-10-28T11:03:42Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA-ONF:Populus x generosa:661301210
+ https://doi.org/10.15454/03NS6G
+ GnpIS
+ Portail Data Inra
+ Abstract:661301210 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03Q93I
+ 2019-10-28T12:18:57Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Citrus fruit:SRA 362
+ https://doi.org/10.15454/03Q93I
+ GnpIS
+ Portail Data Inra
+ Abstract:Clémentine Corsica 1 is a Citrus fruit accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03QW4L
+ 2019-10-28T10:24:01Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Pea:WANDOU 2
+ https://doi.org/10.15454/03QW4L
+ GnpIS
+ Portail Data Inra
+ Abstract:WANDOU 2 is a Pea accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03RPQZ
+ 2019-10-28T13:03:40Z
+ UMR_AMAP
+ ALL
+
+
+
+ Istituto Sperimentale per la Frutticoltura, Roma:Almond:Supernova
+ https://doi.org/10.15454/03RPQZ
+ GnpIS
+ Portail Data Inra
+ Abstract:Supernova is a Almond accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03SAG9
+ 2019-10-28T12:39:57Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA, CNRS:Sunflower:SUN_LINE0211A
+ https://doi.org/10.15454/03SAG9
+ GnpIS
+ Portail Data Inra
+ Abstract:CHG/A is a Sunflower accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-09-01
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03SI9A
+ 2019-10-28T12:48:51Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus nigra:EYN-051
+ https://doi.org/10.15454/03SI9A
+ GnpIS
+ Portail Data Inra
+ Abstract:EYN-051 is a Populus nigra accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-01-02
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03VMVR
+ 2019-10-28T11:47:55Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Lucerne:P002183
+ https://doi.org/10.15454/03VMVR
+ GnpIS
+ Portail Data Inra
+ Abstract:P002183 is a Lucerne accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03XRQF
+ 2019-10-28T10:39:47Z
+ ALL
+ UMR_AMAP
+
+
+
+ HBLFA:Beta vulgaris vulgaris cv. Garden beet:HBLFAG-Bet-0005
+ https://doi.org/10.15454/03XRQF
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_5846 is a Beta vulgaris vulgaris cv. Garden beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03Y5XF
+ 2019-10-28T10:57:24Z
+ ALL
+ UMR_AMAP
+
+
+
+ USDA:Beta vulgaris vulgaris:PI 29857
+ https://doi.org/10.15454/03Y5XF
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_11544 is a Beta vulgaris vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/03ZQVB
+ 2019-10-28T11:02:38Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA-ONF:Populus x generosa:661300648
+ https://doi.org/10.15454/03ZQVB
+ GnpIS
+ Portail Data Inra
+ Abstract:661300648 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/040NW8
+ 2019-10-28T11:18:04Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:0Bdx650
+ https://doi.org/10.15454/040NW8
+ GnpIS
+ Portail Data Inra
+ Abstract:PINOT GRIS is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/043UIP
+ 2019-10-28T10:40:38Z
+ ALL
+ UMR_AMAP
+
+
+
+ CREA:Beta vulgaris:6
+ https://doi.org/10.15454/043UIP
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_2291 is a Beta vulgaris accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04BRN4
+ 2019-10-28T10:28:18Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Quercus robur x Quercus petraea:J052
+ https://doi.org/10.15454/04BRN4
+ GnpIS
+ Portail Data Inra
+ Abstract:J052 is a Quercus robur x Quercus petraea accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-09-11
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04FDXN
+ 2019-12-18T06:45:57Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Abies nordmanniana:12176
+ https://doi.org/10.15454/04FDXN
+ GnpIS
+ Portail Data Inra
+ Abstract:IGDR is a Abies nordmanniana accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-12-17
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04GCOM
+ 2019-10-28T11:30:16Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:2811Mtp1
+ https://doi.org/10.15454/04GCOM
+ GnpIS
+ Portail Data Inra
+ Abstract:Balint is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04JXHZ
+ 2019-10-28T11:46:50Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Lucerne:L000575
+ https://doi.org/10.15454/04JXHZ
+ GnpIS
+ Portail Data Inra
+ Abstract:L000575 is a Lucerne accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04K5BY
+ 2019-10-28T11:44:34Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Lucerne:L000114
+ https://doi.org/10.15454/04K5BY
+ GnpIS
+ Portail Data Inra
+ Abstract:L000114 is a Lucerne accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04LHSC
+ 2019-10-28T11:13:50Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:1095Mtp5
+ https://doi.org/10.15454/04LHSC
+ GnpIS
+ Portail Data Inra
+ Abstract:Cardinal is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04LOIH
+ 2019-10-28T11:26:33Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Maize:F7095_inra
+ https://doi.org/10.15454/04LOIH
+ GnpIS
+ Portail Data Inra
+ Abstract:F7095_inra is a Maize accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04MXD1
+ 2019-10-28T10:48:52Z
+ ALL
+ UMR_AMAP
+
+
+
+ USDA:Beta vulgaris maritima:PI 198448
+ https://doi.org/10.15454/04MXD1
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_10464 is a Beta vulgaris maritima accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04NEER
+ 2019-10-28T10:40:40Z
+ ALL
+ UMR_AMAP
+
+
+
+ EURISCO:Beta vulgaris vulgaris cv. Sugar beet:ROM053:1869
+ https://doi.org/10.15454/04NEER
+ GnpIS
+ Portail Data Inra
+ Abstract:AKER_5685 is a Beta vulgaris vulgaris cv. Sugar beet accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04PCVO
+ 2019-12-21T06:24:41Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Pea:VKR063
+ https://doi.org/10.15454/04PCVO
+ GnpIS
+ Portail Data Inra
+ Abstract:RITA is a Pea accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-12-19
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04PSGG
+ 2019-10-28T11:36:07Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:8500Mtp332
+ https://doi.org/10.15454/04PSGG
+ GnpIS
+ Portail Data Inra
+ Abstract:Lambrusque de semis Colmar 620 E is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04QG0X
+ 2019-10-28T11:16:11Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:585Mtp76
+ https://doi.org/10.15454/04QG0X
+ GnpIS
+ Portail Data Inra
+ Abstract:Chasselas 61 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04QITI
+ 2019-10-28T10:09:45Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Quercus petraea:118
+ https://doi.org/10.15454/04QITI
+ GnpIS
+ Portail Data Inra
+ Abstract:118 is a Quercus petraea accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04UH99
+ 2019-10-28T11:03:43Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA-ONF:Populus x generosa:661301220
+ https://doi.org/10.15454/04UH99
+ GnpIS
+ Portail Data Inra
+ Abstract:661301220 is a Populus x generosa accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04UOGC
+ 2019-10-28T11:13:02Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:1741Mtp1
+ https://doi.org/10.15454/04UOGC
+ GnpIS
+ Portail Data Inra
+ Abstract:Naosé is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/04ZHGA
+ 2019-10-28T11:31:53Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:0Mtp1157
+ https://doi.org/10.15454/04ZHGA
+ GnpIS
+ Portail Data Inra
+ Abstract:Uva anis is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/0551NW
+ 2019-10-28T11:33:58Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:6125Mtp1
+ https://doi.org/10.15454/0551NW
+ GnpIS
+ Portail Data Inra
+ Abstract:Uvette dorée n°2 is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/05CSEG
+ 2019-12-21T06:24:38Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Pea:VKL080
+ https://doi.org/10.15454/05CSEG
+ GnpIS
+ Portail Data Inra
+ Abstract:PRECOCE DE MAI (FR) is a Pea accession from GnpIS.
+ Genetic Resource
+ English
+ 2019-12-19
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/05F5RT
+ 2019-10-28T11:08:17Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Grapevine:628Mtp1
+ https://doi.org/10.15454/05F5RT
+ GnpIS
+ Portail Data Inra
+ Abstract:Royal is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/05GSCE
+ 2019-10-28T11:21:06Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA:Cabbage:PO FR56 0020
+ https://doi.org/10.15454/05GSCE
+ GnpIS
+ Portail Data Inra
+ Abstract:Cabus de Lorient is a Cabbage accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/05HCVU
+ 2019-10-28T12:23:50Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Wheat:28977
+ https://doi.org/10.15454/05HCVU
+ GnpIS
+ Portail Data Inra
+ Abstract:RE04043 is a Wheat accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/05HT6N
+ 2019-10-28T12:33:51Z
+ ALL
+ UMR_AMAP
+
+
+
+ INRA, CNRS:Sunflower:SUN_POP058
+ https://doi.org/10.15454/05HT6N
+ GnpIS
+ Portail Data Inra
+ Abstract:NAIN_NOIR_MB is a Sunflower accession from GnpIS.
+ Genetic Resource
+ English
+ 2020-09-01
+ Rinnova
+ Physical Object
+
+
+
+
+
+ doi:10.15454/05J2EE
+ 2019-10-28T11:29:58Z
+ UMR_AMAP
+ ALL
+
+
+
+ INRA:Grapevine:2645Mtp1
+ https://doi.org/10.15454/05J2EE
+ GnpIS
+ Portail Data Inra
+ Abstract:Moudjouretouli is a Grapevine accession from GnpIS.
+ Genetic Resource
+ English
+ 2017-05-08
+ Rinnova
+ Physical Object
+
+
+
+ MToxMDB8Mjp8Mzp8NDp8NTpvYWlfZGM=
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 72dfb9b..ff51ccc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,7 @@
catalogue-plugin-framework
gCat-Controller
test-commons
+ oai-harvester