some fixes
This commit is contained in:
parent
a4d3a6607e
commit
d997389882
|
@ -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());
|
||||
|
||||
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)) {
|
||||
doc.selectSingleNode("//*[local-name() = 'request']/@verb").setText(verb);
|
||||
reqNode.addAttribute("verb", verb);
|
||||
}
|
||||
|
||||
return doc;
|
||||
} catch (final DocumentException | IOException e) {
|
||||
throw new RuntimeException("Error generataing oai response", e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private String prepareErrorResponseXml(final OaiError error) {
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue