convert to index format and tests

This commit is contained in:
Michele Artini 2021-06-25 12:59:20 +02:00
parent b92e18171f
commit 707588d69d
18 changed files with 420 additions and 315 deletions

View File

@ -23,6 +23,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
@ -35,7 +40,18 @@
<groupId>eu.dnetlib.dhp</groupId>
<artifactId>dhp-schemas</artifactId>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
<exclusions>
<exclusion>
<artifactId>antlr</artifactId>
<groupId>antlr</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- hot swapping, disable cache for template, enable live reload -->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@ -1,5 +1,8 @@
package eu.dnetlib.openaire.directindex;
import java.util.Properties;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -50,4 +53,15 @@ public class DirectIndexApplication extends AbstractDnetApp {
return ISLookupClientFactory.getLookUpService(isLookupUrl);
}
@Bean
public VelocityEngine velocityEngine() {
final Properties props = new Properties();
props.setProperty("resource.loader", "class");
props.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
final VelocityEngine ve = new VelocityEngine();
ve.init(props);
return ve;
}
}

View File

@ -66,7 +66,7 @@ public class ISLookupClient {
}
@Cacheable("vocabularies")
public Map<String, String> findVocabulary(final String voc) throws Exception {
public Map<String, String> findVocabulary(final String voc) throws DirectIndexApiException {
final String query = "collection('/db/DRIVER/VocabularyDSResources/VocabularyDSResourceType')[.//VOCABULARY_NAME/@code='" + voc
+ "']//TERM/concat(@code, ' @@@ ', @english_name)";
@ -81,7 +81,7 @@ public class ISLookupClient {
}
@Cacheable("contexts")
public Map<String, String> findContexts() throws Exception {
public Map<String, String> findContexts() throws DirectIndexApiException {
final String query =
"collection('/db/DRIVER/ContextDSResources/ContextDSResourceType')[.//context/@type='community' or .//context/@type='ri']//*[name()='context' or name()='category' or name()='concept']/concat(@id, ' @@@ ', @label)";
@ -105,7 +105,7 @@ public class ISLookupClient {
log.info("Evicting indexDsInfo cache");
}
public String findOne(final String query) throws DirectIndexApiException {
private String findOne(final String query) throws DirectIndexApiException {
try {
return lookupService.getResourceProfileByQuery(query);
} catch (final ISLookUpException e) {
@ -114,7 +114,7 @@ public class ISLookupClient {
}
}
public List<String> find(final String query) throws DirectIndexApiException {
private List<String> find(final String query) throws DirectIndexApiException {
try {
return lookupService.quickSearchProfile(query);
} catch (final ISLookUpException e) {

View File

@ -1,7 +1,15 @@
package eu.dnetlib.openaire.directindex.mapping;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.function.Function;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@ -26,10 +34,51 @@ public class XmlRecordConverter {
@Autowired
private ISLookupClient isLookupClient;
public String convert(final ResultEntry r) {
// TODO Auto-generated method stub
// It should produce an XML
return null;
@Autowired
private VelocityEngine velocityEngine;
public String convert(final ResultEntry r) throws DirectIndexApiException {
if (StringUtils.isBlank(r.getOriginalId()) && StringUtils.isBlank(r.getOpenaireId())) {
throw new DirectIndexApiException("One of the following fields is required: originalId or openaireId");
}
if (StringUtils.isBlank(r.getTitle())) { throw new DirectIndexApiException("A required field is missing: title"); }
if (StringUtils.isBlank(r.getUrl())) { throw new DirectIndexApiException("A required field is missing: url"); }
if (StringUtils.isBlank(r.getAccessRightCode())) { throw new DirectIndexApiException("A required field is missing: accessRightCode"); }
if (StringUtils.isBlank(r.getResourceType())) { throw new DirectIndexApiException("A required field is missing: resourceType"); }
if (StringUtils.isBlank(r.getCollectedFromId())) { throw new DirectIndexApiException("A required field is missing: collectedFromId"); }
if (StringUtils.isBlank(r.getType())) { throw new DirectIndexApiException("A required field is missing: type"); }
final DatasourceEntry collectedFromEntry = getDatasourceInfo(r.getCollectedFromId());
final DatasourceEntry hostedByEntry = getDatasourceInfo(r.getHostedById());
if (StringUtils.isBlank(r.getOpenaireId())) {
r.setOpenaireId(calculateOpenaireId(r.getOriginalId(), collectedFromEntry));
}
if (!r.getOpenaireId().matches("^\\w{12}::\\w{32}$")) {
throw new DirectIndexApiException("Invalid openaireId: " + r.getOpenaireId() + " - regex ^\\w{12}::\\w{32}$ not matched");
}
final VelocityContext vc = new VelocityContext();
vc.put("esc", (Function<String, String>) s -> StringEscapeUtils.escapeXml11(s));
vc.put("util", new OpenAIRESubmitterUtils(community_api));
vc.put("pub", r);
vc.put("objIdentifier", r.getOpenaireId());
vc.put("oafSchemaLocation", oafSchemaLocation);
vc.put("resultTypes", isLookupClient.findVocabulary("dnet:result_typologies"));
vc.put("rights", isLookupClient.findVocabulary("dnet:access_modes"));
vc.put("resourceTypes", isLookupClient.findVocabulary("dnet:publication_resource"));
vc.put("pidTypes", isLookupClient.findVocabulary("dnet:pid_types"));
vc.put("languages", isLookupClient.findVocabulary("dnet:languages"));
vc.put("contexts", isLookupClient.findContexts());
vc.put("dateOfCollection", new SimpleDateFormat("yyyy-MM-dd\'T\'hh:mm:ss\'Z\'").format(new Date()));
vc.put("collectedFrom", collectedFromEntry);
vc.put("hostedBy", hostedByEntry);
final StringWriter sw = new StringWriter();
velocityEngine.getTemplate("/templates/indexRecord.xml.vm", "UTF-8").merge(vc, sw);
return sw.toString();
}
public String calculateOpenaireId(final String originalId, final String collectedFromId) throws DirectIndexApiException {
@ -44,57 +93,6 @@ public class XmlRecordConverter {
return StringUtils.isNotBlank(dsId) ? isLookupClient.findDatasource(dsId) : UNKNOWN_REPO;
}
// public String asOafRecord(final VelocityEngine ve,
// final ISisLookupClient isLookupClient,
// final String oafSchemaLocation,
// final String community_api) throws Exception {
//
// if (StringUtils.isBlank(getOriginalId())
// && StringUtils
// .isBlank(getOpenaireId())) {
// throw new DirectIndexApiException("One of the following fields is required: originalId or openaireId");
// }
// if (StringUtils.isBlank(getTitle())) { throw new DirectIndexApiException("A required field is missing: title"); }
// if (StringUtils.isBlank(getUrl())) { throw new DirectIndexApiException("A required field is missing: url"); }
// if (StringUtils.isBlank(getLicenseCode()) && StringUtils.isBlank(getAccessRightCode())) {
// throw new DirectIndexApiException("A required field is missing: accessRightCode");
// }
// if (StringUtils.isBlank(getResourceType())) { throw new DirectIndexApiException("A required field is missing: resourceType"); }
// if (StringUtils.isBlank(getCollectedFromId())) { throw new DirectIndexApiException("A required field is missing: collectedFromId"); }
// if (StringUtils.isBlank(getType())) { throw new DirectIndexApiException("A required field is missing: type"); }
//
// final DatasourceEntry collectedFromEntry = getDatasourceInfo(collectedFromId, lookupClient);
// final DatasourceEntry hostedByEntry = getDatasourceInfo(hostedById, lookupClient);
//
// if (StringUtils.isBlank(openaireId)) {
// setOpenaireId(calculateOpenaireId(originalId, collectedFromEntry));
// }
//
// if (!openaireId
// .matches("^\\w{12}::\\w{32}$")) {
// throw new DirectIndexApiException(
// "Invalid openaireId: " + openaireId + " - regex ^\\w{12}::\\w{32}$ not matched");
// }
//
// final Map<String, Object> model = new HashMap<>();
// model.put("esc", new EscapeXml());
// model.put("util", new OpenAIRESubmitterUtils(community_api));
// model.put("pub", this);
// model.put("objIdentifier", getOpenaireId());
// model.put("oafSchemaLocation", oafSchemaLocation);
// model.put("resultTypes", getVocabulary("dnet:result_typologies", lookupClient));
// model.put("rights", getVocabulary("dnet:access_modes", lookupClient));
// model.put("resourceTypes", getVocabulary("dnet:publication_resource", lookupClient));
// model.put("pidTypes", getVocabulary("dnet:pid_types", lookupClient));
// model.put("languages", getVocabulary("dnet:languages", lookupClient));
// model.put("contexts", getContexts(lookupClient));
// model.put("dateOfCollection", new SimpleDateFormat("yyyy-MM-dd\'T\'hh:mm:ss\'Z\'").format(new Date()));
// model.put("collectedFrom", collectedFromEntry);
// model.put("hostedBy", hostedByEntry);
//
// return VelocityEngineUtils.mergeTemplateIntoString(ve, "/eu/dnetlib/openaire/directindex/indexRecord.xml.vm", "UTF-8", model);
// }
protected String getCommunity_api() {
return community_api;
}
@ -119,4 +117,12 @@ public class XmlRecordConverter {
this.isLookupClient = isLookupClient;
}
protected VelocityEngine getVelocityEngine() {
return velocityEngine;
}
protected void setVelocityEngine(final VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
}

View File

@ -65,7 +65,14 @@ public class ScheduledActions {
}
})
.filter(Objects::nonNull)
.map(xmlRecordConverter::convert)
.map(t -> {
try {
return xmlRecordConverter.convert(t);
} catch (final DirectIndexApiException e) {
log.error("Error generating record for index: " + t, e);
return null;
}
})
.filter(StringUtils::isNotBlank));
solr.commit();

View File

@ -1,37 +1,41 @@
package eu.dnetlib.openaire.directindex.mapping;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.StringEscapeUtils;
import org.apache.velocity.app.VelocityEngine;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.jupiter.api.Disabled;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.dnetlib.openaire.directindex.DirectIndexApiException;
import eu.dnetlib.openaire.directindex.input.DatasourceEntry;
import eu.dnetlib.openaire.directindex.input.PidEntry;
import eu.dnetlib.openaire.directindex.input.ResultEntry;
import eu.dnetlib.openaire.directindex.is.ISLookupClient;
import eu.dnetlib.openaire.directindex.mapping.XmlRecordConverter;
@Deprecated
@Disabled
@Ignore
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
public class XmlRecordConverterTest {
// private VelocityEngine ve;
@ -44,40 +48,53 @@ public class XmlRecordConverterTest {
// Class Under Test
private XmlRecordConverter xmlRecordConverter;
@Before
@BeforeEach
public void setUp() throws Exception {
final VelocityEngine ve = new VelocityEngine();
final Properties props = new Properties();
props.setProperty("resource.loader", "class");
props.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
ve.init(props);
xmlRecordConverter = new XmlRecordConverter();
xmlRecordConverter.setCommunity_api(community_api);
xmlRecordConverter.setOafSchemaLocation("http://oaf/oaf.xsd");
xmlRecordConverter.setIsLookupClient(isLookupClient);
xmlRecordConverter.setVelocityEngine(ve);
// final Properties props = new Properties();
// props.setProperty("resource.loader", "class");
// props.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// props.setProperty("runtime.log.logsystem.class", "org.apache.velocity.runtime.log.Log4JLogChute");
when(isLookupClient.find(anyString())).thenAnswer(invocation -> {
when(isLookupClient.findVocabulary(anyString())).thenAnswer(invocation -> {
final String query = invocation.getArguments()[0].toString();
if (query.contains("dnet:result_typologies")) {
return Arrays.asList("publication @@@ publication", "dataset @@@ dataset", "software @@@ software", "other @@@ other");
return asMap("publication @@@ publication", "dataset @@@ dataset", "software @@@ software", "other @@@ other");
} else if (query.contains("dnet:access_modes")) {
return Arrays.asList("OPEN @@@ Open Access");
return asMap("OPEN @@@ Open Access");
} else if (query.contains("dnet:publication_resource")) {
return Arrays.asList("0001 @@@ Journal Article");
return asMap("0001 @@@ Journal Article");
} else if (query.contains("dnet:pid_types")) {
return Arrays.asList("oai @@@ Open Archive Initiative", "doi @@@ Digital object identifier");
return asMap("oai @@@ Open Archive Initiative", "doi @@@ Digital object identifier");
} else if (query.contains("dnet:languages")) {
return Arrays.asList("ita @@@ Italian");
} else if (query.contains("ContextDSResourceType")) {
return Arrays
.asList("egi::classification::natsc::math::stats @@@ Statistics and Probability", "egi::classification::natsc::math::pure @@@ Pure Mathematics", "egi::classification::natsc::math @@@ Mathematics", "egi::classification::natsc @@@ Natural Sciences", "egi::classification @@@ EGI classification scheme", "egi @@@ EGI", "enermaps::selection @@@ Selected by the H2020 EnerMaps project");
return asMap("ita @@@ Italian");
} else {
return new ArrayList<String>();
return new HashMap<String, String>();
}
});
when(isLookupClient.findOne(anyString())).thenAnswer(invocation -> "REPO NAME @@@ repo________");
when(isLookupClient.findContexts())
.thenAnswer(invocation -> asMap("egi::classification::natsc::math::stats @@@ Statistics and Probability", "egi::classification::natsc::math::pure @@@ Pure Mathematics", "egi::classification::natsc::math @@@ Mathematics", "egi::classification::natsc @@@ Natural Sciences", "egi::classification @@@ EGI classification scheme", "egi @@@ EGI", "enermaps::selection @@@ Selected by the H2020 EnerMaps project"));
when(isLookupClient.findDatasource(anyString()))
.thenAnswer(invocation -> new DatasourceEntry(invocation.getArguments()[0].toString(), "REPO NAME", "repo________"));
}
private Map<String, String> asMap(final String... arr) {
return Arrays
.stream(arr)
.collect(Collectors.toMap(s -> StringUtils.substringBefore(s, "@@@").trim(), s -> StringUtils.substringAfter(s, "@@@").trim()));
}
@Test
@ -103,6 +120,7 @@ public class XmlRecordConverterTest {
pub.getContexts().add("egi::classification::natsc::math::stats");
pub.getContexts().add("enermaps");
pub.getContexts().add("enermaps::selection");
pub.setAccessRightCode("OPEN");
final String xml = xmlRecordConverter.convert(pub);
final Document doc = new SAXReader().read(new StringReader(xml));
@ -212,11 +230,9 @@ public class XmlRecordConverterTest {
}
@Test(expected = DirectIndexApiException.class)
@Test
public void testAsIndexRecord_wrongOpenaireId() throws Exception {
testAsIndexRecord_json("test_record_wrong_openaireId.json");
assertThrows(DirectIndexApiException.class, () -> testAsIndexRecord_json("test_record_wrong_openaireId.json"));
}
@Test
@ -249,7 +265,7 @@ public class XmlRecordConverterTest {
private void testAsIndexRecord_json(final String filename) throws Exception {
final ResultEntry pub =
new ObjectMapper().readValue(getClass().getResourceAsStream(filename), ResultEntry.class);
new ObjectMapper().readValue(getClass().getResourceAsStream("/samples/" + filename), ResultEntry.class);
final String xml = xmlRecordConverter.convert(pub);
// System.out.println(xml);

View File

@ -1,35 +1,35 @@
{
"originalId": "ORIG_ID_12345",
"title": "TEST TITLE",
"authors": [
"Michele Artini",
"Claudio Atzori",
"Alessia Bardi"
],
"publisher": "Test publisher",
"description": "DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION",
"language": "ita",
"pids": [
{
"type": "doi",
"value": "10.000/xyz-123"
},
{
"type": "oai",
"value": "oai:1234"
}
],
"accessRightCode": "OPEN",
"resourceType": "0001",
"url": "http://test.it/xyz",
"collectedFromId": "opendoar____::2659",
"hostedById": "opendoar____::2367",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/FP7/283595/EU//OpenAIREplus",
"info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble"
],
"contexts": [
"egi::classification::natsc::math::pure",
"egi::classification::natsc::math::stats"
]
"originalId": "ORIG_ID_12345",
"title": "TEST TITLE",
"authors": [
"Michele Artini",
"Claudio Atzori",
"Alessia Bardi"
],
"publisher": "Test publisher",
"description": "DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION",
"language": "ita",
"pids": [
{
"type": "doi",
"value": "10.000/xyz-123"
},
{
"type": "oai",
"value": "oai:1234"
}
],
"accessRightCode": "OPEN",
"resourceType": "0001",
"url": "http://test.it/xyz",
"collectedFromId": "opendoar____::2659",
"hostedById": "opendoar____::2367",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/FP7/283595/EU//OpenAIREplus",
"info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble"
],
"contexts": [
"egi::classification::natsc::math::pure",
"egi::classification::natsc::math::stats"
]
}

View File

@ -11,11 +11,11 @@
"Faaborg, Ida Selvejer",
"Kruse, Mikkel"
],
"accessRightCode" : "OPEN",
"publisher": "",
"description": "The following paper is a project on the autofictional book Færdig med Eddy Bellegueule by Édouard Louis (2015). The main focus is to ascertain how the novel is an expression of the authors effort to connect social life and literature, and what part autofiction as a genre plays in this process. A textual analysis will describe the narrators position, and the aesthetic grip of the novel. Furthermore, we will analyze the central themes in Louis novel with theories by sociologist Pierre Bourdieu, gender theorist Judith Butler and postcolonial theorist Gayatri Spivak. This includes symbolic violence, gender roles, language and suppression. With use of classic literary theory and the more recent and specific theory on autofiction, the paper concludes, that Færdig med Eddy Bellegueule is based on non-fictional events, but presents these events through a fictionalization that raise the story into a literary work of art. The genre autofiction encircles a current tendency to blend non-fictional events and characters into literature, and Færdig med Eddy Bellegueule writes itself perfectly into this twilight zone between fact and fiction.",
"language": "eng",
"pids": [],
"licenseCode": "OPEN",
"resourceType": "0006",
"url": "http://rudar.ruc.dk/handle/1800/24690",
"collectedFromId": "opendoar____::278",

View File

@ -22,7 +22,6 @@
}
],
"accessRightCode": "EMBARGO",
"licenseCode": "OPEN",
"embargoEndDate": "2018-02-02",
"resourceType": "0001",
"url": "http://test.it/xyz",

View File

@ -1,21 +1,21 @@
{
"openaireId":"od_______278::d5b39693ac6c2197e8cf48008a982951",
"originalId": "oai:rudar.ruc.dk:1800/24691",
"type": "other",
"title": "Other test record",
"authors": [
"Sloan, Patrick Alexander Raaby",
"Strange, Gustav Valdemar"
],
"publisher": "",
"description": "This is for testing software",
"language": "eng",
"pids": [],
"licenseCode": "OPEN SOURCE",
"resourceType": "0000",
"url": "http://rudar.ruc.dk/handle/1800/24691",
"collectedFromId": "opendoar____::278",
"hostedById": "opendoar____::278",
"linksToProjects": [],
"contexts": []
"openaireId": "od_______278::d5b39693ac6c2197e8cf48008a982951",
"originalId": "oai:rudar.ruc.dk:1800/24691",
"type": "other",
"title": "Other test record",
"authors": [
"Sloan, Patrick Alexander Raaby",
"Strange, Gustav Valdemar"
],
"accessRightCode": "OPEN",
"publisher": "",
"description": "This is for testing software",
"language": "eng",
"pids": [],
"resourceType": "0000",
"url": "http://rudar.ruc.dk/handle/1800/24691",
"collectedFromId": "opendoar____::278",
"hostedById": "opendoar____::278",
"linksToProjects": [],
"contexts": []
}

View File

@ -1,21 +1,21 @@
{
"openaireId":"od_______278::d5b39693ac6c2197e8cf48008a982951",
"originalId": "oai:rudar.ruc.dk:1800/24691",
"type": "software",
"title": "Software test",
"authors": [
"Sloan, Patrick Alexander Raaby",
"Strange, Gustav Valdemar"
],
"publisher": "",
"description": "This is for testing software",
"language": "eng",
"pids": [],
"licenseCode": "OPEN SOURCE",
"resourceType": "0000",
"url": "http://rudar.ruc.dk/handle/1800/24691",
"collectedFromId": "opendoar____::278",
"hostedById": "opendoar____::278",
"linksToProjects": [],
"contexts": []
"openaireId": "od_______278::d5b39693ac6c2197e8cf48008a982951",
"originalId": "oai:rudar.ruc.dk:1800/24691",
"type": "software",
"title": "Software test",
"authors": [
"Sloan, Patrick Alexander Raaby",
"Strange, Gustav Valdemar"
],
"accessRightCode": "OPEN",
"publisher": "",
"description": "This is for testing software",
"language": "eng",
"pids": [],
"resourceType": "0000",
"url": "http://rudar.ruc.dk/handle/1800/24691",
"collectedFromId": "opendoar____::278",
"hostedById": "opendoar____::278",
"linksToProjects": [],
"contexts": []
}

View File

@ -1,29 +1,29 @@
{
"originalId": "ORIG_ID_12345",
"title": "TEST TITLE WITH Greek Characters",
"authors": [
"αβγδεζηθικλμ νξοπρσςτυφχψω",
"ΑΒΓΔΕΖΗΘΙΚΛ ΜΝΞΟΠΡΣΤΥΦΧΨΩ"
],
"publisher": "âââââââ",
"description": "Αν περιμένατε να βρίσκεται εδώ μια σελίδα και δεν υπάρχει, η σελίδα μπορεί να μην εμφανίζεται λόγω καθυστέρησης στην ανανέωση της βάσης δεδομένων, ή μπορεί να έχει διαγραφεί. (Δείτε την γρήγορη διαγραφή σελίδων για πιθανούς λόγους). Μπορείτε να δοκιμάστε την λειτουργία εκκαθάρισης, και να ελέγξετε το αρχείο διαγραφών.",
"language": "ell",
"pids": [
{
"type": "doi",
"value": "10.000/xyz-123-gr"
}
],
"licenseCode": "EMBARGO",
"embargoEndDate": "2018-02-02",
"resourceType": "0001",
"url": "http://test.it/xyz",
"collectedFromId": "opendoar____::2659",
"hostedById": "opendoar____::2367",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/FP7/123456/EU//Test"
],
"contexts": [
"egi::classification::natsc::math::stats"
]
"originalId": "ORIG_ID_12345",
"title": "TEST TITLE WITH Greek Characters",
"authors": [
"αβγδεζηθικλμ νξοπρσςτυφχψω",
"ΑΒΓΔΕΖΗΘΙΚΛ ΜΝΞΟΠΡΣΤΥΦΧΨΩ"
],
"publisher": "âââââââ",
"description": "Αν περιμένατε να βρίσκεται εδώ μια σελίδα και δεν υπάρχει, η σελίδα μπορεί να μην εμφανίζεται λόγω καθυστέρησης στην ανανέωση της βάσης δεδομένων, ή μπορεί να έχει διαγραφεί. (Δείτε την γρήγορη διαγραφή σελίδων για πιθανούς λόγους). Μπορείτε να δοκιμάστε την λειτουργία εκκαθάρισης, και να ελέγξετε το αρχείο διαγραφών.",
"language": "ell",
"pids": [
{
"type": "doi",
"value": "10.000/xyz-123-gr"
}
],
"accessRightCode": "EMBARGO",
"embargoEndDate": "2018-02-02",
"resourceType": "0001",
"url": "http://test.it/xyz",
"collectedFromId": "opendoar____::2659",
"hostedById": "opendoar____::2367",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/FP7/123456/EU//Test"
],
"contexts": [
"egi::classification::natsc::math::stats"
]
}

View File

@ -1,38 +1,38 @@
{
"openaireId":"dedup_wf_001::ab42e811",
"originalId": "ORIG_ID_TEST",
"type": "publication",
"title": "TEST TITLE",
"authors": [
"Michele Artini",
"Claudio Atzori",
"Alessia Bardi"
],
"publisher": "Test publisher",
"description": "DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION",
"language": "ita",
"pids": [
{
"type": "doi",
"value": "10.000/xyz-123"
},
{
"type": "oai",
"value": "oai:1234"
}
],
"licenseCode": "EMBARGO",
"embargoEndDate": "2018-02-02",
"resourceType": "0001",
"url": "http://test.it/xyz",
"collectedFromId": "opendoar____::2659",
"hostedById": "opendoar____::2659",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/FP7/283595/EU//OpenAIREplus",
"info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble"
],
"contexts": [
"egi::classification::natsc::math::pure",
"egi::classification::natsc::math::stats"
]
"openaireId": "dedup_wf_001::ab42e811",
"originalId": "ORIG_ID_TEST",
"type": "publication",
"title": "TEST TITLE",
"authors": [
"Michele Artini",
"Claudio Atzori",
"Alessia Bardi"
],
"publisher": "Test publisher",
"description": "DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION",
"language": "ita",
"pids": [
{
"type": "doi",
"value": "10.000/xyz-123"
},
{
"type": "oai",
"value": "oai:1234"
}
],
"accessRightCode": "EMBARGO",
"embargoEndDate": "2018-02-02",
"resourceType": "0001",
"url": "http://test.it/xyz",
"collectedFromId": "opendoar____::2659",
"hostedById": "opendoar____::2659",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/FP7/283595/EU//OpenAIREplus",
"info:eu-repo/grantAgreement/EC/FP7/244909/EU/Making Capabilities Work/WorkAble"
],
"contexts": [
"egi::classification::natsc::math::pure",
"egi::classification::natsc::math::stats"
]
}

View File

@ -1,26 +1,26 @@
{
"authors":[
"Alouges, Fran\u00e7ois",
"Di Fratta, Giovanni"
],
"collectedFromId":"opendoar____::2659",
"description":"The paper is about the parking 3-sphere swimmer ($\\text{sPr}_3$). This is a low-Reynolds number model swimmer composed of three balls of equal radii. The three balls can move along three horizontal axes (supported in the same plane) that mutually meet at the center of $\\text{sPr}_3$ with angles of $120^{\u2218}$ . The governing dynamical system is introduced and the implications of its geometric symmetries revealed. It is then shown that, in the first order range of small strokes, optimal periodic strokes are ellipses embedded in 3d space, i.e. closed curves of the form $t\ud835\udfc4 [0,2\u03c0] \u21a6 (\\cos t)u + (\\sin t)v$ for suitable orthogonal vectors $u$ and $v$ of $\u211d^3$. A simple analytic expression for the vectors $u$ and $v$ is derived. The results of the paper are used in a second article where the real physical dynamics of $\\text{sPr}_3$ is analyzed in the asymptotic range of very long arms. ; Comment: 17 pages, 4 figures",
"hostedById":"opendoar____::2659",
"licenseCode":"OPEN",
"originalId":"oai:zenodo.org:996201",
"pids":[
{
"type":"oai",
"value":"oai:zenodo.org:996201"
},
{
"type":"doi",
"value":"10.5281/zenodo.996201"
}
],
"publisher":"Zenodo",
"resourceType":"0020",
"title":"Parking 3-sphere swimmer. I. Energy minimizing strokes",
"type":"publication",
"url":"https://zenodo.org/record/996201"
"authors": [
"Alouges, Fran\u00e7ois",
"Di Fratta, Giovanni"
],
"collectedFromId": "opendoar____::2659",
"description": "The paper is about the parking 3-sphere swimmer ($\\text{sPr}_3$). This is a low-Reynolds number model swimmer composed of three balls of equal radii. The three balls can move along three horizontal axes (supported in the same plane) that mutually meet at the center of $\\text{sPr}_3$ with angles of $120^{\u2218}$ . The governing dynamical system is introduced and the implications of its geometric symmetries revealed. It is then shown that, in the first order range of small strokes, optimal periodic strokes are ellipses embedded in 3d space, i.e. closed curves of the form $t\ud835\udfc4 [0,2\u03c0] \u21a6 (\\cos t)u + (\\sin t)v$ for suitable orthogonal vectors $u$ and $v$ of $\u211d^3$. A simple analytic expression for the vectors $u$ and $v$ is derived. The results of the paper are used in a second article where the real physical dynamics of $\\text{sPr}_3$ is analyzed in the asymptotic range of very long arms. ; Comment: 17 pages, 4 figures",
"hostedById": "opendoar____::2659",
"originalId": "oai:zenodo.org:996201",
"pids": [
{
"type": "oai",
"value": "oai:zenodo.org:996201"
},
{
"type": "doi",
"value": "10.5281/zenodo.996201"
}
],
"accessRightCode": "OPEN",
"publisher": "Zenodo",
"resourceType": "0020",
"title": "Parking 3-sphere swimmer. I. Energy minimizing strokes",
"type": "publication",
"url": "https://zenodo.org/record/996201"
}

View File

@ -1,27 +1,29 @@
{
"authors": [
"Conradt, Tobias",
"& members of the ISIMIP project (original data provision), cf. Hempel et al. 2013, https://doi.org/10.5194/esd-4-219-2013"
],
"collectedFromId": "re3data_____::r3d100010468",
"description": "<p>ISIMIP-2a climate data cutout provided for Sardinia in the framework of SIM4NEXUS & X<\/p>",
"hostedById": "re3data_____::r3d100010468",
"licenseCode": "OPEN",
"linksToProjects": ["info:eu-repo/grantAgreement/EC/H2020/689150//Sustainable Integrated Management FOR the NEXUS of water-land-food-energy-climate for a resource-efficient Europe & beyond/SIM4NEXUS"],
"originalId": "10.5281/zenodo.1460665",
"pids": [
{
"type": "oai",
"value": "oai:zenodo.org:1460665"
},
{
"type": "doi",
"value": "10.5281/zenodo.1460665"
}
],
"publisher": "Zenodo & Zenodo",
"resourceType": "0021",
"title": "sardinia_tasmax_MIROC-ESM-CHEM_rcp4p5_2006-2099_daily.nc4 & the title has && in it",
"type": "dataset",
"url": "https://zenodo.org/record/1460665"
"authors": [
"Conradt, Tobias",
"& members of the ISIMIP project (original data provision), cf. Hempel et al. 2013, https://doi.org/10.5194/esd-4-219-2013"
],
"collectedFromId": "re3data_____::r3d100010468",
"description": "<p>ISIMIP-2a climate data cutout provided for Sardinia in the framework of SIM4NEXUS & X<\/p>",
"hostedById": "re3data_____::r3d100010468",
"linksToProjects": [
"info:eu-repo/grantAgreement/EC/H2020/689150//Sustainable Integrated Management FOR the NEXUS of water-land-food-energy-climate for a resource-efficient Europe & beyond/SIM4NEXUS"
],
"accessRightCode": "OPEN",
"originalId": "10.5281/zenodo.1460665",
"pids": [
{
"type": "oai",
"value": "oai:zenodo.org:1460665"
},
{
"type": "doi",
"value": "10.5281/zenodo.1460665"
}
],
"publisher": "Zenodo & Zenodo",
"resourceType": "0021",
"title": "sardinia_tasmax_MIROC-ESM-CHEM_rcp4p5_2006-2099_daily.nc4 & the title has && in it",
"type": "dataset",
"url": "https://zenodo.org/record/1460665"
}

View File

@ -1,14 +1,30 @@
{"authors": ["Dag Haug", "Marius J\xf8hndal"],
"collectedFromId": "re3data_____::r3d100010468",
"contexts": ["https://sandbox.zenodo.org/communities/oac-ni","pippo"],
"description": "<p>Official releases of the PROIEL treebank of ancient Indo-European languages</p>",
"hostedById": "re3data_____::r3d100010468",
"licenseCode": "OPEN",
"originalId": "10.5281/zenodo.11003",
"pids": [{"type": "oai", "value": "oai:zenodo.org:11003"},
{"type": "doi", "value": "10.5281/zenodo.11003"}],
"publisher": "Zenodo",
"resourceType": "0021",
"title": "proiel-treebank: 20140723 version",
"type": "dataset",
"url": "https://zenodo.org/record/11003"}
{
"authors": [
"Dag Haug",
"Marius Jhndal"
],
"collectedFromId": "re3data_____::r3d100010468",
"contexts": [
"https://sandbox.zenodo.org/communities/oac-ni",
"pippo"
],
"accessRightCode": "OPEN",
"description": "<p>Official releases of the PROIEL treebank of ancient Indo-European languages</p>",
"hostedById": "re3data_____::r3d100010468",
"originalId": "10.5281/zenodo.11003",
"pids": [
{
"type": "oai",
"value": "oai:zenodo.org:11003"
},
{
"type": "doi",
"value": "10.5281/zenodo.11003"
}
],
"publisher": "Zenodo",
"resourceType": "0021",
"title": "proiel-treebank: 20140723 version",
"type": "dataset",
"url": "https://zenodo.org/record/11003"
}

View File

@ -1,9 +1,27 @@
{"authors":["test"],
"collectedFromId":"re3data_____::r3d100010468",
"contexts":["https://zenodo.org/communities/oac-ni"],
"description":"<p>test</p>",
"hostedById":"re3data_____::r3d100010468",
"licenseCode":"OPEN",
"originalId":"oai:zenodo.org:315784",
"pids":[{"type":"oai","value":"oai:zenodo.org:315784"},
{"type":"doi","value":"10.5072/zenodo.315784"}],"resourceType":"0020","title":"test","type":"other","url":"https://zenodo.org/record/315784"}
{
"authors": [
"test"
],
"collectedFromId": "re3data_____::r3d100010468",
"contexts": [
"https://zenodo.org/communities/oac-ni"
],
"description": "<p>test</p>",
"hostedById": "re3data_____::r3d100010468",
"originalId": "oai:zenodo.org:315784",
"accessRightCode": "OPEN",
"pids": [
{
"type": "oai",
"value": "oai:zenodo.org:315784"
},
{
"type": "doi",
"value": "10.5072/zenodo.315784"
}
],
"resourceType": "0020",
"title": "test",
"type": "other",
"url": "https://zenodo.org/record/315784"
}

View File

@ -1,18 +1,29 @@
{
"authors": ["Milanese, Alessio", "Mende, Daniel", "Zeller, Georg", "Sunagawa, Shinichi"],
"collectedFromId": "re3data_____::r3d100010468",
"description": "<p>We simulated ten human gut metagenomic samples to assess the taxonomic quantification accuracy of the mOTUs tool (<a href=\"http: \// motu-tool.org \/\">link</a>). In this directory you can find the metagenomic samples, the gold standard (used to produce them) and the profiles obtained with four metagenomic profiler tools.</p>\\n\\n<p>Check README.txt for more information.</p>",
"hostedById": "re3data_____::r3d100010468",
"licenseCode": "OPEN",
"originalId": "10.5281/zenodo.1473645",
"pids": [
{"type": "oai", "value": "oai:zenodo.org:1473645"},
{"type": "doi", "value": "10.5281/zenodo.1473645"}
],
"publisher": "Zenodo",
"resourceType": "0021",
"title": "Simulated Human gut metagenomic samples to benchmark mOTUs v2",
"type": "dataset",
"url": "https://zenodo.org/record/1473645",
"version": "2"
"authors": [
"Milanese, Alessio",
"Mende, Daniel",
"Zeller, Georg",
"Sunagawa, Shinichi"
],
"collectedFromId": "re3data_____::r3d100010468",
"description": "<p>We simulated ten human gut metagenomic samples to assess the taxonomic quantification accuracy of the mOTUs tool (<a href=\"http: \// motu-tool.org \/\">link</a>). In this directory you can find the metagenomic samples, the gold standard (used to produce them) and the profiles obtained with four metagenomic profiler tools.</p>\\n\\n<p>Check README.txt for more information.</p>",
"hostedById": "re3data_____::r3d100010468",
"originalId": "10.5281/zenodo.1473645",
"pids": [
{
"type": "oai",
"value": "oai:zenodo.org:1473645"
},
{
"type": "doi",
"value": "10.5281/zenodo.1473645"
}
],
"accessRightCode": "OPEN",
"publisher": "Zenodo",
"resourceType": "0021",
"title": "Simulated Human gut metagenomic samples to benchmark mOTUs v2",
"type": "dataset",
"url": "https://zenodo.org/record/1473645",
"version": "2"
}