some fixes

This commit is contained in:
Michele Artini 2024-04-30 09:58:51 +02:00
parent a4d3a6607e
commit d997389882
3 changed files with 37 additions and 27 deletions

View File

@ -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<String, String> 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<OaiMetadataFormat> 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) {

View File

@ -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<OaiMetadataFormat> listMetadataFormats(final String id) {
public OaiMetadataFormat[] listMetadataFormats(final String id) {
return listMetadataFormats();
}
public List<OaiMetadataFormat> 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<String, String> 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))

View File

@ -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);
}