created oai common module

This commit is contained in:
Michele Artini 2024-01-25 15:01:06 +01:00
parent 588cbab622
commit 0d96688176
25 changed files with 442 additions and 246 deletions

View File

@ -7,12 +7,12 @@ import org.springframework.boot.autoconfigure.domain.EntityScan;
import eu.dnetlib.common.app.AbstractDnetApp; import eu.dnetlib.common.app.AbstractDnetApp;
import eu.dnetlib.domain.oai.OaiConfiguration; import eu.dnetlib.domain.oai.OaiConfiguration;
import eu.dnetlib.domain.oai.OaiMetadataFormat; import eu.dnetlib.domain.oai.OaiMetadataFormat;
import eu.dnetlib.domain.oai.OaiRecord; import eu.dnetlib.domain.oai.ExportedOaiRecord;
import eu.dnetlib.domain.oai.OaiSet; import eu.dnetlib.domain.oai.ExportedOaiSet;
import eu.dnetlib.domain.service.ServiceType; import eu.dnetlib.domain.service.ServiceType;
@SpringBootApplication @SpringBootApplication
@EntityScan(basePackageClasses = { OaiConfiguration.class, OaiSet.class, OaiMetadataFormat.class, OaiRecord.class }) @EntityScan(basePackageClasses = { OaiConfiguration.class, ExportedOaiSet.class, OaiMetadataFormat.class, ExportedOaiRecord.class })
public class OaiApplication extends AbstractDnetApp { public class OaiApplication extends AbstractDnetApp {
public static void main(final String[] args) { public static void main(final String[] args) {

View File

@ -11,9 +11,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import eu.dnetlib.common.controller.DnetRestController; import eu.dnetlib.common.controller.DnetRestController;
import eu.dnetlib.domain.oai.ExportedOaiMetadataFormat;
import eu.dnetlib.domain.oai.ExportedOaiSet;
import eu.dnetlib.domain.oai.OaiConfiguration; import eu.dnetlib.domain.oai.OaiConfiguration;
import eu.dnetlib.domain.oai.OaiMetadataFormat;
import eu.dnetlib.domain.oai.OaiSet;
import eu.dnetlib.errors.DnetException; import eu.dnetlib.errors.DnetException;
import eu.dnetlib.services.oai.service.OaiService; import eu.dnetlib.services.oai.service.OaiService;
import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.parameters.RequestBody;
@ -27,45 +27,45 @@ public class ApiController extends DnetRestController {
@GetMapping("/conf") @GetMapping("/conf")
public OaiConfiguration oaiConfiguration() throws DnetException { public OaiConfiguration oaiConfiguration() throws DnetException {
return oaiService.oaiConfiguration(); return this.oaiService.oaiConfiguration();
} }
@PostMapping("/conf") @PostMapping("/conf")
public OaiConfiguration oaiConfiguration(@RequestBody final OaiConfiguration conf) throws DnetException { public OaiConfiguration oaiConfiguration(@RequestBody final OaiConfiguration conf) throws DnetException {
return oaiService.oaiConfiguration(conf); return this.oaiService.oaiConfiguration(conf);
} }
@GetMapping("/md-formats") @GetMapping("/md-formats")
public List<OaiMetadataFormat> listMdFormats() throws DnetException { public List<ExportedOaiMetadataFormat> listMdFormats() throws DnetException {
return oaiService.listMetadataFormats(); return this.oaiService.listMetadataFormats();
} }
@PostMapping("/md-formats") @PostMapping("/md-formats")
public List<OaiMetadataFormat> addOrUpdateMdFormats(@RequestBody final OaiMetadataFormat mdFormat) throws DnetException { public List<ExportedOaiMetadataFormat> addOrUpdateMdFormats(@RequestBody final ExportedOaiMetadataFormat mdFormat) throws DnetException {
oaiService.addOrUpdateMetadataFormat(mdFormat); this.oaiService.addOrUpdateMetadataFormat(mdFormat);
return oaiService.listMetadataFormats(); return this.oaiService.listMetadataFormats();
} }
@DeleteMapping("/md-formats/{mdprefix}") @DeleteMapping("/md-formats/{mdprefix}")
public List<OaiMetadataFormat> deleteMdFormats(@PathVariable final String mdprefix) throws DnetException { public List<ExportedOaiMetadataFormat> deleteMdFormats(@PathVariable final String mdprefix) throws DnetException {
oaiService.deleteMetadataFormat(mdprefix); this.oaiService.deleteMetadataFormat(mdprefix);
return oaiService.listMetadataFormats(); return this.oaiService.listMetadataFormats();
} }
@GetMapping("/sets") @GetMapping("/sets")
public List<OaiSet> listOaiSets() throws DnetException { public List<ExportedOaiSet> listOaiSets() throws DnetException {
return oaiService.listSets(); return this.oaiService.listSets();
} }
@PostMapping("/sets") @PostMapping("/sets")
public List<OaiSet> addOrUpdateOaiSet(@RequestBody final OaiSet oaiSet) throws DnetException { public List<ExportedOaiSet> addOrUpdateOaiSet(@RequestBody final ExportedOaiSet oaiSet) throws DnetException {
oaiService.addOrUpdateSet(oaiSet); this.oaiService.addOrUpdateSet(oaiSet);
return oaiService.listSets(); return this.oaiService.listSets();
} }
@DeleteMapping("/sets/{setSpec}") @DeleteMapping("/sets/{setSpec}")
public List<OaiSet> deleteOaiSet(@PathVariable final String setSpec) throws DnetException { public List<ExportedOaiSet> deleteOaiSet(@PathVariable final String setSpec) throws DnetException {
oaiService.deleteSet(setSpec); this.oaiService.deleteSet(setSpec);
return oaiService.listSets(); return this.oaiService.listSets();
} }
} }

View File

@ -23,10 +23,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import eu.dnetlib.domain.oai.ExportedOaiMetadataFormat;
import eu.dnetlib.domain.oai.ExportedOaiRecord;
import eu.dnetlib.domain.oai.ExportedOaiSet;
import eu.dnetlib.domain.oai.OaiConfiguration; import eu.dnetlib.domain.oai.OaiConfiguration;
import eu.dnetlib.domain.oai.OaiMetadataFormat; import eu.dnetlib.domain.oai.OaiMetadataFormat;
import eu.dnetlib.domain.oai.OaiRecord;
import eu.dnetlib.domain.oai.OaiSet;
import eu.dnetlib.errors.DnetRuntimeException; import eu.dnetlib.errors.DnetRuntimeException;
import eu.dnetlib.services.oai.domain.OaiPage; import eu.dnetlib.services.oai.domain.OaiPage;
import eu.dnetlib.services.oai.service.OaiService; import eu.dnetlib.services.oai.service.OaiService;
@ -77,7 +78,7 @@ public class OaiController {
private String oaiIdentify(final Map<String, String> params) { private String oaiIdentify(final Map<String, String> params) {
if (!params.isEmpty()) { return prepareErrorResponseXml(OaiError.badArgument); } if (!params.isEmpty()) { return prepareErrorResponseXml(OaiError.badArgument); }
final OaiConfiguration conf = oaiService.oaiConfiguration(); final OaiConfiguration conf = this.oaiService.oaiConfiguration();
final Document doc = genericOaiResponse(OaiVerb.IDENTIFY.getVerb()); final Document doc = genericOaiResponse(OaiVerb.IDENTIFY.getVerb());
final Element dataNode = doc.getRootElement().addElement(OaiVerb.IDENTIFY.getVerb()); final Element dataNode = doc.getRootElement().addElement(OaiVerb.IDENTIFY.getVerb());
@ -100,7 +101,8 @@ public class OaiController {
final Document doc = genericOaiResponse(OaiVerb.LIST_METADATA_FORMATS.getVerb()); final Document doc = genericOaiResponse(OaiVerb.LIST_METADATA_FORMATS.getVerb());
final Element dataNode = doc.getRootElement().addElement(OaiVerb.LIST_METADATA_FORMATS.getVerb()); final Element dataNode = doc.getRootElement().addElement(OaiVerb.LIST_METADATA_FORMATS.getVerb());
final List<OaiMetadataFormat> formats = StringUtils.isBlank(id) ? oaiService.listMetadataFormats(id) : oaiService.listMetadataFormats(); final List<ExportedOaiMetadataFormat> formats =
StringUtils.isBlank(id) ? this.oaiService.listMetadataFormats(id) : this.oaiService.listMetadataFormats();
for (final OaiMetadataFormat oaiFormat : formats) { for (final OaiMetadataFormat oaiFormat : formats) {
final Element formatNode = dataNode.addElement("metadataFormat"); final Element formatNode = dataNode.addElement("metadataFormat");
@ -117,7 +119,7 @@ public class OaiController {
final Document doc = genericOaiResponse(OaiVerb.LIST_SETS.getVerb()); final Document doc = genericOaiResponse(OaiVerb.LIST_SETS.getVerb());
final Element dataNode = doc.getRootElement().addElement(OaiVerb.LIST_SETS.getVerb()); final Element dataNode = doc.getRootElement().addElement(OaiVerb.LIST_SETS.getVerb());
for (final OaiSet oaiSet : oaiService.listSets()) { for (final ExportedOaiSet oaiSet : this.oaiService.listSets()) {
final Element setNode = dataNode.addElement("set"); final Element setNode = dataNode.addElement("set");
setNode.addElement("setSpec").setText(oaiSet.getSetSpec()); setNode.addElement("setSpec").setText(oaiSet.getSetSpec());
setNode.addElement("setName").setText(oaiSet.getSetName()); setNode.addElement("setName").setText(oaiSet.getSetName());
@ -132,7 +134,7 @@ public class OaiController {
final String identifier = params.remove("identifier"); final String identifier = params.remove("identifier");
if (!params.isEmpty() || StringUtils.isAnyBlank(prefix, identifier)) { return prepareErrorResponseXml(OaiError.badArgument); } if (!params.isEmpty() || StringUtils.isAnyBlank(prefix, identifier)) { return prepareErrorResponseXml(OaiError.badArgument); }
final OaiRecord record = oaiService.getRecord(identifier, prefix); final ExportedOaiRecord record = this.oaiService.getRecord(identifier, prefix);
if (record == null) { return prepareErrorResponseXml(OaiError.idDoesNotExist); } if (record == null) { return prepareErrorResponseXml(OaiError.idDoesNotExist); }
final Document doc = genericOaiResponse(OaiVerb.GET_RECORD.getVerb()); final Document doc = genericOaiResponse(OaiVerb.GET_RECORD.getVerb());
@ -148,7 +150,7 @@ public class OaiController {
if (params.containsKey("resumptionToken")) { if (params.containsKey("resumptionToken")) {
final String resumptionToken = params.remove("resumptionToken"); final String resumptionToken = params.remove("resumptionToken");
if (!params.isEmpty()) { return prepareErrorResponseXml(OaiError.badArgument); } if (!params.isEmpty()) { return prepareErrorResponseXml(OaiError.badArgument); }
page = oaiService.listRecords(resumptionToken); page = this.oaiService.listRecords(resumptionToken);
} else { } else {
final String metadataPrefix = params.remove("metadataPrefix"); final String metadataPrefix = params.remove("metadataPrefix");
@ -156,8 +158,8 @@ public class OaiController {
final String until = params.remove("until"); final String until = params.remove("until");
final String set = params.remove("set"); final String set = params.remove("set");
if (!StringUtils.isNotBlank(metadataPrefix) || !oaiService.verifySet(set)) { return prepareErrorResponseXml(OaiError.badArgument); } if (!StringUtils.isNotBlank(metadataPrefix) || !this.oaiService.verifySet(set)) { return prepareErrorResponseXml(OaiError.badArgument); }
page = oaiService.listRecords(metadataPrefix, set, from, until); page = this.oaiService.listRecords(metadataPrefix, set, from, until);
} }
final Document doc = genericOaiResponse(OaiVerb.LIST_RECORDS.getVerb()); final Document doc = genericOaiResponse(OaiVerb.LIST_RECORDS.getVerb());
@ -170,7 +172,7 @@ public class OaiController {
return doc.asXML(); return doc.asXML();
} }
private void insertSingleRecord(final Element parentNode, final OaiRecord record) { private void insertSingleRecord(final Element parentNode, final ExportedOaiRecord record) {
final Element recordNode = parentNode.addElement("record"); final Element recordNode = parentNode.addElement("record");
insertRecordHeader(recordNode, record); insertRecordHeader(recordNode, record);
try { try {
@ -188,16 +190,16 @@ public class OaiController {
if (params.containsKey("resumptionToken")) { if (params.containsKey("resumptionToken")) {
final String resumptionToken = params.remove("resumptionToken"); final String resumptionToken = params.remove("resumptionToken");
if (!params.isEmpty()) { return prepareErrorResponseXml(OaiError.badArgument); } if (!params.isEmpty()) { return prepareErrorResponseXml(OaiError.badArgument); }
page = oaiService.listRecords(resumptionToken); page = this.oaiService.listRecords(resumptionToken);
} else { } else {
final String metadataPrefix = params.remove("metadataPrefix"); final String metadataPrefix = params.remove("metadataPrefix");
final String from = params.remove("from"); final String from = params.remove("from");
final String until = params.remove("until"); final String until = params.remove("until");
final String set = params.remove("set"); final String set = params.remove("set");
if (!StringUtils.isNotBlank(metadataPrefix) || !oaiService.verifySet(set)) { return prepareErrorResponseXml(OaiError.badArgument); } if (!StringUtils.isNotBlank(metadataPrefix) || !this.oaiService.verifySet(set)) { return prepareErrorResponseXml(OaiError.badArgument); }
page = oaiService.listRecords(metadataPrefix, set, from, until); page = this.oaiService.listRecords(metadataPrefix, set, from, until);
} }
final Document doc = genericOaiResponse(OaiVerb.LIST_IDENTIFIERS.getVerb()); final Document doc = genericOaiResponse(OaiVerb.LIST_IDENTIFIERS.getVerb());
@ -210,7 +212,7 @@ public class OaiController {
return doc.asXML(); return doc.asXML();
} }
private void insertRecordHeader(final Element parentNode, final OaiRecord r) { private void insertRecordHeader(final Element parentNode, final ExportedOaiRecord r) {
final Element headerNode = parentNode.addElement("header"); final Element headerNode = parentNode.addElement("header");
headerNode.addElement("identifier").setText(r.getId()); headerNode.addElement("identifier").setText(r.getId());
headerNode.addElement("datestamp").setText(DateUtils.calculate_ISO8601(r.getDate())); headerNode.addElement("datestamp").setText(DateUtils.calculate_ISO8601(r.getDate()));
@ -260,7 +262,7 @@ public class OaiController {
private Document genericOaiResponse(final String verb) { private Document genericOaiResponse(final String verb) {
try (InputStream is = getClass().getResourceAsStream("/oai/oai_response.xml")) { try (InputStream is = getClass().getResourceAsStream("/oai/oai_response.xml")) {
final OaiConfiguration conf = oaiService.oaiConfiguration(); final OaiConfiguration conf = this.oaiService.oaiConfiguration();
final Document doc = new SAXReader().read(is); final Document doc = new SAXReader().read(is);
doc.selectSingleNode("//*[local-name() = 'responseDate']").setText(DateUtils.now_ISO8601()); doc.selectSingleNode("//*[local-name() = 'responseDate']").setText(DateUtils.now_ISO8601());
doc.selectSingleNode("//*[local-name() = 'request']").setText(conf.getPublicBaseUrl()); doc.selectSingleNode("//*[local-name() = 'request']").setText(conf.getPublicBaseUrl());

View File

@ -3,13 +3,13 @@ package eu.dnetlib.services.oai.domain;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import eu.dnetlib.domain.oai.OaiRecord; import eu.dnetlib.domain.oai.ExportedOaiRecord;
public class OaiPage implements Serializable { public class OaiPage implements Serializable {
private static final long serialVersionUID = -7512951692582271344L; private static final long serialVersionUID = -7512951692582271344L;
private List<OaiRecord> list; private List<ExportedOaiRecord> list;
private long total; private long total;
@ -17,11 +17,11 @@ public class OaiPage implements Serializable {
private String resumptionToken; private String resumptionToken;
public List<OaiRecord> getList() { public List<ExportedOaiRecord> getList() {
return list; return list;
} }
public void setList(final List<OaiRecord> list) { public void setList(final List<ExportedOaiRecord> list) {
this.list = list; this.list = list;
} }

View File

@ -0,0 +1,9 @@
package eu.dnetlib.services.oai.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import eu.dnetlib.domain.oai.ExportedOaiMetadataFormat;
public interface ExportedOaiMetadataFormatRepository extends JpaRepository<ExportedOaiMetadataFormat, String> {
}

View File

@ -1,9 +0,0 @@
package eu.dnetlib.services.oai.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import eu.dnetlib.domain.oai.OaiMetadataFormat;
public interface OaiMetadataFormatRepository extends JpaRepository<OaiMetadataFormat, String> {
}

View File

@ -6,13 +6,13 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import eu.dnetlib.domain.oai.OaiRecord; import eu.dnetlib.domain.oai.ExportedOaiRecord;
public interface OaiRecordRepository extends JpaRepository<OaiRecord, String> { public interface OaiRecordRepository extends JpaRepository<ExportedOaiRecord, String> {
Page<OaiRecord> findByOaiSetAndDateBetween(String oaiSet, LocalDate from, LocalDate until, Pageable page); Page<ExportedOaiRecord> findByOaiSetAndDateBetween(String oaiSet, LocalDate from, LocalDate until, Pageable page);
Page<OaiRecord> findByDateBetween(LocalDate from, LocalDate until, Pageable page); Page<ExportedOaiRecord> findByDateBetween(LocalDate from, LocalDate until, Pageable page);
void deleteByOaiSet(String oaiSet); void deleteByOaiSet(String oaiSet);

View File

@ -2,8 +2,8 @@ package eu.dnetlib.services.oai.repository;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import eu.dnetlib.domain.oai.OaiSet; import eu.dnetlib.domain.oai.ExportedOaiSet;
public interface OaiSetRepository extends JpaRepository<OaiSet, String> { public interface OaiSetRepository extends JpaRepository<ExportedOaiSet, String> {
} }

View File

@ -14,14 +14,14 @@ import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import eu.dnetlib.common.mapping.xslt.XsltUtils; import eu.dnetlib.common.mapping.xslt.XsltUtils;
import eu.dnetlib.domain.oai.ExportedOaiMetadataFormat;
import eu.dnetlib.domain.oai.ExportedOaiRecord;
import eu.dnetlib.domain.oai.ExportedOaiSet;
import eu.dnetlib.domain.oai.OaiConfiguration; import eu.dnetlib.domain.oai.OaiConfiguration;
import eu.dnetlib.domain.oai.OaiMetadataFormat;
import eu.dnetlib.domain.oai.OaiRecord;
import eu.dnetlib.domain.oai.OaiSet;
import eu.dnetlib.errors.DnetRuntimeException; import eu.dnetlib.errors.DnetRuntimeException;
import eu.dnetlib.services.oai.domain.OaiPage; import eu.dnetlib.services.oai.domain.OaiPage;
import eu.dnetlib.services.oai.repository.ExportedOaiMetadataFormatRepository;
import eu.dnetlib.services.oai.repository.OaiConfigurationRepository; import eu.dnetlib.services.oai.repository.OaiConfigurationRepository;
import eu.dnetlib.services.oai.repository.OaiMetadataFormatRepository;
import eu.dnetlib.services.oai.repository.OaiRecordRepository; import eu.dnetlib.services.oai.repository.OaiRecordRepository;
import eu.dnetlib.services.oai.repository.OaiSetRepository; import eu.dnetlib.services.oai.repository.OaiSetRepository;
import eu.dnetlib.services.oai.utils.OaiPageRequest; import eu.dnetlib.services.oai.utils.OaiPageRequest;
@ -37,7 +37,7 @@ public class OaiService {
private OaiSetRepository oaiSetRepository; private OaiSetRepository oaiSetRepository;
@Autowired @Autowired
private OaiMetadataFormatRepository oaiMetadataFormatRepository; private ExportedOaiMetadataFormatRepository oaiMetadataFormatRepository;
@Autowired @Autowired
private OaiRecordRepository oaiRecordRepository; private OaiRecordRepository oaiRecordRepository;
@ -48,65 +48,65 @@ public class OaiService {
@Cacheable(value = "oaiConfiguration", key = "#root.methodName") @Cacheable(value = "oaiConfiguration", key = "#root.methodName")
public OaiConfiguration oaiConfiguration() { public OaiConfiguration oaiConfiguration() {
return oaiConfigurationRepository.findById(CONFIGURATION_ID).orElseThrow(() -> new DnetRuntimeException("Missing OAI Configuration")); return this.oaiConfigurationRepository.findById(CONFIGURATION_ID).orElseThrow(() -> new DnetRuntimeException("Missing OAI Configuration"));
} }
@CacheEvict(value = "oaiConfiguration", allEntries = true) @CacheEvict(value = "oaiConfiguration", allEntries = true)
public OaiConfiguration oaiConfiguration(final OaiConfiguration conf) { public OaiConfiguration oaiConfiguration(final OaiConfiguration conf) {
conf.setId(CONFIGURATION_ID); conf.setId(CONFIGURATION_ID);
return oaiConfigurationRepository.save(conf); return this.oaiConfigurationRepository.save(conf);
} }
@Cacheable(value = "oaiSets", key = "#root.methodName") @Cacheable(value = "oaiSets", key = "#root.methodName")
public List<OaiSet> listSets() { public List<ExportedOaiSet> listSets() {
return oaiSetRepository.findAll(); return this.oaiSetRepository.findAll();
} }
@CacheEvict(value = "oaiSets", allEntries = true) @CacheEvict(value = "oaiSets", allEntries = true)
public void addOrUpdateSet(final OaiSet set) { public void addOrUpdateSet(final ExportedOaiSet set) {
oaiSetRepository.save(set); this.oaiSetRepository.save(set);
} }
@CacheEvict(value = "oaiSets", allEntries = true) @CacheEvict(value = "oaiSets", allEntries = true)
public void deleteSet(final String setSpec) { public void deleteSet(final String setSpec) {
oaiRecordRepository.deleteByOaiSet(setSpec); this.oaiRecordRepository.deleteByOaiSet(setSpec);
oaiSetRepository.deleteById(setSpec); this.oaiSetRepository.deleteById(setSpec);
} }
public List<OaiMetadataFormat> listMetadataFormats(final String id) { public List<ExportedOaiMetadataFormat> listMetadataFormats(final String id) {
return oaiRecordRepository.existsById(id) ? oaiMetadataFormatRepository.findAll() : new ArrayList<>(); return this.oaiRecordRepository.existsById(id) ? this.oaiMetadataFormatRepository.findAll() : new ArrayList<>();
} }
@Cacheable(value = "oaiMetadataFormats", key = "#root.methodName") @Cacheable(value = "oaiMetadataFormats", key = "#root.methodName")
public List<OaiMetadataFormat> listMetadataFormats() { public List<ExportedOaiMetadataFormat> listMetadataFormats() {
return oaiMetadataFormatRepository.findAll(); return this.oaiMetadataFormatRepository.findAll();
} }
@CacheEvict(value = "oaiMetadataFormats", allEntries = true) @CacheEvict(value = "oaiMetadataFormats", allEntries = true)
public void addOrUpdateMetadataFormat(final OaiMetadataFormat format) { public void addOrUpdateMetadataFormat(final ExportedOaiMetadataFormat format) {
// TODO (LOW PRIORITY) : probably other controls are necessary // TODO (LOW PRIORITY) : probably other controls are necessary
oaiMetadataFormatRepository.save(format); this.oaiMetadataFormatRepository.save(format);
} }
@CacheEvict(value = "oaiMetadataFormats", allEntries = true) @CacheEvict(value = "oaiMetadataFormats", allEntries = true)
public void deleteMetadataFormat(final String metadataPrefix) { public void deleteMetadataFormat(final String metadataPrefix) {
// TODO (LOW PRIORITY) : probably other controls are necessary // TODO (LOW PRIORITY) : probably other controls are necessary
oaiMetadataFormatRepository.deleteById(metadataPrefix); this.oaiMetadataFormatRepository.deleteById(metadataPrefix);
} }
public boolean verifySet(final String setSpec) { public boolean verifySet(final String setSpec) {
// a blank setSpec is correct (it is equivalent to all sets) // a blank setSpec is correct (it is equivalent to all sets)
return StringUtils.isBlank(setSpec) || oaiSetRepository.existsById(setSpec); return StringUtils.isBlank(setSpec) || this.oaiSetRepository.existsById(setSpec);
} }
public OaiRecord getRecord(final String id, final String metadataPrefix) { public ExportedOaiRecord getRecord(final String id, final String metadataPrefix) {
final OaiRecord record = oaiRecordRepository.findById(id).orElseThrow(() -> new DnetRuntimeException("Missing ID: " + id)); final ExportedOaiRecord record = this.oaiRecordRepository.findById(id).orElseThrow(() -> new DnetRuntimeException("Missing ID: " + id));
if (!metadataPrefix.equalsIgnoreCase(oaiConfiguration().getNativeFormat())) { if (!metadataPrefix.equalsIgnoreCase(oaiConfiguration().getNativeFormat())) {
final String xslt = listMetadataFormats() final String xslt = listMetadataFormats()
.stream() .stream()
.filter(f -> f.getMetadataPrefix().equalsIgnoreCase(metadataPrefix)) .filter(f -> f.getMetadataPrefix().equalsIgnoreCase(metadataPrefix))
.map(OaiMetadataFormat::getXslt) .map(ExportedOaiMetadataFormat::getXslt)
.findFirst() .findFirst()
.orElseThrow(() -> new DnetRuntimeException("Invalid metadata format: " + metadataPrefix)); .orElseThrow(() -> new DnetRuntimeException("Invalid metadata format: " + metadataPrefix));
@ -136,8 +136,9 @@ public class OaiService {
final LocalDate from = req.getFrom(); final LocalDate from = req.getFrom();
final LocalDate until = req.getUntil(); final LocalDate until = req.getUntil();
final Page<OaiRecord> page = StringUtils.isBlank(req.getSet()) ? oaiRecordRepository.findByOaiSetAndDateBetween(req.getSet(), from, until, pageRequest) final Page<ExportedOaiRecord> page =
: oaiRecordRepository.findByDateBetween(from, until, pageRequest); StringUtils.isBlank(req.getSet()) ? this.oaiRecordRepository.findByOaiSetAndDateBetween(req.getSet(), from, until, pageRequest)
: this.oaiRecordRepository.findByDateBetween(from, until, pageRequest);
final OaiPage res = new OaiPage(); final OaiPage res = new OaiPage();
res.setCursor(req.getPageSize() * req.getPageNumber()); res.setCursor(req.getPageSize() * req.getPageNumber());

View File

@ -16,7 +16,7 @@ import eu.dnetlib.domain.mdstore.MDStoreVersion;
import eu.dnetlib.domain.mdstore.MDStoreWithInfo; import eu.dnetlib.domain.mdstore.MDStoreWithInfo;
import eu.dnetlib.domain.mdstore.records.MetadataRecord; import eu.dnetlib.domain.mdstore.records.MetadataRecord;
import eu.dnetlib.domain.oai.OaiConfiguration; import eu.dnetlib.domain.oai.OaiConfiguration;
import eu.dnetlib.domain.oai.OaiSet; import eu.dnetlib.domain.oai.ExportedOaiSet;
import eu.dnetlib.errors.DnetException; import eu.dnetlib.errors.DnetException;
import eu.dnetlib.wfs.annotations.WfInputParam; import eu.dnetlib.wfs.annotations.WfInputParam;
import eu.dnetlib.wfs.annotations.WfNode; import eu.dnetlib.wfs.annotations.WfNode;
@ -64,13 +64,13 @@ public class MdExportOaiJobNode extends ProcessNode {
if (mdstore.getFormat().equals(conf.getNativeFormat())) { if (mdstore.getFormat().equals(conf.getNativeFormat())) {
final boolean isSetRegistered = oaiManager.listSets() final boolean isSetRegistered = oaiManager.listSets()
.stream() .stream()
.map(OaiSet::getSetSpec) .map(ExportedOaiSet::getSetSpec)
.filter(s -> s.equals(this.oaiSetSpec)) .filter(s -> s.equals(this.oaiSetSpec))
.findFirst() .findFirst()
.isPresent(); .isPresent();
if (!isSetRegistered) { if (!isSetRegistered) {
final OaiSet oaiSet = new OaiSet(); final ExportedOaiSet oaiSet = new ExportedOaiSet();
oaiSet.setSetSpec(this.oaiSetSpec); oaiSet.setSetSpec(this.oaiSetSpec);
oaiSet.setSetName(this.ds.getOfficialname()); oaiSet.setSetName(this.ds.getOfficialname());
oaiSet.setDescription("Publications of " + this.ds.getOfficialname()); oaiSet.setDescription("Publications of " + this.ds.getOfficialname());

View File

@ -5,7 +5,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import eu.dnetlib.domain.oai.OaiConfiguration; import eu.dnetlib.domain.oai.OaiConfiguration;
import eu.dnetlib.domain.oai.OaiSet; import eu.dnetlib.domain.oai.ExportedOaiSet;
public class OaiManagerClient extends DnetServiceClient { public class OaiManagerClient extends DnetServiceClient {
@ -13,12 +13,12 @@ public class OaiManagerClient extends DnetServiceClient {
return httpGet("/api/oai/conf", OaiConfiguration.class, Map.of()); return httpGet("/api/oai/conf", OaiConfiguration.class, Map.of());
} }
public List<OaiSet> listSets() { public List<ExportedOaiSet> listSets() {
return Arrays.asList(httpGet("/api/oai/sets", OaiSet[].class, Map.of())); return Arrays.asList(httpGet("/api/oai/sets", ExportedOaiSet[].class, Map.of()));
} }
public void createOaiSet(final OaiSet oaiSet) { public void createOaiSet(final ExportedOaiSet oaiSet) {
httpPostObject("/api/oai/sets", oaiSet, OaiSet[].class, Map.of()); httpPostObject("/api/oai/sets", oaiSet, ExportedOaiSet[].class, Map.of());
} }
} }

View File

@ -0,0 +1,65 @@
package eu.dnetlib.domain.oai;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "oai_md_formats")
public class ExportedOaiMetadataFormat implements OaiMetadataFormat {
private static final long serialVersionUID = -4526570547812092275L;
@Id
@Column(name = "prefix")
private String metadataPrefix;
@Column(name = "schema")
private String metadataSchema;
@Column(name = "namespace")
private String metadataNamespace;
@Column(name = "xslt")
private String xslt;
@Override
public String getMetadataPrefix() {
return this.metadataPrefix;
}
@Override
public void setMetadataPrefix(final String metadataPrefix) {
this.metadataPrefix = metadataPrefix;
}
@Override
public String getMetadataSchema() {
return this.metadataSchema;
}
@Override
public void setMetadataSchema(final String metadataSchema) {
this.metadataSchema = metadataSchema;
}
@Override
public String getMetadataNamespace() {
return this.metadataNamespace;
}
@Override
public void setMetadataNamespace(final String metadataNamespace) {
this.metadataNamespace = metadataNamespace;
}
public String getXslt() {
return this.xslt;
}
public void setXslt(final String xslt) {
this.xslt = xslt;
}
}

View File

@ -0,0 +1,66 @@
package eu.dnetlib.domain.oai;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "oai_records")
public class ExportedOaiRecord implements OaiRecord {
private static final long serialVersionUID = 9178403183427337500L;
@Id
@Column(name = "id")
private String id;
@Column(name = "body")
private String body;
@Column(name = "date")
private LocalDateTime date;
@Column(name = "oai_set")
private String oaiSet;
@Override
public String getId() {
return this.id;
}
@Override
public void setId(final String id) {
this.id = id;
}
@Override
public String getBody() {
return this.body;
}
@Override
public void setBody(final String body) {
this.body = body;
}
@Override
public LocalDateTime getDate() {
return this.date;
}
@Override
public void setDate(final LocalDateTime date) {
this.date = date;
}
public String getOaiSet() {
return this.oaiSet;
}
public void setOaiSet(final String oaiSet) {
this.oaiSet = oaiSet;
}
}

View File

@ -0,0 +1,68 @@
package eu.dnetlib.domain.oai;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "oai_sets")
public class ExportedOaiSet implements OaiSet {
private static final long serialVersionUID = 7405955731269852254L;
@Id
@Column(name = "set_spec")
private String setSpec;
@Column(name = "set_name")
private String setName;
@Column(name = "description")
private String description;
@Column(name = "ds_id")
private String dsId;
public String getSetSpec() {
return this.setSpec;
}
@Override
public void setSetSpec(final String setSpec) {
this.setSpec = setSpec;
}
@Override
public String getSetName() {
return this.setName;
}
@Override
public void setSetName(final String setName) {
this.setName = setName;
}
@Override
public String getDescription() {
return this.description;
}
@Override
public void setDescription(final String description) {
this.description = description;
}
public String getDsId() {
return this.dsId;
}
public void setDsId(final String dsId) {
this.dsId = dsId;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}

View File

@ -0,0 +1,7 @@
package eu.dnetlib.domain.oai;
import java.io.Serializable;
public interface OaiIdentifier extends Serializable {
}

View File

@ -0,0 +1,7 @@
package eu.dnetlib.domain.oai;
import java.io.Serializable;
public interface OaiInfo extends Serializable {
}

View File

@ -2,60 +2,18 @@ package eu.dnetlib.domain.oai;
import java.io.Serializable; import java.io.Serializable;
import jakarta.persistence.Column; public interface OaiMetadataFormat extends Serializable {
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity String getMetadataPrefix();
@Table(name = "oai_md_formats")
public class OaiMetadataFormat implements Serializable {
private static final long serialVersionUID = -4526570547812092275L; void setMetadataPrefix(final String metadataPrefix);
@Id String getMetadataSchema();
@Column(name = "prefix")
private String metadataPrefix;
@Column(name = "schema") void setMetadataSchema(final String metadataSchema);
private String metadataSchema;
@Column(name = "namespace") String getMetadataNamespace();
private String metadataNamespace;
@Column(name = "xslt") void setMetadataNamespace(String metadataNamespace);
private String xslt;
public String getMetadataPrefix() {
return metadataPrefix;
}
public void setMetadataPrefix(final String metadataPrefix) {
this.metadataPrefix = metadataPrefix;
}
public String getMetadataSchema() {
return metadataSchema;
}
public void setMetadataSchema(final String metadataSchema) {
this.metadataSchema = metadataSchema;
}
public String getMetadataNamespace() {
return metadataNamespace;
}
public void setMetadataNamespace(final String metadataNamespace) {
this.metadataNamespace = metadataNamespace;
}
public String getXslt() {
return xslt;
}
public void setXslt(final String xslt) {
this.xslt = xslt;
}
} }

View File

@ -3,59 +3,17 @@ package eu.dnetlib.domain.oai;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import jakarta.persistence.Column; public interface OaiRecord extends Serializable {
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity String getId();
@Table(name = "oai_records")
public class OaiRecord implements Serializable {
private static final long serialVersionUID = 9178403183427337500L; void setId(String id);
@Id String getBody();
@Column(name = "id")
private String id;
@Column(name = "body") void setBody(String body);
private String body;
@Column(name = "date") LocalDateTime getDate();
private LocalDateTime date;
@Column(name = "oai_set") void setDate(LocalDateTime date);
private String oaiSet;
public String getId() {
return id;
}
public void setId(final String id) {
this.id = id;
}
public String getBody() {
return body;
}
public void setBody(final String body) {
this.body = body;
}
public LocalDateTime getDate() {
return date;
}
public void setDate(final LocalDateTime date) {
this.date = date;
}
public String getOaiSet() {
return oaiSet;
}
public void setOaiSet(final String oaiSet) {
this.oaiSet = oaiSet;
}
} }

View File

@ -2,64 +2,15 @@ package eu.dnetlib.domain.oai;
import java.io.Serializable; import java.io.Serializable;
import jakarta.persistence.Column; public interface OaiSet extends Serializable {
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity void setSetSpec(String setSpec);
@Table(name = "oai_sets")
public class OaiSet implements Serializable {
private static final long serialVersionUID = 7405955731269852254L; String getSetName();
@Id void setSetName(String setName);
@Column(name = "set_spec")
private String setSpec;
@Column(name = "set_name") String getDescription();
private String setName;
@Column(name = "description")
private String description;
@Column(name = "ds_id")
private String dsId;
public String getSetSpec() {
return setSpec;
}
public void setSetSpec(final String setSpec) {
this.setSpec = setSpec;
}
public String getSetName() {
return setName;
}
public void setSetName(final String setName) {
this.setName = setName;
}
public String getDescription() {
return description;
}
public void setDescription(final String description) {
this.description = description;
}
public String getDsId() {
return dsId;
}
public void setDsId(final String dsId) {
this.dsId = dsId;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
void setDescription(String description);
} }

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>eu.dnetlib.docker</groupId>
<artifactId>libs</artifactId>
<version>7.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dnet-oai-common</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>dnet-common-mapping</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
</dependency>
<dependency>
<groupId>com.github.sisyphsu</groupId>
<artifactId>dateparser</artifactId>
<version>1.0.11</version>
</dependency>
<!-- Tests -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,43 @@
package eu.dnetlib.common.oai.domain;
import java.util.List;
import eu.dnetlib.domain.oai.OaiIdentifier;
import eu.dnetlib.domain.oai.OaiInfo;
import eu.dnetlib.domain.oai.OaiMetadataFormat;
import eu.dnetlib.domain.oai.OaiRecord;
import eu.dnetlib.domain.oai.OaiSet;
public class OaiClient {
public List<OaiSet> listSets(final String baseUrl) {
// TODO
return null;
}
public List<OaiMetadataFormat> listMetadataFormat(final String baseUrl) {
// TODO
return null;
}
public List<OaiRecord> listRecords(final String baseUrl) {
// TODO
return null;
}
public List<OaiIdentifier> listIdentifier(final String baseUrl) {
// TODO
return null;
}
public OaiInfo info(final String baseUrl) {
// TODO
return null;
}
}

View File

@ -1,4 +1,4 @@
package eu.dnetlib.wfs.collector.oai; package eu.dnetlib.common.oai.domain;
import java.io.StringReader; import java.io.StringReader;
import java.net.URLEncoder; import java.net.URLEncoder;
@ -21,7 +21,7 @@ import org.springframework.web.client.RestTemplate;
import eu.dnetlib.errors.CollectorException; import eu.dnetlib.errors.CollectorException;
import eu.dnetlib.utils.XmlCleaner; import eu.dnetlib.utils.XmlCleaner;
class OaiIterator implements Iterator<String> { public class OaiIterator implements Iterator<String> {
private static final DateTimeFormatter oaiDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private static final DateTimeFormatter oaiDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

View File

@ -21,6 +21,12 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>dnet-oai-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>${project.groupId}</groupId> <groupId>${project.groupId}</groupId>
<artifactId>dnet-wf-common</artifactId> <artifactId>dnet-wf-common</artifactId>

View File

@ -1,10 +1,12 @@
package eu.dnetlib.wfs.collector.oai; package eu.dnetlib.wfs.collector.oai;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
import eu.dnetlib.common.oai.domain.OaiIterator;
import eu.dnetlib.utils.DnetStreamSupport; import eu.dnetlib.utils.DnetStreamSupport;
import eu.dnetlib.wfs.annotations.CollectorPlugin; import eu.dnetlib.wfs.annotations.CollectorPlugin;
import eu.dnetlib.wfs.collector.DnetCollectorPlugin; import eu.dnetlib.wfs.collector.DnetCollectorPlugin;

View File

@ -18,6 +18,7 @@
<module>dnet-common-mapping</module> <module>dnet-common-mapping</module>
<module>dnet-mdstore-postgres</module> <module>dnet-mdstore-postgres</module>
<module>dnet-index-solr</module> <module>dnet-index-solr</module>
<module>dnet-oai-common</module>
<module>dnet-wf-common</module> <module>dnet-wf-common</module>
<module>dnet-wf-executor-common</module> <module>dnet-wf-executor-common</module>
</modules> </modules>