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 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 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