diff --git a/src/main/java/eu/dnetlib/apps/oai/OaiServerController.java b/src/main/java/eu/dnetlib/apps/oai/OaiServerController.java index bcbb231..c37184f 100644 --- a/src/main/java/eu/dnetlib/apps/oai/OaiServerController.java +++ b/src/main/java/eu/dnetlib/apps/oai/OaiServerController.java @@ -1,12 +1,10 @@ package eu.dnetlib.apps.oai; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -18,9 +16,11 @@ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; -import org.dom4j.io.SAXReader; +import org.dom4j.Namespace; +import org.dom4j.QName; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import eu.dnetlib.apps.oai.domain.OaiError; @@ -58,6 +58,15 @@ public class OaiServerController { } + @ExceptionHandler(Throwable.class) + public void handleError(final HttpServletRequest req, final HttpServletResponse response, final Exception ex) throws IOException { + log.error("Request: " + req.getRequestURL() + " raised " + ex.getMessage(), ex); + + try (final OutputStream out = response.getOutputStream()) { + IOUtils.write(prepareErrorResponseXml(OaiError.badArgument), out, StandardCharsets.UTF_8); + } + } + private String oaiResponse(final Map params) { if (params == null) { return prepareErrorResponseXml(OaiError.badArgument); } @@ -98,7 +107,7 @@ public class OaiServerController { final Document doc = genericOaiResponse(OaiVerb.LIST_METADATA_FORMATS.getVerb()); final Element dataNode = doc.getRootElement().addElement(OaiVerb.LIST_METADATA_FORMATS.getVerb()); - final List formats = + final OaiMetadataFormat[] formats = StringUtils.isBlank(id) ? this.oaiService.listMetadataFormats(id) : this.oaiService.listMetadataFormats(); for (final OaiMetadataFormat oaiFormat : formats) { @@ -260,17 +269,24 @@ public class OaiServerController { } private Document genericOaiResponse(final String verb) { - try (InputStream is = getClass().getResourceAsStream("/oai/oai_response.xml")) { - final Document doc = new SAXReader().read(is); - doc.selectSingleNode("//*[local-name() = 'responseDate']").setText(DateUtils.now_ISO8601()); - doc.selectSingleNode("//*[local-name() = 'request']").setText(oaiConf.getBaseUrl()); - if (StringUtils.isNotBlank(verb)) { - doc.selectSingleNode("//*[local-name() = 'request']/@verb").setText(verb); - } - return doc; - } catch (final DocumentException | IOException e) { - throw new RuntimeException("Error generataing oai response", e); + + final Document doc = DocumentHelper.createDocument(); + + final Element root = doc.addElement("OAI-PMH", "http://www.openarchives.org/OAI/2.0/"); + + root.addAttribute(new QName("schemaLocation", new Namespace("xsi", + "http://www.w3.org/2001/XMLSchema-instance")), "http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"); + + root.addElement("responseDate").setText(DateUtils.now_ISO8601()); + + final Element reqNode = root.addElement("request"); + reqNode.setText(oaiConf.getBaseUrl()); + if (StringUtils.isNotBlank(verb)) { + reqNode.addAttribute("verb", verb); } + + return doc; + } private String prepareErrorResponseXml(final OaiError error) { diff --git a/src/main/java/eu/dnetlib/apps/oai/OaiService.java b/src/main/java/eu/dnetlib/apps/oai/OaiService.java index df04928..6187eb2 100644 --- a/src/main/java/eu/dnetlib/apps/oai/OaiService.java +++ b/src/main/java/eu/dnetlib/apps/oai/OaiService.java @@ -116,19 +116,19 @@ public class OaiService { public OaiSet[] listSets() { try { - return new ObjectMapper().readerForArrayOf(OaiSet.class).readValue(getClass().getResourceAsStream("oai-sets.xml")); + return new ObjectMapper().readerForArrayOf(OaiSet.class).readValue(getClass().getResourceAsStream("/oai-sets.json")); } catch (final IOException e) { throw new RuntimeException("Error obtaining oai sets"); } } - public List listMetadataFormats(final String id) { + public OaiMetadataFormat[] listMetadataFormats(final String id) { return listMetadataFormats(); } - public List listMetadataFormats() { + public OaiMetadataFormat[] listMetadataFormats() { try { - return new ObjectMapper().readerForArrayOf(OaiMetadataFormat.class).readValue(getClass().getResourceAsStream("oai-metadata-formats.xml")); + return new ObjectMapper().readerForArrayOf(OaiMetadataFormat.class).readValue(getClass().getResourceAsStream("/oai-metadata-formats.json")); } catch (final IOException e) { throw new RuntimeException("Error obtaining oai sets"); } @@ -165,8 +165,7 @@ public class OaiService { } private Function prepareXsltMapper(final String metadataPrefix) { - return listMetadataFormats() - .stream() + return Arrays.stream(listMetadataFormats()) .filter(f -> f.getMetadataPrefix().equalsIgnoreCase(metadataPrefix)) .map(OaiMetadataFormat::getXsltPath) .map(xsltPath -> this.xsltTransformerFactory.getTransformer(xsltPath, null)) diff --git a/src/main/java/eu/dnetlib/apps/oai/utils/DateUtils.java b/src/main/java/eu/dnetlib/apps/oai/utils/DateUtils.java index 3f2310c..79f64e3 100644 --- a/src/main/java/eu/dnetlib/apps/oai/utils/DateUtils.java +++ b/src/main/java/eu/dnetlib/apps/oai/utils/DateUtils.java @@ -4,21 +4,16 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Locale; import java.util.TimeZone; public class DateUtils { - private static final DateTimeFormatter DATEFORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.getDefault()); - - private static final DateTimeFormatter ISO8601FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()); - public static LocalDate parseDate(final String s) { - return LocalDate.parse(s, DATEFORMAT); + return LocalDate.parse(s, DateTimeFormatter.ISO_DATE); } public static String calculate_ISO8601(final LocalDateTime time) { - final String result = time.format(ISO8601FORMAT); + final String result = time.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); return result.substring(0, result.length() - 2) + ":" + result.substring(result.length() - 2); }