Merge branch 'main' into feature-relationship-versioning-contribution

This commit is contained in:
Bruno Roemers
2022-05-04 11:46:28 +02:00
326 changed files with 4742 additions and 5526 deletions

View File

@@ -1,4 +1,6 @@
<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/maven-v4_0_0.xsd"> <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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.dspace</groupId> <groupId>org.dspace</groupId>
<artifactId>dspace-api</artifactId> <artifactId>dspace-api</artifactId>
@@ -12,7 +14,7 @@
<parent> <parent>
<groupId>org.dspace</groupId> <groupId>org.dspace</groupId>
<artifactId>dspace-parent</artifactId> <artifactId>dspace-parent</artifactId>
<version>7.2</version> <version>7.3-SNAPSHOT</version>
<relativePath>..</relativePath> <relativePath>..</relativePath>
</parent> </parent>
@@ -335,9 +337,13 @@
<dependencies> <dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId> <artifactId>hibernate-core</artifactId>
<exclusions> <exclusions>
<!-- Newer version pulled in via Jersey below --> <!-- Newer version pulled in via Jersey below -->
<exclusion> <exclusion>
@@ -346,6 +352,15 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jcache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId> <artifactId>hibernate-jpamodelgen</artifactId>
@@ -358,7 +373,7 @@
<dependency> <dependency>
<groupId>org.hibernate.javax.persistence</groupId> <groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId> <artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version> <version>1.0.2.Final</version>
</dependency> </dependency>
<dependency> <dependency>
@@ -379,7 +394,7 @@
<groupId>org.ow2.asm</groupId> <groupId>org.ow2.asm</groupId>
<artifactId>asm-commons</artifactId> <artifactId>asm-commons</artifactId>
</exclusion> </exclusion>
<!-- Newer version of Bouncycastle brought in via solr-cell --> <!-- Newer version of Bouncycastle brought in via Tika -->
<exclusion> <exclusion>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId> <artifactId>bcpkix-jdk15on</artifactId>
@@ -505,7 +520,7 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jdom</groupId> <groupId>org.jdom</groupId>
<artifactId>jdom</artifactId> <artifactId>jdom2</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.pdfbox</groupId> <groupId>org.apache.pdfbox</groupId>
@@ -515,18 +530,6 @@
<groupId>org.apache.pdfbox</groupId> <groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId> <artifactId>fontbox</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
</dependency>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.ibm.icu</groupId> <groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId> <artifactId>icu4j</artifactId>
@@ -566,9 +569,12 @@
</dependency> </dependency>
<!-- Used for RSS / ATOM syndication feeds --> <!-- Used for RSS / ATOM syndication feeds -->
<dependency> <dependency>
<groupId>org.rometools</groupId> <groupId>com.rometools</groupId>
<artifactId>rome</artifactId>
</dependency>
<dependency>
<groupId>com.rometools</groupId>
<artifactId>rome-modules</artifactId> <artifactId>rome-modules</artifactId>
<version>1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.jbibtex</groupId> <groupId>org.jbibtex</groupId>
@@ -579,28 +585,22 @@
<groupId>org.apache.httpcomponents</groupId> <groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId> <artifactId>httpclient</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<!-- SolrJ is used to communicate with Solr throughout the dspace-api -->
<dependency> <dependency>
<groupId>org.apache.solr</groupId> <groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId> <artifactId>solr-solrj</artifactId>
<version>${solr.client.version}</version> <version>${solr.client.version}</version>
<exclusions>
<!-- Newer Jetty version brought in via Parent POM -->
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-http</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!-- Solr Core is needed for Integration Tests (to run a MockSolrServer) --> <!-- Solr Core is only needed for Integration Tests (to run a MockSolrServer) -->
<!-- The following Solr / Lucene dependencies also support integration tests --> <!-- The following Solr / Lucene dependencies also support integration tests -->
<dependency> <dependency>
<groupId>org.apache.solr</groupId> <groupId>org.apache.solr</groupId>
@@ -628,39 +628,10 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-cell</artifactId>
<exclusions>
<!-- Newer version brought in by opencsv -->
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</exclusion>
<!-- Newer Jetty version brought in via Parent POM -->
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-http</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
</exclusion>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <dependency>
<groupId>org.apache.lucene</groupId> <groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId> <artifactId>lucene-core</artifactId>
</dependency> </dependency>
<!-- Used for full-text indexing with Solr -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.apache.lucene</groupId> <groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-icu</artifactId> <artifactId>lucene-analyzers-icu</artifactId>
@@ -676,9 +647,15 @@
<artifactId>lucene-analyzers-stempel</artifactId> <artifactId>lucene-analyzers-stempel</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- Tika is used to extract full text from documents in order to index in Solr -->
<dependency> <dependency>
<groupId>org.apache.xmlbeans</groupId> <groupId>org.apache.tika</groupId>
<artifactId>xmlbeans</artifactId> <artifactId>tika-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
</dependency> </dependency>
<dependency> <dependency>
@@ -702,13 +679,6 @@
<version>1.1.1</version> <version>1.1.1</version>
</dependency> </dependency>
<!-- Gson: Java to Json conversion -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
@@ -736,7 +706,7 @@
<dependency> <dependency>
<groupId>org.flywaydb</groupId> <groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId> <artifactId>flyway-core</artifactId>
<version>6.5.7</version> <version>8.4.4</version>
</dependency> </dependency>
<!-- Google Analytics --> <!-- Google Analytics -->
@@ -792,44 +762,6 @@
<artifactId>jaxb-runtime</artifactId> <artifactId>jaxb-runtime</artifactId>
</dependency> </dependency>
<!-- Apache Axiom -->
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-impl</artifactId>
<version>${axiom.version}</version>
<exclusions>
<!-- Exclude Geronimo as it is NOT necessary when using javax.activation (which we use)
See: https://ws.apache.org/axiom/userguide/ch04.html#d0e732 -->
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>*</artifactId>
</exclusion>
<!-- Exclude Woodstox, as later version provided by Solr dependencies -->
<exclusion>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.ws.commons.axiom</groupId>
<artifactId>axiom-api</artifactId>
<version>${axiom.version}</version>
<exclusions>
<!-- Exclude Geronimo as it is NOT necessary when using javax.activation (which we use)
See: https://ws.apache.org/axiom/userguide/ch04.html#d0e732 -->
<exclusion>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>*</artifactId>
</exclusion>
<!-- Exclude Woodstox, as later version provided by Solr dependencies -->
<exclusion>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Jersey / JAX-RS client (javax.ws.rs.*) dependencies needed to integrate with external sources/services --> <!-- Jersey / JAX-RS client (javax.ws.rs.*) dependencies needed to integrate with external sources/services -->
<dependency> <dependency>
<groupId>org.glassfish.jersey.core</groupId> <groupId>org.glassfish.jersey.core</groupId>
@@ -885,6 +817,14 @@
<version>20180130</version> <version>20180130</version>
</dependency> </dependency>
<!-- Useful for testing command-line tools -->
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.19.0</version>
<scope>test</scope>
</dependency>
<!-- Used for Solr core export/import --> <!-- Used for Solr core export/import -->
<dependency> <dependency>
<groupId>com.opencsv</groupId> <groupId>com.opencsv</groupId>
@@ -896,7 +836,6 @@
<dependency> <dependency>
<groupId>org.apache.velocity</groupId> <groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId> <artifactId>velocity-engine-core</artifactId>
<type>jar</type>
</dependency> </dependency>
<dependency> <dependency>
@@ -918,13 +857,6 @@
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.19.0</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.mock-server</groupId> <groupId>org.mock-server</groupId>
<artifactId>mockserver-junit-rule</artifactId> <artifactId>mockserver-junit-rule</artifactId>
@@ -971,7 +903,7 @@
<dependency> <dependency>
<groupId>org.apache.velocity</groupId> <groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId> <artifactId>velocity-engine-core</artifactId>
<version>2.2</version> <version>2.3</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.xmlunit</groupId> <groupId>org.xmlunit</groupId>

View File

@@ -11,13 +11,16 @@ import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options; import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import org.apache.xpath.XPathAPI;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.MetadataField; import org.dspace.content.MetadataField;
import org.dspace.content.MetadataSchema; import org.dspace.content.MetadataSchema;
@@ -90,7 +93,7 @@ public class MetadataImporter {
public static void main(String[] args) public static void main(String[] args)
throws ParseException, SQLException, IOException, TransformerException, throws ParseException, SQLException, IOException, TransformerException,
ParserConfigurationException, AuthorizeException, SAXException, ParserConfigurationException, AuthorizeException, SAXException,
NonUniqueMetadataException, RegistryImportException { NonUniqueMetadataException, RegistryImportException, XPathExpressionException {
// create an options object and populate it // create an options object and populate it
CommandLineParser parser = new DefaultParser(); CommandLineParser parser = new DefaultParser();
@@ -124,8 +127,8 @@ public class MetadataImporter {
* @throws RegistryImportException if import fails * @throws RegistryImportException if import fails
*/ */
public static void loadRegistry(String file, boolean forceUpdate) public static void loadRegistry(String file, boolean forceUpdate)
throws SQLException, IOException, TransformerException, ParserConfigurationException, throws SQLException, IOException, TransformerException, ParserConfigurationException, AuthorizeException,
AuthorizeException, SAXException, NonUniqueMetadataException, RegistryImportException { SAXException, NonUniqueMetadataException, RegistryImportException, XPathExpressionException {
Context context = null; Context context = null;
try { try {
@@ -137,7 +140,9 @@ public class MetadataImporter {
Document document = RegistryImporter.loadXML(file); Document document = RegistryImporter.loadXML(file);
// Get the nodes corresponding to types // Get the nodes corresponding to types
NodeList schemaNodes = XPathAPI.selectNodeList(document, "/dspace-dc-types/dc-schema"); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList schemaNodes = (NodeList) xPath.compile("/dspace-dc-types/dc-schema")
.evaluate(document, XPathConstants.NODESET);
// Add each one as a new format to the registry // Add each one as a new format to the registry
for (int i = 0; i < schemaNodes.getLength(); i++) { for (int i = 0; i < schemaNodes.getLength(); i++) {
@@ -146,7 +151,8 @@ public class MetadataImporter {
} }
// Get the nodes corresponding to types // Get the nodes corresponding to types
NodeList typeNodes = XPathAPI.selectNodeList(document, "/dspace-dc-types/dc-type"); NodeList typeNodes = (NodeList) xPath.compile("/dspace-dc-types/dc-type")
.evaluate(document, XPathConstants.NODESET);
// Add each one as a new format to the registry // Add each one as a new format to the registry
for (int i = 0; i < typeNodes.getLength(); i++) { for (int i = 0; i < typeNodes.getLength(); i++) {
@@ -178,8 +184,8 @@ public class MetadataImporter {
* @throws RegistryImportException if import fails * @throws RegistryImportException if import fails
*/ */
private static void loadSchema(Context context, Node node, boolean updateExisting) private static void loadSchema(Context context, Node node, boolean updateExisting)
throws SQLException, IOException, TransformerException, throws SQLException, AuthorizeException, NonUniqueMetadataException, RegistryImportException,
AuthorizeException, NonUniqueMetadataException, RegistryImportException { XPathExpressionException {
// Get the values // Get the values
String name = RegistryImporter.getElementData(node, "name"); String name = RegistryImporter.getElementData(node, "name");
String namespace = RegistryImporter.getElementData(node, "namespace"); String namespace = RegistryImporter.getElementData(node, "namespace");
@@ -236,8 +242,8 @@ public class MetadataImporter {
* @throws RegistryImportException if import fails * @throws RegistryImportException if import fails
*/ */
private static void loadType(Context context, Node node) private static void loadType(Context context, Node node)
throws SQLException, IOException, TransformerException, throws SQLException, IOException, AuthorizeException, NonUniqueMetadataException, RegistryImportException,
AuthorizeException, NonUniqueMetadataException, RegistryImportException { XPathExpressionException {
// Get the values // Get the values
String schema = RegistryImporter.getElementData(node, "schema"); String schema = RegistryImporter.getElementData(node, "schema");
String element = RegistryImporter.getElementData(node, "element"); String element = RegistryImporter.getElementData(node, "element");

View File

@@ -13,8 +13,11 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@@ -72,9 +75,10 @@ public class RegistryImporter {
* @throws TransformerException if error * @throws TransformerException if error
*/ */
public static String getElementData(Node parentElement, String childName) public static String getElementData(Node parentElement, String childName)
throws TransformerException { throws XPathExpressionException {
// Grab the child node // Grab the child node
Node childNode = XPathAPI.selectSingleNode(parentElement, childName); XPath xPath = XPathFactory.newInstance().newXPath();
Node childNode = (Node) xPath.compile(childName).evaluate(parentElement, XPathConstants.NODE);
if (childNode == null) { if (childNode == null) {
// No child node, so no values // No child node, so no values
@@ -115,9 +119,10 @@ public class RegistryImporter {
* @throws TransformerException if error * @throws TransformerException if error
*/ */
public static String[] getRepeatedElementData(Node parentElement, public static String[] getRepeatedElementData(Node parentElement,
String childName) throws TransformerException { String childName) throws XPathExpressionException {
// Grab the child node // Grab the child node
NodeList childNodes = XPathAPI.selectNodeList(parentElement, childName); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList childNodes = (NodeList) xPath.compile(childName).evaluate(parentElement, XPathConstants.NODESET);
String[] data = new String[childNodes.getLength()]; String[] data = new String[childNodes.getLength()];

View File

@@ -16,9 +16,12 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.BitstreamFormat; import org.dspace.content.BitstreamFormat;
import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.factory.ContentServiceFactory;
@@ -122,12 +125,13 @@ public class RegistryLoader {
*/ */
public static void loadBitstreamFormats(Context context, String filename) public static void loadBitstreamFormats(Context context, String filename)
throws SQLException, IOException, ParserConfigurationException, throws SQLException, IOException, ParserConfigurationException,
SAXException, TransformerException, AuthorizeException { SAXException, TransformerException, AuthorizeException, XPathExpressionException {
Document document = loadXML(filename); Document document = loadXML(filename);
// Get the nodes corresponding to formats // Get the nodes corresponding to formats
NodeList typeNodes = XPathAPI.selectNodeList(document, XPath xPath = XPathFactory.newInstance().newXPath();
"dspace-bitstream-types/bitstream-type"); NodeList typeNodes = (NodeList) xPath.compile("dspace-bitstream-types/bitstream-type")
.evaluate(document, XPathConstants.NODESET);
// Add each one as a new format to the registry // Add each one as a new format to the registry
for (int i = 0; i < typeNodes.getLength(); i++) { for (int i = 0; i < typeNodes.getLength(); i++) {
@@ -151,8 +155,7 @@ public class RegistryLoader {
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
*/ */
private static void loadFormat(Context context, Node node) private static void loadFormat(Context context, Node node)
throws SQLException, IOException, TransformerException, throws SQLException, AuthorizeException, XPathExpressionException {
AuthorizeException {
// Get the values // Get the values
String mimeType = getElementData(node, "mimetype"); String mimeType = getElementData(node, "mimetype");
String shortDesc = getElementData(node, "short_description"); String shortDesc = getElementData(node, "short_description");
@@ -231,9 +234,10 @@ public class RegistryLoader {
* @throws TransformerException if transformer error * @throws TransformerException if transformer error
*/ */
private static String getElementData(Node parentElement, String childName) private static String getElementData(Node parentElement, String childName)
throws TransformerException { throws XPathExpressionException {
// Grab the child node // Grab the child node
Node childNode = XPathAPI.selectSingleNode(parentElement, childName); XPath xPath = XPathFactory.newInstance().newXPath();
Node childNode = (Node) xPath.compile(childName).evaluate(parentElement, XPathConstants.NODE);
if (childNode == null) { if (childNode == null) {
// No child node, so no values // No child node, so no values
@@ -274,9 +278,10 @@ public class RegistryLoader {
* @throws TransformerException if transformer error * @throws TransformerException if transformer error
*/ */
private static String[] getRepeatedElementData(Node parentElement, private static String[] getRepeatedElementData(Node parentElement,
String childName) throws TransformerException { String childName) throws XPathExpressionException {
// Grab the child node // Grab the child node
NodeList childNodes = XPathAPI.selectNodeList(parentElement, childName); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList childNodes = (NodeList) xPath.compile(childName).evaluate(parentElement, XPathConstants.NODESET);
String[] data = new String[childNodes.getLength()]; String[] data = new String[childNodes.getLength()];

View File

@@ -30,6 +30,10 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.CommandLineParser;
@@ -38,7 +42,6 @@ import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option; import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options; import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import org.apache.xpath.XPathAPI;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Collection; import org.dspace.content.Collection;
import org.dspace.content.Community; import org.dspace.content.Community;
@@ -52,9 +55,9 @@ import org.dspace.content.service.CommunityService;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.factory.EPersonServiceFactory;
import org.dspace.eperson.service.EPersonService; import org.dspace.eperson.service.EPersonService;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.output.Format; import org.jdom2.output.Format;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@@ -138,7 +141,7 @@ public class StructBuilder {
*/ */
public static void main(String[] argv) public static void main(String[] argv)
throws ParserConfigurationException, SQLException, throws ParserConfigurationException, SQLException,
FileNotFoundException, IOException, TransformerException { IOException, TransformerException, XPathExpressionException {
// Define command line options. // Define command line options.
Options options = new Options(); Options options = new Options();
@@ -240,7 +243,7 @@ public class StructBuilder {
* @throws SQLException * @throws SQLException
*/ */
static void importStructure(Context context, InputStream input, OutputStream output) static void importStructure(Context context, InputStream input, OutputStream output)
throws IOException, ParserConfigurationException, SQLException, TransformerException { throws IOException, ParserConfigurationException, SQLException, TransformerException, XPathExpressionException {
// load the XML // load the XML
Document document = null; Document document = null;
@@ -258,13 +261,15 @@ public class StructBuilder {
// is properly structured. // is properly structured.
try { try {
validate(document); validate(document);
} catch (TransformerException ex) { } catch (XPathExpressionException ex) {
System.err.format("The input document is invalid: %s%n", ex.getMessage()); System.err.format("The input document is invalid: %s%n", ex.getMessage());
System.exit(1); System.exit(1);
} }
// Check for 'identifier' attributes -- possibly output by this class. // Check for 'identifier' attributes -- possibly output by this class.
NodeList identifierNodes = XPathAPI.selectNodeList(document, "//*[@identifier]"); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList identifierNodes = (NodeList) xPath.compile("//*[@identifier]")
.evaluate(document, XPathConstants.NODESET);
if (identifierNodes.getLength() > 0) { if (identifierNodes.getLength() > 0) {
System.err.println("The input document has 'identifier' attributes, which will be ignored."); System.err.println("The input document has 'identifier' attributes, which will be ignored.");
} }
@@ -287,7 +292,8 @@ public class StructBuilder {
Element[] elements = new Element[]{}; Element[] elements = new Element[]{};
try { try {
// get the top level community list // get the top level community list
NodeList first = XPathAPI.selectNodeList(document, "/import_structure/community"); NodeList first = (NodeList) xPath.compile("/import_structure/community")
.evaluate(document, XPathConstants.NODESET);
// run the import starting with the top level communities // run the import starting with the top level communities
elements = handleCommunities(context, first, null); elements = handleCommunities(context, first, null);
@@ -307,7 +313,7 @@ public class StructBuilder {
} }
// finally write the string into the output file. // finally write the string into the output file.
final org.jdom.Document xmlOutput = new org.jdom.Document(root); final org.jdom2.Document xmlOutput = new org.jdom2.Document(root);
try { try {
new XMLOutputter().output(xmlOutput, output); new XMLOutputter().output(xmlOutput, output);
} catch (IOException e) { } catch (IOException e) {
@@ -411,7 +417,7 @@ public class StructBuilder {
} }
// Now write the structure out. // Now write the structure out.
org.jdom.Document xmlOutput = new org.jdom.Document(rootElement); org.jdom2.Document xmlOutput = new org.jdom2.Document(rootElement);
try { try {
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
outputter.output(xmlOutput, output); outputter.output(xmlOutput, output);
@@ -456,14 +462,16 @@ public class StructBuilder {
* @throws TransformerException if transformer error * @throws TransformerException if transformer error
*/ */
private static void validate(org.w3c.dom.Document document) private static void validate(org.w3c.dom.Document document)
throws TransformerException { throws XPathExpressionException {
StringBuilder err = new StringBuilder(); StringBuilder err = new StringBuilder();
boolean trip = false; boolean trip = false;
err.append("The following errors were encountered parsing the source XML.\n"); err.append("The following errors were encountered parsing the source XML.\n");
err.append("No changes have been made to the DSpace instance.\n\n"); err.append("No changes have been made to the DSpace instance.\n\n");
NodeList first = XPathAPI.selectNodeList(document, "/import_structure/community"); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList first = (NodeList) xPath.compile("/import_structure/community")
.evaluate(document, XPathConstants.NODESET);
if (first.getLength() == 0) { if (first.getLength() == 0) {
err.append("-There are no top level communities in the source document."); err.append("-There are no top level communities in the source document.");
System.out.println(err.toString()); System.out.println(err.toString());
@@ -493,14 +501,15 @@ public class StructBuilder {
* no errors. * no errors.
*/ */
private static String validateCommunities(NodeList communities, int level) private static String validateCommunities(NodeList communities, int level)
throws TransformerException { throws XPathExpressionException {
StringBuilder err = new StringBuilder(); StringBuilder err = new StringBuilder();
boolean trip = false; boolean trip = false;
String errs = null; String errs = null;
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < communities.getLength(); i++) { for (int i = 0; i < communities.getLength(); i++) {
Node n = communities.item(i); Node n = communities.item(i);
NodeList name = XPathAPI.selectNodeList(n, "name"); NodeList name = (NodeList) xPath.compile("name").evaluate(n, XPathConstants.NODESET);
if (name.getLength() != 1) { if (name.getLength() != 1) {
String pos = Integer.toString(i + 1); String pos = Integer.toString(i + 1);
err.append("-The level ").append(level) err.append("-The level ").append(level)
@@ -510,7 +519,7 @@ public class StructBuilder {
} }
// validate sub communities // validate sub communities
NodeList subCommunities = XPathAPI.selectNodeList(n, "community"); NodeList subCommunities = (NodeList) xPath.compile("community").evaluate(n, XPathConstants.NODESET);
String comErrs = validateCommunities(subCommunities, level + 1); String comErrs = validateCommunities(subCommunities, level + 1);
if (comErrs != null) { if (comErrs != null) {
err.append(comErrs); err.append(comErrs);
@@ -518,7 +527,7 @@ public class StructBuilder {
} }
// validate collections // validate collections
NodeList collections = XPathAPI.selectNodeList(n, "collection"); NodeList collections = (NodeList) xPath.compile("collection").evaluate(n, XPathConstants.NODESET);
String colErrs = validateCollections(collections, level + 1); String colErrs = validateCollections(collections, level + 1);
if (colErrs != null) { if (colErrs != null) {
err.append(colErrs); err.append(colErrs);
@@ -542,14 +551,15 @@ public class StructBuilder {
* @return the errors to be generated by the calling method, or null if none * @return the errors to be generated by the calling method, or null if none
*/ */
private static String validateCollections(NodeList collections, int level) private static String validateCollections(NodeList collections, int level)
throws TransformerException { throws XPathExpressionException {
StringBuilder err = new StringBuilder(); StringBuilder err = new StringBuilder();
boolean trip = false; boolean trip = false;
String errs = null; String errs = null;
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < collections.getLength(); i++) { for (int i = 0; i < collections.getLength(); i++) {
Node n = collections.item(i); Node n = collections.item(i);
NodeList name = XPathAPI.selectNodeList(n, "name"); NodeList name = (NodeList) xPath.compile("name").evaluate(n, XPathConstants.NODESET);
if (name.getLength() != 1) { if (name.getLength() != 1) {
String pos = Integer.toString(i + 1); String pos = Integer.toString(i + 1);
err.append("-The level ").append(level) err.append("-The level ").append(level)
@@ -613,8 +623,9 @@ public class StructBuilder {
* created communities (e.g. the handles they have been assigned) * created communities (e.g. the handles they have been assigned)
*/ */
private static Element[] handleCommunities(Context context, NodeList communities, Community parent) private static Element[] handleCommunities(Context context, NodeList communities, Community parent)
throws TransformerException, SQLException, AuthorizeException { throws TransformerException, SQLException, AuthorizeException, XPathExpressionException {
Element[] elements = new Element[communities.getLength()]; Element[] elements = new Element[communities.getLength()];
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < communities.getLength(); i++) { for (int i = 0; i < communities.getLength(); i++) {
Community community; Community community;
@@ -634,7 +645,7 @@ public class StructBuilder {
// now update the metadata // now update the metadata
Node tn = communities.item(i); Node tn = communities.item(i);
for (Map.Entry<String, MetadataFieldName> entry : communityMap.entrySet()) { for (Map.Entry<String, MetadataFieldName> entry : communityMap.entrySet()) {
NodeList nl = XPathAPI.selectNodeList(tn, entry.getKey()); NodeList nl = (NodeList) xPath.compile(entry.getKey()).evaluate(tn, XPathConstants.NODESET);
if (nl.getLength() == 1) { if (nl.getLength() == 1) {
communityService.setMetadataSingleValue(context, community, communityService.setMetadataSingleValue(context, community,
entry.getValue(), null, getStringValue(nl.item(0))); entry.getValue(), null, getStringValue(nl.item(0)));
@@ -700,11 +711,11 @@ public class StructBuilder {
} }
// handle sub communities // handle sub communities
NodeList subCommunities = XPathAPI.selectNodeList(tn, "community"); NodeList subCommunities = (NodeList) xPath.compile("community").evaluate(tn, XPathConstants.NODESET);
Element[] subCommunityElements = handleCommunities(context, subCommunities, community); Element[] subCommunityElements = handleCommunities(context, subCommunities, community);
// handle collections // handle collections
NodeList collections = XPathAPI.selectNodeList(tn, "collection"); NodeList collections = (NodeList) xPath.compile("collection").evaluate(tn, XPathConstants.NODESET);
Element[] collectionElements = handleCollections(context, collections, community); Element[] collectionElements = handleCollections(context, collections, community);
int j; int j;
@@ -731,8 +742,9 @@ public class StructBuilder {
* created collections (e.g. the handle) * created collections (e.g. the handle)
*/ */
private static Element[] handleCollections(Context context, NodeList collections, Community parent) private static Element[] handleCollections(Context context, NodeList collections, Community parent)
throws TransformerException, SQLException, AuthorizeException { throws SQLException, AuthorizeException, XPathExpressionException {
Element[] elements = new Element[collections.getLength()]; Element[] elements = new Element[collections.getLength()];
XPath xPath = XPathFactory.newInstance().newXPath();
for (int i = 0; i < collections.getLength(); i++) { for (int i = 0; i < collections.getLength(); i++) {
Element element = new Element("collection"); Element element = new Element("collection");
@@ -745,7 +757,7 @@ public class StructBuilder {
// import the rest of the metadata // import the rest of the metadata
Node tn = collections.item(i); Node tn = collections.item(i);
for (Map.Entry<String, MetadataFieldName> entry : collectionMap.entrySet()) { for (Map.Entry<String, MetadataFieldName> entry : collectionMap.entrySet()) {
NodeList nl = XPathAPI.selectNodeList(tn, entry.getKey()); NodeList nl = (NodeList) xPath.compile(entry.getKey()).evaluate(tn, XPathConstants.NODESET);
if (nl.getLength() == 1) { if (nl.getLength() == 1) {
collectionService.setMetadataSingleValue(context, collection, collectionService.setMetadataSingleValue(context, collection,
entry.getValue(), null, getStringValue(nl.item(0))); entry.getValue(), null, getStringValue(nl.item(0)));

View File

@@ -41,10 +41,8 @@ public class MetadataDeletionScriptConfiguration<T extends MetadataDeletion> ext
Options options = new Options(); Options options = new Options();
options.addOption("m", "metadata", true, "metadata field name"); options.addOption("m", "metadata", true, "metadata field name");
options.getOption("m").setType(String.class);
options.addOption("l", "list", false, "lists the metadata fields that can be deleted"); options.addOption("l", "list", false, "lists the metadata fields that can be deleted");
options.getOption("l").setType(boolean.class);
super.options = options; super.options = options;
} }

View File

@@ -54,12 +54,9 @@ public class MetadataExportScriptConfiguration<T extends MetadataExport> extends
Options options = new Options(); Options options = new Options();
options.addOption("i", "id", true, "ID or handle of thing to export (item, collection, or community)"); options.addOption("i", "id", true, "ID or handle of thing to export (item, collection, or community)");
options.getOption("i").setType(String.class);
options.addOption("a", "all", false, options.addOption("a", "all", false,
"include all metadata fields that are not normally changed (e.g. provenance)"); "include all metadata fields that are not normally changed (e.g. provenance)");
options.getOption("a").setType(boolean.class);
options.addOption("h", "help", false, "help"); options.addOption("h", "help", false, "help");
options.getOption("h").setType(boolean.class);
super.options = options; super.options = options;

View File

@@ -19,7 +19,6 @@ public class MetadataImportCliScriptConfiguration extends MetadataImportScriptCo
public Options getOptions() { public Options getOptions() {
Options options = super.getOptions(); Options options = super.getOptions();
options.addOption("e", "email", true, "email address or user id of user (required if adding new items)"); options.addOption("e", "email", true, "email address or user id of user (required if adding new items)");
options.getOption("e").setType(String.class);
options.getOption("e").setRequired(true); options.getOption("e").setRequired(true);
super.options = options; super.options = options;
return options; return options;

View File

@@ -59,20 +59,14 @@ public class MetadataImportScriptConfiguration<T extends MetadataImport> extends
options.getOption("f").setRequired(true); options.getOption("f").setRequired(true);
options.addOption("s", "silent", false, options.addOption("s", "silent", false,
"silent operation - doesn't request confirmation of changes USE WITH CAUTION"); "silent operation - doesn't request confirmation of changes USE WITH CAUTION");
options.getOption("s").setType(boolean.class);
options.addOption("w", "workflow", false, "workflow - when adding new items, use collection workflow"); options.addOption("w", "workflow", false, "workflow - when adding new items, use collection workflow");
options.getOption("w").setType(boolean.class);
options.addOption("n", "notify", false, options.addOption("n", "notify", false,
"notify - when adding new items using a workflow, send notification emails"); "notify - when adding new items using a workflow, send notification emails");
options.getOption("n").setType(boolean.class);
options.addOption("v", "validate-only", false, options.addOption("v", "validate-only", false,
"validate - just validate the csv, don't run the import"); "validate - just validate the csv, don't run the import");
options.getOption("v").setType(boolean.class);
options.addOption("t", "template", false, options.addOption("t", "template", false,
"template - when adding new items, use the collection template (if it exists)"); "template - when adding new items, use the collection template (if it exists)");
options.getOption("t").setType(boolean.class);
options.addOption("h", "help", false, "help"); options.addOption("h", "help", false, "help");
options.getOption("h").setType(boolean.class);
super.options = options; super.options = options;
} }

View File

@@ -43,22 +43,14 @@ public class HarvestScriptConfiguration<T extends Harvest> extends ScriptConfigu
public Options getOptions() { public Options getOptions() {
Options options = new Options(); Options options = new Options();
options.addOption("p", "purge", false, "delete all items in the collection"); options.addOption("p", "purge", false, "delete all items in the collection");
options.getOption("p").setType(boolean.class);
options.addOption("r", "run", false, "run the standard harvest procedure"); options.addOption("r", "run", false, "run the standard harvest procedure");
options.getOption("r").setType(boolean.class);
options.addOption("g", "ping", false, "test the OAI server and set"); options.addOption("g", "ping", false, "test the OAI server and set");
options.getOption("g").setType(boolean.class);
options.addOption("s", "setup", false, "Set the collection up for harvesting"); options.addOption("s", "setup", false, "Set the collection up for harvesting");
options.getOption("s").setType(boolean.class);
options.addOption("S", "start", false, "start the harvest loop"); options.addOption("S", "start", false, "start the harvest loop");
options.getOption("S").setType(boolean.class);
options.addOption("R", "reset", false, "reset harvest status on all collections"); options.addOption("R", "reset", false, "reset harvest status on all collections");
options.getOption("R").setType(boolean.class);
options.addOption("P", "purgeCollections", false, "purge all harvestable collections"); options.addOption("P", "purgeCollections", false, "purge all harvestable collections");
options.getOption("P").setType(boolean.class);
options.addOption("o", "reimport", false, "reimport all items in the collection, " + options.addOption("o", "reimport", false, "reimport all items in the collection, " +
"this is equivalent to -p -r, purging all items in a collection and reimporting them"); "this is equivalent to -p -r, purging all items in a collection and reimporting them");
options.getOption("o").setType(boolean.class);
options.addOption("c", "collection", true, options.addOption("c", "collection", true,
"harvesting collection (handle or id)"); "harvesting collection (handle or id)");
options.addOption("t", "type", true, options.addOption("t", "type", true,
@@ -72,7 +64,6 @@ public class HarvestScriptConfiguration<T extends Harvest> extends ScriptConfigu
"crosswalk in dspace.cfg"); "crosswalk in dspace.cfg");
options.addOption("h", "help", false, "help"); options.addOption("h", "help", false, "help");
options.getOption("h").setType(boolean.class);
return options; return options;
} }

View File

@@ -51,6 +51,10 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.collections4.ComparatorUtils; import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.io.FileDeleteStrategy; import org.apache.commons.io.FileDeleteStrategy;
@@ -59,7 +63,6 @@ import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.dspace.app.itemimport.service.ItemImportService; import org.dspace.app.itemimport.service.ItemImportService;
import org.dspace.app.util.LocalSchemaFilenameFilter; import org.dspace.app.util.LocalSchemaFilenameFilter;
import org.dspace.app.util.RelationshipUtils; import org.dspace.app.util.RelationshipUtils;
@@ -861,7 +864,7 @@ public class ItemImportServiceImpl implements ItemImportService, InitializingBea
// Load all metadata schemas into the item. // Load all metadata schemas into the item.
protected void loadMetadata(Context c, Item myitem, String path) protected void loadMetadata(Context c, Item myitem, String path)
throws SQLException, IOException, ParserConfigurationException, throws SQLException, IOException, ParserConfigurationException,
SAXException, TransformerException, AuthorizeException { SAXException, TransformerException, AuthorizeException, XPathExpressionException {
// Load the dublin core metadata // Load the dublin core metadata
loadDublinCore(c, myitem, path + "dublin_core.xml"); loadDublinCore(c, myitem, path + "dublin_core.xml");
@@ -875,14 +878,15 @@ public class ItemImportServiceImpl implements ItemImportService, InitializingBea
protected void loadDublinCore(Context c, Item myitem, String filename) protected void loadDublinCore(Context c, Item myitem, String filename)
throws SQLException, IOException, ParserConfigurationException, throws SQLException, IOException, ParserConfigurationException,
SAXException, TransformerException, AuthorizeException { SAXException, TransformerException, AuthorizeException, XPathExpressionException {
Document document = loadXML(filename); Document document = loadXML(filename);
// Get the schema, for backward compatibility we will default to the // Get the schema, for backward compatibility we will default to the
// dublin core schema if the schema name is not available in the import // dublin core schema if the schema name is not available in the import
// file // file
String schema; String schema;
NodeList metadata = XPathAPI.selectNodeList(document, "/dublin_core"); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList metadata = (NodeList) xPath.compile("/dublin_core").evaluate(document, XPathConstants.NODESET);
Node schemaAttr = metadata.item(0).getAttributes().getNamedItem( Node schemaAttr = metadata.item(0).getAttributes().getNamedItem(
"schema"); "schema");
if (schemaAttr == null) { if (schemaAttr == null) {
@@ -892,8 +896,7 @@ public class ItemImportServiceImpl implements ItemImportService, InitializingBea
} }
// Get the nodes corresponding to formats // Get the nodes corresponding to formats
NodeList dcNodes = XPathAPI.selectNodeList(document, NodeList dcNodes = (NodeList) xPath.compile("/dublin_core/dcvalue").evaluate(document, XPathConstants.NODESET);
"/dublin_core/dcvalue");
if (!isQuiet) { if (!isQuiet) {
System.out.println("\tLoading dublin core from " + filename); System.out.println("\tLoading dublin core from " + filename);

View File

@@ -27,10 +27,12 @@ import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource; import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.xpath.XPathAPI;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.content.MetadataField; import org.dspace.content.MetadataField;
import org.dspace.content.MetadataSchema; import org.dspace.content.MetadataSchema;
@@ -170,24 +172,21 @@ public class MetadataUtilities {
* @param docBuilder DocumentBuilder * @param docBuilder DocumentBuilder
* @param is - InputStream of dublin_core.xml * @param is - InputStream of dublin_core.xml
* @return list of DtoMetadata representing the metadata fields relating to an Item * @return list of DtoMetadata representing the metadata fields relating to an Item
* @throws SQLException if database error
* @throws IOException if IO error * @throws IOException if IO error
* @throws ParserConfigurationException if parser config error * @throws ParserConfigurationException if parser config error
* @throws SAXException if XML error * @throws SAXException if XML error
* @throws TransformerException if transformer error
* @throws AuthorizeException if authorization error
*/ */
public static List<DtoMetadata> loadDublinCore(DocumentBuilder docBuilder, InputStream is) public static List<DtoMetadata> loadDublinCore(DocumentBuilder docBuilder, InputStream is)
throws SQLException, IOException, ParserConfigurationException, throws IOException, XPathExpressionException, SAXException {
SAXException, TransformerException, AuthorizeException {
Document document = docBuilder.parse(is); Document document = docBuilder.parse(is);
List<DtoMetadata> dtomList = new ArrayList<DtoMetadata>(); List<DtoMetadata> dtomList = new ArrayList<DtoMetadata>();
// Get the schema, for backward compatibility we will default to the // Get the schema, for backward compatibility we will default to the
// dublin core schema if the schema name is not available in the import file // dublin core schema if the schema name is not available in the import file
String schema = null; String schema;
NodeList metadata = XPathAPI.selectNodeList(document, "/dublin_core"); XPath xPath = XPathFactory.newInstance().newXPath();
NodeList metadata = (NodeList) xPath.compile("/dublin_core").evaluate(document, XPathConstants.NODESET);
Node schemaAttr = metadata.item(0).getAttributes().getNamedItem("schema"); Node schemaAttr = metadata.item(0).getAttributes().getNamedItem("schema");
if (schemaAttr == null) { if (schemaAttr == null) {
schema = MetadataSchemaEnum.DC.getName(); schema = MetadataSchemaEnum.DC.getName();
@@ -196,7 +195,7 @@ public class MetadataUtilities {
} }
// Get the nodes corresponding to formats // Get the nodes corresponding to formats
NodeList dcNodes = XPathAPI.selectNodeList(document, "/dublin_core/dcvalue"); NodeList dcNodes = (NodeList) xPath.compile("/dublin_core/dcvalue").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < dcNodes.getLength(); i++) { for (int i = 0; i < dcNodes.getLength(); i++) {
Node n = dcNodes.item(i); Node n = dcNodes.item(i);

View File

@@ -16,7 +16,7 @@ import java.io.StreamTokenizer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.jdom.Document; import org.jdom2.Document;
/** /**
* @author mwood * @author mwood

View File

@@ -29,9 +29,9 @@ import org.dspace.scripts.service.ScriptService;
import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelImpl;
import org.dspace.servicemanager.DSpaceKernelInit; import org.dspace.servicemanager.DSpaceKernelInit;
import org.dspace.services.RequestService; import org.dspace.services.RequestService;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.input.SAXBuilder; import org.jdom2.input.SAXBuilder;
/** /**
* A DSpace script launcher. * A DSpace script launcher.

View File

@@ -1,99 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.mediafilter;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.Logger;
import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.dspace.content.Item;
/*
* ExcelFilter
*
* Entries you must add to dspace.cfg:
*
* filter.plugins = blah, \
* Excel Text Extractor
*
* plugin.named.org.dspace.app.mediafilter.FormatFilter = \
* blah = blah, \
* org.dspace.app.mediafilter.ExcelFilter = Excel Text Extractor
*
* #Configure each filter's input Formats
* filter.org.dspace.app.mediafilter.ExcelFilter.inputFormats = Microsoft Excel, Microsoft Excel XML
*
*/
public class ExcelFilter extends MediaFilter {
private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ExcelFilter.class);
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
}
/**
* @return String bundle name
*/
public String getBundleName() {
return "TEXT";
}
/**
* @return String bitstream format
*/
public String getFormatString() {
return "Text";
}
/**
* @return String description
*/
public String getDescription() {
return "Extracted text";
}
/**
* @param item item
* @param source source input stream
* @param verbose verbose mode
* @return InputStream the resulting input stream
* @throws Exception if error
*/
@Override
public InputStream getDestinationStream(Item item, InputStream source, boolean verbose)
throws Exception {
String extractedText = null;
try {
POITextExtractor theExtractor = ExtractorFactory.createExtractor(source);
if (theExtractor instanceof ExcelExtractor) {
// for xls file
extractedText = (theExtractor).getText();
} else if (theExtractor instanceof XSSFExcelExtractor) {
// for xlsx file
extractedText = (theExtractor).getText();
}
} catch (Exception e) {
log.error("Error filtering bitstream: " + e.getMessage(), e);
throw e;
}
if (extractedText != null) {
// generate an input stream with the extracted text
return IOUtils.toInputStream(extractedText, StandardCharsets.UTF_8);
}
return null;
}
}

View File

@@ -1,82 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.mediafilter;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import javax.swing.text.Document;
import javax.swing.text.html.HTMLEditorKit;
import org.dspace.content.Item;
/*
*
* to do: helpful error messages - can't find mediafilter.cfg - can't
* instantiate filter - bitstream format doesn't exist
*
*/
public class HTMLFilter extends MediaFilter {
@Override
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
}
/**
* @return String bundle name
*/
@Override
public String getBundleName() {
return "TEXT";
}
/**
* @return String bitstream format
*/
@Override
public String getFormatString() {
return "Text";
}
/**
* @return String description
*/
@Override
public String getDescription() {
return "Extracted text";
}
/**
* @param currentItem item
* @param source source input stream
* @param verbose verbose mode
* @return InputStream the resulting input stream
* @throws Exception if error
*/
@Override
public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose)
throws Exception {
// try and read the document - set to ignore character set directive,
// assuming that the input stream is already set properly (I hope)
HTMLEditorKit kit = new HTMLEditorKit();
Document doc = kit.createDefaultDocument();
doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
kit.read(source, doc, 0);
String extractedText = doc.getText(0, doc.getLength());
// generate an input stream with the extracted text
byte[] textBytes = extractedText.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream bais = new ByteArrayInputStream(textBytes);
return bais;
}
}

View File

@@ -50,15 +50,11 @@ public class MediaFilterScriptConfiguration<T extends MediaFilterScript> extends
public Options getOptions() { public Options getOptions() {
Options options = new Options(); Options options = new Options();
options.addOption("v", "verbose", false, "print all extracted text and other details to STDOUT"); options.addOption("v", "verbose", false, "print all extracted text and other details to STDOUT");
options.getOption("v").setType(boolean.class);
options.addOption("q", "quiet", false, "do not print anything except in the event of errors."); options.addOption("q", "quiet", false, "do not print anything except in the event of errors.");
options.getOption("q").setType(boolean.class);
options.addOption("f", "force", false, "force all bitstreams to be processed"); options.addOption("f", "force", false, "force all bitstreams to be processed");
options.getOption("f").setType(boolean.class);
options.addOption("i", "identifier", true, "ONLY process bitstreams belonging to identifier"); options.addOption("i", "identifier", true, "ONLY process bitstreams belonging to identifier");
options.addOption("m", "maximum", true, "process no more than maximum items"); options.addOption("m", "maximum", true, "process no more than maximum items");
options.addOption("h", "help", false, "help"); options.addOption("h", "help", false, "help");
options.getOption("h").setType(boolean.class);
Option pluginOption = Option.builder("p") Option pluginOption = Option.builder("p")
.longOpt("plugins") .longOpt("plugins")

View File

@@ -1,137 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.mediafilter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import org.apache.logging.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.text.PDFTextStripper;
import org.dspace.content.Item;
import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory;
/*
*
* to do: helpful error messages - can't find mediafilter.cfg - can't
* instantiate filter - bitstream format doesn't exist
*
*/
public class PDFFilter extends MediaFilter {
private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PDFFilter.class);
@Override
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
}
/**
* @return String bundle name
*/
@Override
public String getBundleName() {
return "TEXT";
}
/**
* @return String bitstreamformat
*/
@Override
public String getFormatString() {
return "Text";
}
/**
* @return String description
*/
@Override
public String getDescription() {
return "Extracted text";
}
/**
* @param currentItem item
* @param source source input stream
* @param verbose verbose mode
* @return InputStream the resulting input stream
* @throws Exception if error
*/
@Override
public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose)
throws Exception {
ConfigurationService configurationService
= DSpaceServicesFactory.getInstance().getConfigurationService();
try {
boolean useTemporaryFile = configurationService.getBooleanProperty("pdffilter.largepdfs", false);
// get input stream from bitstream
// pass to filter, get string back
PDFTextStripper pts = new PDFTextStripper();
pts.setSortByPosition(true);
PDDocument pdfDoc = null;
Writer writer = null;
File tempTextFile = null;
ByteArrayOutputStream byteStream = null;
if (useTemporaryFile) {
tempTextFile = File.createTempFile("dspacepdfextract" + source.hashCode(), ".txt");
tempTextFile.deleteOnExit();
writer = new OutputStreamWriter(new FileOutputStream(tempTextFile));
} else {
byteStream = new ByteArrayOutputStream();
writer = new OutputStreamWriter(byteStream);
}
try {
pdfDoc = PDDocument.load(source);
pts.writeText(pdfDoc, writer);
} catch (InvalidPasswordException ex) {
log.error("PDF is encrypted. Cannot extract text (item: {})",
() -> currentItem.getHandle());
return null;
} finally {
try {
if (pdfDoc != null) {
pdfDoc.close();
}
} catch (Exception e) {
log.error("Error closing PDF file: " + e.getMessage(), e);
}
try {
writer.close();
} catch (Exception e) {
log.error("Error closing temporary extract file: " + e.getMessage(), e);
}
}
if (useTemporaryFile) {
return new FileInputStream(tempTextFile);
} else {
byte[] bytes = byteStream.toByteArray();
return new ByteArrayInputStream(bytes);
}
} catch (OutOfMemoryError oome) {
log.error("Error parsing PDF document " + oome.getMessage(), oome);
if (!configurationService.getBooleanProperty("pdffilter.skiponmemoryexception", false)) {
throw oome;
}
}
return null;
}
}

View File

@@ -1,72 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.mediafilter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.xmlbeans.XmlException;
import org.dspace.content.Item;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Extract flat text from Microsoft Word documents (.doc, .docx).
*/
public class PoiWordFilter
extends MediaFilter {
private static final Logger LOG = LoggerFactory.getLogger(PoiWordFilter.class);
@Override
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
}
@Override
public String getBundleName() {
return "TEXT";
}
@Override
public String getFormatString() {
return "Text";
}
@Override
public String getDescription() {
return "Extracted text";
}
@Override
public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose)
throws Exception {
String text;
try {
// get input stream from bitstream, pass to filter, get string back
POITextExtractor extractor = ExtractorFactory.createExtractor(source);
text = extractor.getText();
} catch (IOException | OpenXML4JException | XmlException e) {
System.err.format("Invalid File Format: %s%n", e.getMessage());
LOG.error("Unable to parse the bitstream: ", e);
throw e;
}
// if verbose flag is set, print out extracted text to STDOUT
if (verbose) {
System.out.println(text);
}
// return the extracted text as a stream.
return new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
}
}

View File

@@ -1,113 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.mediafilter;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.apache.logging.log4j.Logger;
import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
import org.dspace.content.Item;
/*
* TODO: Allow user to configure extraction of only text or only notes
*
*/
public class PowerPointFilter extends MediaFilter {
private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PowerPointFilter.class);
@Override
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
}
/**
* @return String bundle name
*/
@Override
public String getBundleName() {
return "TEXT";
}
/**
* @return String bitstream format
*
* TODO: Check that this is correct
*/
@Override
public String getFormatString() {
return "Text";
}
/**
* @return String description
*/
@Override
public String getDescription() {
return "Extracted text";
}
/**
* @param currentItem item
* @param source source input stream
* @param verbose verbose mode
* @return InputStream the resulting input stream
* @throws Exception if error
*/
@Override
public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose)
throws Exception {
try {
String extractedText = null;
new ExtractorFactory();
POITextExtractor pptExtractor = ExtractorFactory
.createExtractor(source);
// PowerPoint XML files and legacy format PowerPoint files
// require different classes and APIs for text extraction
// If this is a PowerPoint XML file, extract accordingly
if (pptExtractor instanceof XSLFPowerPointExtractor) {
// The true method arguments indicate that text from
// the slides and the notes is desired
extractedText = ((XSLFPowerPointExtractor) pptExtractor)
.getText(true, true);
} else if (pptExtractor instanceof PowerPointExtractor) { // Legacy PowerPoint files
extractedText = ((PowerPointExtractor) pptExtractor).getText()
+ " " + ((PowerPointExtractor) pptExtractor).getNotes();
}
if (extractedText != null) {
// if verbose flag is set, print out extracted text
// to STDOUT
if (verbose) {
System.out.println(extractedText);
}
// generate an input stream with the extracted text
byte[] textBytes = extractedText.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(textBytes);
return bais;
}
} catch (Exception e) {
log.error("Error filtering bitstream: " + e.getMessage(), e);
throw e;
}
return null;
}
}

View File

@@ -0,0 +1,183 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.mediafilter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.sax.BodyContentHandler;
import org.apache.tika.sax.ContentHandlerDecorator;
import org.dspace.content.Item;
import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory;
import org.xml.sax.SAXException;
/**
* Text Extraction media filter which uses Apache Tika to extract text from a large number of file formats (including
* all Microsoft formats, PDF, HTML, Text, etc). For a more complete list of file formats supported by Tika see the
* Tika documentation: https://tika.apache.org/2.3.0/formats.html
*/
public class TikaTextExtractionFilter
extends MediaFilter {
private final static Logger log = LogManager.getLogger();
@Override
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
}
@Override
public String getBundleName() {
return "TEXT";
}
@Override
public String getFormatString() {
return "Text";
}
@Override
public String getDescription() {
return "Extracted text";
}
@Override
public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose)
throws Exception {
ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService();
boolean useTemporaryFile = configurationService.getBooleanProperty("textextractor.use-temp-file", false);
if (useTemporaryFile) {
// Extract text out of source file using a temp file, returning results as InputStream
return extractUsingTempFile(source, verbose);
}
// Not using temporary file. We'll use Tika's default in-memory parsing.
// Get maximum characters to extract. Default is 100,000 chars, which is also Tika's default setting.
String extractedText;
int maxChars = configurationService.getIntProperty("textextractor.max-chars", 100000);
try {
// Use Tika to extract text from input. Tika will automatically detect the file type.
Tika tika = new Tika();
tika.setMaxStringLength(maxChars); // Tell Tika the maximum number of characters to extract
extractedText = tika.parseToString(source);
} catch (IOException e) {
System.err.format("Unable to extract text from bitstream in Item %s%n", currentItem.getID().toString());
e.printStackTrace();
log.error("Unable to extract text from bitstream in Item {}", currentItem.getID().toString(), e);
throw e;
} catch (OutOfMemoryError oe) {
System.err.format("OutOfMemoryError occurred when extracting text from bitstream in Item %s. " +
"You may wish to enable 'textextractor.use-temp-file'.%n", currentItem.getID().toString());
oe.printStackTrace();
log.error("OutOfMemoryError occurred when extracting text from bitstream in Item {}. " +
"You may wish to enable 'textextractor.use-temp-file'.", currentItem.getID().toString(), oe);
throw oe;
}
if (StringUtils.isNotEmpty(extractedText)) {
// if verbose flag is set, print out extracted text to STDOUT
if (verbose) {
System.out.println("(Verbose mode) Extracted text:");
System.out.println(extractedText);
}
// return the extracted text as a UTF-8 stream.
return new ByteArrayInputStream(extractedText.getBytes(StandardCharsets.UTF_8));
}
return null;
}
/**
* Extracts the text out of a given source InputStream, using a temporary file. This decreases the amount of memory
* necessary for text extraction, but can be slower as it requires writing extracted text to a temporary file.
* @param source source InputStream
* @param verbose verbose mode enabled/disabled
* @return InputStream for temporary file containing extracted text
* @throws IOException
* @throws SAXException
* @throws TikaException
*/
private InputStream extractUsingTempFile(InputStream source, boolean verbose)
throws IOException, TikaException, SAXException {
File tempExtractedTextFile = File.createTempFile("dspacetextextract" + source.hashCode(), ".txt");
if (verbose) {
System.out.println("(Verbose mode) Extracted text was written to temporary file at " +
tempExtractedTextFile.getAbsolutePath());
} else {
tempExtractedTextFile.deleteOnExit();
}
// Open temp file for writing
try (FileWriter writer = new FileWriter(tempExtractedTextFile, StandardCharsets.UTF_8)) {
// Initialize a custom ContentHandlerDecorator which is a BodyContentHandler.
// This mimics the behavior of Tika().parseToString(), which only extracts text from the body of the file.
// This custom Handler writes any extracted text to the temp file.
ContentHandlerDecorator handler = new BodyContentHandler(new ContentHandlerDecorator() {
/**
* Write all extracted characters directly to the temp file.
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
try {
writer.append(new String(ch), start, length);
} catch (IOException e) {
String errorMsg = String.format("Could not append to temporary file at %s " +
"when performing text extraction",
tempExtractedTextFile.getAbsolutePath());
log.error(errorMsg, e);
throw new SAXException(errorMsg, e);
}
}
/**
* Write all ignorable whitespace directly to the temp file.
* This mimics the behaviour of Tika().parseToString() which extracts ignorableWhitespace characters
* (like blank lines, indentations, etc.), so that we get the same extracted text either way.
*/
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
try {
writer.append(new String(ch), start, length);
} catch (IOException e) {
String errorMsg = String.format("Could not append to temporary file at %s " +
"when performing text extraction",
tempExtractedTextFile.getAbsolutePath());
log.error(errorMsg, e);
throw new SAXException(errorMsg, e);
}
}
});
AutoDetectParser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
// parse our source InputStream using the above custom handler
parser.parse(source, handler, metadata);
}
// At this point, all extracted text is written to our temp file. So, return a FileInputStream for that file
return new FileInputStream(tempExtractedTextFile);
}
}

View File

@@ -1,58 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.app.util;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import org.dspace.core.Context;
import org.dspace.servicemanager.DSpaceKernelImpl;
import org.dspace.servicemanager.DSpaceKernelInit;
import org.dspace.services.CachingService;
/**
* List all EhCache CacheManager and Cache instances.
*
* <p>This is a debugging tool, not used in the daily operation of DSpace.
* Just run it from the installed instance using
* {@code bin/dspace dsrun org.dspace.app.util.CacheSnooper}
* to check that the cache configuration is what you expect it to be,
* given your configuration.
*
* <p>This was created to prove a specific cache configuration patch,
* but I leave it here in the hope that it may be useful to others.
*
* @author Mark H. Wood <mwood@iupui.edu>
*/
public class CacheSnooper {
private CacheSnooper() { }
public static void main(String[] argv) {
// Ensure that the DSpace kernel is started.
DSpaceKernelImpl kernel = DSpaceKernelInit.getKernel(null);
// Ensure that the services cache manager is started.
CachingService serviceCaches = kernel.getServiceManager()
.getServiceByName(null, CachingService.class);
// Ensure that the database layer is started.
Context ctx = new Context();
// List those caches!
for (CacheManager manager : CacheManager.ALL_CACHE_MANAGERS) {
System.out.format("CacheManager: %s%n", manager);
for (String cacheName : manager.getCacheNames()) {
Cache cache = manager.getCache(cacheName);
System.out.format(" Cache: '%s'; maxHeap: %d; maxDisk: %d%n",
cacheName,
cache.getCacheConfiguration().getMaxEntriesLocalHeap(),
cache.getCacheConfiguration().getMaxEntriesLocalDisk());
}
}
}
}

View File

@@ -37,6 +37,7 @@ public class Configuration {
* <li>{@code --property name} prints the value of the DSpace configuration * <li>{@code --property name} prints the value of the DSpace configuration
* property {@code name} to the standard output.</li> * property {@code name} to the standard output.</li>
* <li>{@code --raw} suppresses parameter substitution in the output.</li> * <li>{@code --raw} suppresses parameter substitution in the output.</li>
* <li>{@code --first} print only the first of multiple values.</li>
* <li>{@code --help} describes these options.</li> * <li>{@code --help} describes these options.</li>
* </ul> * </ul>
* If the property does not exist, nothing is written. * If the property does not exist, nothing is written.
@@ -51,6 +52,8 @@ public class Configuration {
"optional name of the module in which 'property' exists"); "optional name of the module in which 'property' exists");
options.addOption("r", "raw", false, options.addOption("r", "raw", false,
"do not do property substitution on the value"); "do not do property substitution on the value");
options.addOption("f", "first", false,
"display only the first value of an array property");
options.addOption("?", "Get help"); options.addOption("?", "Get help");
options.addOption("h", "help", false, "Get help"); options.addOption("h", "help", false, "Get help");
@@ -90,19 +93,36 @@ public class Configuration {
propNameBuilder.append(cmd.getOptionValue('p')); propNameBuilder.append(cmd.getOptionValue('p'));
String propName = propNameBuilder.toString(); String propName = propNameBuilder.toString();
// Print the property's value, if it exists // Print the property's value(s), if it exists
ConfigurationService cfg = DSpaceServicesFactory.getInstance().getConfigurationService(); ConfigurationService cfg = DSpaceServicesFactory.getInstance().getConfigurationService();
if (!cfg.hasProperty(propName)) { if (!cfg.hasProperty(propName)) {
System.out.println(); System.out.println();
} else { } else {
String val;
if (cmd.hasOption('r')) { if (cmd.hasOption('r')) {
val = cfg.getPropertyValue(propName).toString(); // Print "raw" values (without property substitutions)
Object rawValue = cfg.getPropertyValue(propName);
if (rawValue.getClass().isArray()) {
for (Object value : (Object[]) rawValue) {
System.out.println(value.toString());
if (cmd.hasOption('f')) {
break; // If --first print only one value
}
}
} else { // Not an array
System.out.println(rawValue.toString());
}
} else { } else {
val = cfg.getProperty(propName); // Print values with property substitutions
String[] values = cfg.getArrayProperty(propName);
for (String value : values) {
System.out.println(value);
if (cmd.hasOption('f')) {
break; // If --first print only one value
} }
System.out.println(val);
} }
}
}
System.exit(0); System.exit(0);
} }
} }

View File

@@ -86,8 +86,10 @@ public class GoogleBitstreamComparator implements Comparator<Bitstream> {
if (priority1 > priority2) { if (priority1 > priority2) {
return 1; return 1;
} else if (priority1 == priority2) { } else if (priority1 == priority2) {
if (b1.getSizeBytes() <= b2.getSizeBytes()) { if (b1.getSizeBytes() < b2.getSizeBytes()) {
return 1; return 1;
} else if (b1.getSizeBytes() == b2.getSizeBytes()) {
return 0;
} else { } else {
return -1; return -1;
} }

View File

@@ -42,7 +42,7 @@ import org.dspace.core.Context;
import org.dspace.handle.factory.HandleServiceFactory; import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
/** /**
* Configuration and mapping for Google Scholar output metadata * Configuration and mapping for Google Scholar output metadata

View File

@@ -16,10 +16,10 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.sun.syndication.feed.module.opensearch.OpenSearchModule; import com.rometools.modules.opensearch.OpenSearchModule;
import com.sun.syndication.feed.module.opensearch.entity.OSQuery; import com.rometools.modules.opensearch.entity.OSQuery;
import com.sun.syndication.feed.module.opensearch.impl.OpenSearchModuleImpl; import com.rometools.modules.opensearch.impl.OpenSearchModuleImpl;
import com.sun.syndication.io.FeedException; import com.rometools.rome.io.FeedException;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.dspace.app.util.service.OpenSearchService; import org.dspace.app.util.service.OpenSearchService;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
@@ -29,11 +29,11 @@ import org.dspace.discovery.IndexableObject;
import org.dspace.handle.service.HandleService; import org.dspace.handle.service.HandleService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.JDOMException;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.output.DOMOutputter; import org.jdom2.output.DOMOutputter;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@@ -192,7 +192,7 @@ public class OpenSearchServiceImpl implements OpenSearchService {
* @param scope - null for the entire repository, or a collection/community handle * @param scope - null for the entire repository, or a collection/community handle
* @return Service Document * @return Service Document
*/ */
protected org.jdom.Document getServiceDocument(String scope) { protected org.jdom2.Document getServiceDocument(String scope) {
ConfigurationService config = DSpaceServicesFactory.getInstance().getConfigurationService(); ConfigurationService config = DSpaceServicesFactory.getInstance().getConfigurationService();
Namespace ns = Namespace.getNamespace(osNs); Namespace ns = Namespace.getNamespace(osNs);
@@ -245,7 +245,7 @@ public class OpenSearchServiceImpl implements OpenSearchService {
url.setAttribute("template", template.toString()); url.setAttribute("template", template.toString());
root.addContent(url); root.addContent(url);
} }
return new org.jdom.Document(root); return new org.jdom2.Document(root);
} }
/** /**
@@ -255,7 +255,7 @@ public class OpenSearchServiceImpl implements OpenSearchService {
* @return W3C Document object * @return W3C Document object
* @throws IOException if IO error * @throws IOException if IO error
*/ */
protected Document jDomToW3(org.jdom.Document jdomDoc) throws IOException { protected Document jDomToW3(org.jdom2.Document jdomDoc) throws IOException {
DOMOutputter domOut = new DOMOutputter(); DOMOutputter domOut = new DOMOutputter();
try { try {
return domOut.output(jdomDoc); return domOut.output(jdomDoc);

View File

@@ -15,26 +15,26 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import com.sun.syndication.feed.module.DCModule; import com.rometools.modules.itunes.EntryInformation;
import com.sun.syndication.feed.module.DCModuleImpl; import com.rometools.modules.itunes.EntryInformationImpl;
import com.sun.syndication.feed.module.Module; import com.rometools.modules.itunes.types.Duration;
import com.sun.syndication.feed.module.itunes.EntryInformation; import com.rometools.rome.feed.module.DCModule;
import com.sun.syndication.feed.module.itunes.EntryInformationImpl; import com.rometools.rome.feed.module.DCModuleImpl;
import com.sun.syndication.feed.module.itunes.types.Duration; import com.rometools.rome.feed.module.Module;
import com.sun.syndication.feed.synd.SyndContent; import com.rometools.rome.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl; import com.rometools.rome.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEnclosure; import com.rometools.rome.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEnclosureImpl; import com.rometools.rome.feed.synd.SyndEnclosureImpl;
import com.sun.syndication.feed.synd.SyndEntry; import com.rometools.rome.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl; import com.rometools.rome.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed; import com.rometools.rome.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl; import com.rometools.rome.feed.synd.SyndFeedImpl;
import com.sun.syndication.feed.synd.SyndImage; import com.rometools.rome.feed.synd.SyndImage;
import com.sun.syndication.feed.synd.SyndImageImpl; import com.rometools.rome.feed.synd.SyndImageImpl;
import com.sun.syndication.feed.synd.SyndPerson; import com.rometools.rome.feed.synd.SyndPerson;
import com.sun.syndication.feed.synd.SyndPersonImpl; import com.rometools.rome.feed.synd.SyndPersonImpl;
import com.sun.syndication.io.FeedException; import com.rometools.rome.io.FeedException;
import com.sun.syndication.io.SyndFeedOutput; import com.rometools.rome.io.SyndFeedOutput;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;

View File

@@ -20,7 +20,6 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@@ -290,20 +289,13 @@ public class ShibAuthentication implements AuthenticationMethod {
try { try {
// User has not successfuly authenticated via shibboleth. // User has not successfuly authenticated via shibboleth.
if (request == null || if (request == null ||
context.getCurrentUser() == null || context.getCurrentUser() == null) {
request.getSession().getAttribute("shib.authenticated") == null) {
return Collections.EMPTY_LIST; return Collections.EMPTY_LIST;
} }
// If we have already calculated the special groups then return them. if (context.getSpecialGroups().size() > 0 ) {
if (request.getSession().getAttribute("shib.specialgroup") != null) {
log.debug("Returning cached special groups."); log.debug("Returning cached special groups.");
List<UUID> sessionGroupIds = (List<UUID>) request.getSession().getAttribute("shib.specialgroup"); return context.getSpecialGroups();
List<Group> result = new ArrayList<>();
for (UUID uuid : sessionGroupIds) {
result.add(groupService.find(context, uuid));
}
return result;
} }
log.debug("Starting to determine special groups"); log.debug("Starting to determine special groups");
@@ -396,16 +388,8 @@ public class ShibAuthentication implements AuthenticationMethod {
log.info("Added current EPerson to special groups: " + groups); log.info("Added current EPerson to special groups: " + groups);
List<UUID> groupIds = new ArrayList<>();
for (Group group : groups) {
groupIds.add(group.getID());
}
// Cache the special groups, so we don't have to recalculate them again
// for this session.
request.setAttribute("shib.specialgroup", groupIds);
return new ArrayList<>(groups); return new ArrayList<>(groups);
} catch (Throwable t) { } catch (Throwable t) {
log.error("Unable to validate any sepcial groups this user may belong too because of an exception.", t); log.error("Unable to validate any sepcial groups this user may belong too because of an exception.", t);
return Collections.EMPTY_LIST; return Collections.EMPTY_LIST;

View File

@@ -21,7 +21,8 @@ import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.authority.AuthorityValue; import org.dspace.authority.AuthorityValue;
import org.dspace.authority.SolrAuthorityInterface; import org.dspace.authority.SolrAuthorityInterface;
import org.dspace.external.OrcidRestConnector; import org.dspace.external.OrcidRestConnector;
@@ -40,7 +41,7 @@ import org.orcid.jaxb.model.v3.release.search.Result;
*/ */
public class Orcidv3SolrAuthorityImpl implements SolrAuthorityInterface { public class Orcidv3SolrAuthorityImpl implements SolrAuthorityInterface {
private static Logger log = Logger.getLogger(Orcidv3SolrAuthorityImpl.class); private final static Logger log = LogManager.getLogger();
private OrcidRestConnector orcidRestConnector; private OrcidRestConnector orcidRestConnector;
private String OAUTHUrl; private String OAUTHUrl;

View File

@@ -14,11 +14,12 @@ import java.util.Iterator;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException; import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@@ -62,36 +63,26 @@ public class XMLUtils {
/** /**
* @param xml The starting context (a Node or a Document, for example). * @param xml The starting context (a Node or a Document, for example).
* @param NodeListXPath xpath * @param nodeListXPath xpath
* @return A Node matches the NodeListXPath * @return A Node matches the NodeListXPath
* null if nothing matches the NodeListXPath * null if nothing matches the NodeListXPath
* @throws XPathExpressionException if xpath error * @throws XPathExpressionException if xpath error
*/ */
public static Node getNode(Node xml, String NodeListXPath) throws XPathExpressionException { public static Node getNode(Node xml, String nodeListXPath) throws XPathExpressionException {
Node result = null; XPath xPath = XPathFactory.newInstance().newXPath();
try { return (Node) xPath.compile(nodeListXPath).evaluate(xml, XPathConstants.NODE);
result = XPathAPI.selectSingleNode(xml, NodeListXPath);
} catch (TransformerException e) {
log.error("Error", e);
}
return result;
} }
/** /**
* @param xml The starting context (a Node or a Document, for example). * @param xml The starting context (a Node or a Document, for example).
* @param NodeListXPath xpath * @param nodeListXPath xpath
* @return A NodeList containing the nodes that match the NodeListXPath * @return A NodeList containing the nodes that match the NodeListXPath
* null if nothing matches the NodeListXPath * null if nothing matches the NodeListXPath
* @throws XPathExpressionException if xpath error * @throws XPathExpressionException if xpath error
*/ */
public static NodeList getNodeList(Node xml, String NodeListXPath) throws XPathExpressionException { public static NodeList getNodeList(Node xml, String nodeListXPath) throws XPathExpressionException {
NodeList nodeList = null; XPath xPath = XPathFactory.newInstance().newXPath();
try { return (NodeList) xPath.compile(nodeListXPath).evaluate(xml, XPathConstants.NODESET);
nodeList = XPathAPI.selectNodeList(xml, NodeListXPath);
} catch (TransformerException e) {
log.error("Error", e);
}
return nodeList;
} }
public static Iterator<Node> getNodeListIterator(Node xml, String NodeListXPath) throws XPathExpressionException { public static Iterator<Node> getNodeListIterator(Node xml, String NodeListXPath) throws XPathExpressionException {

View File

@@ -93,7 +93,7 @@ public class ResourcePolicy implements ReloadableEntity<Integer> {
private String rptype; private String rptype;
@Lob @Lob
@Type(type = "org.hibernate.type.MaterializedClobType") @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
@Column(name = "rpdescription") @Column(name = "rpdescription")
private String rpdescription; private String rpdescription;

View File

@@ -11,6 +11,7 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection; import org.dspace.content.Collection;
import org.dspace.content.Community; import org.dspace.content.Community;
@@ -202,6 +203,8 @@ public class BrowseEngine {
// get the table name that we are going to be getting our data from // get the table name that we are going to be getting our data from
dao.setTable(browseIndex.getTableName()); dao.setTable(browseIndex.getTableName());
dao.setStartsWith(StringUtils.lowerCase(scope.getStartsWith()));
// tell the browse query whether we are ascending or descending on the value // tell the browse query whether we are ascending or descending on the value
dao.setAscending(scope.isAscending()); dao.setAscending(scope.isAscending());
@@ -248,9 +251,6 @@ public class BrowseEngine {
} }
} }
// this is the total number of results in answer to the query
int total = getTotalResults();
// assemble the ORDER BY clause // assemble the ORDER BY clause
String orderBy = browseIndex.getSortField(scope.isSecondLevel()); String orderBy = browseIndex.getSortField(scope.isSecondLevel());
if (scope.getSortBy() > 0) { if (scope.getSortBy() > 0) {
@@ -258,6 +258,9 @@ public class BrowseEngine {
} }
dao.setOrderField(orderBy); dao.setOrderField(orderBy);
// this is the total number of results in answer to the query
int total = getTotalResults();
int offset = scope.getOffset(); int offset = scope.getOffset();
String rawFocusValue = null; String rawFocusValue = null;
if (offset < 1 && (scope.hasJumpToItem() || scope.hasJumpToValue() || scope.hasStartsWith())) { if (offset < 1 && (scope.hasJumpToItem() || scope.hasJumpToValue() || scope.hasStartsWith())) {
@@ -269,9 +272,6 @@ public class BrowseEngine {
String focusValue = normalizeJumpToValue(rawFocusValue); String focusValue = normalizeJumpToValue(rawFocusValue);
log.debug("browsing using focus: " + focusValue); log.debug("browsing using focus: " + focusValue);
// Convert the focus value into an offset
offset = getOffsetForValue(focusValue);
} }
dao.setOffset(offset); dao.setOffset(offset);
@@ -684,13 +684,11 @@ public class BrowseEngine {
// our count, storing them locally to reinstate later // our count, storing them locally to reinstate later
String focusField = dao.getJumpToField(); String focusField = dao.getJumpToField();
String focusValue = dao.getJumpToValue(); String focusValue = dao.getJumpToValue();
String orderField = dao.getOrderField();
int limit = dao.getLimit(); int limit = dao.getLimit();
int offset = dao.getOffset(); int offset = dao.getOffset();
dao.setJumpToField(null); dao.setJumpToField(null);
dao.setJumpToValue(null); dao.setJumpToValue(null);
dao.setOrderField(null);
dao.setLimit(-1); dao.setLimit(-1);
dao.setOffset(-1); dao.setOffset(-1);
@@ -700,7 +698,6 @@ public class BrowseEngine {
// now put back the values we removed for this method // now put back the values we removed for this method
dao.setJumpToField(focusField); dao.setJumpToField(focusField);
dao.setJumpToValue(focusValue); dao.setJumpToValue(focusValue);
dao.setOrderField(orderField);
dao.setLimit(limit); dao.setLimit(limit);
dao.setOffset(offset); dao.setOffset(offset);
dao.setCountValues(null); dao.setCountValues(null);

View File

@@ -205,6 +205,9 @@ public class SolrBrowseDAO implements BrowseDAO {
} else if (valuePartial) { } else if (valuePartial) {
query.addFilterQueries("{!field f=" + facetField + "_partial}" + value); query.addFilterQueries("{!field f=" + facetField + "_partial}" + value);
} }
if (StringUtils.isNotBlank(startsWith) && orderField != null) {
query.addFilterQueries("bi_" + orderField + "_sort:" + startsWith + "*");
}
// filter on item to be sure to don't include any other object // filter on item to be sure to don't include any other object
// indexed in the Discovery Search core // indexed in the Discovery Search core
query.addFilterQueries("search.resourcetype:" + IndexableItem.TYPE); query.addFilterQueries("search.resourcetype:" + IndexableItem.TYPE);

View File

@@ -243,11 +243,11 @@ public abstract class DSpaceObjectServiceImpl<T extends DSpaceObject> implements
boolean authorityControlled = metadataAuthorityService.isAuthorityControlled(metadataField); boolean authorityControlled = metadataAuthorityService.isAuthorityControlled(metadataField);
boolean authorityRequired = metadataAuthorityService.isAuthorityRequired(metadataField); boolean authorityRequired = metadataAuthorityService.isAuthorityRequired(metadataField);
List<MetadataValue> newMetadata = new ArrayList<>(values.size()); List<MetadataValue> newMetadata = new ArrayList<>();
// We will not verify that they are valid entries in the registry // We will not verify that they are valid entries in the registry
// until update() is called. // until update() is called.
for (int i = 0; i < values.size(); i++) { for (int i = 0; i < values.size(); i++) {
if (values.get(i) != null) {
if (authorities != null && authorities.size() >= i) { if (authorities != null && authorities.size() >= i) {
if (StringUtils.startsWith(authorities.get(i), Constants.VIRTUAL_AUTHORITY_PREFIX)) { if (StringUtils.startsWith(authorities.get(i), Constants.VIRTUAL_AUTHORITY_PREFIX)) {
continue; continue;
@@ -285,7 +285,6 @@ public abstract class DSpaceObjectServiceImpl<T extends DSpaceObject> implements
.get(i) + "\""); .get(i) + "\"");
} }
} }
if (values.get(i) != null) {
// remove control unicode char // remove control unicode char
String temp = values.get(i).trim(); String temp = values.get(i).trim();
char[] dcvalue = temp.toCharArray(); char[] dcvalue = temp.toCharArray();
@@ -298,13 +297,11 @@ public abstract class DSpaceObjectServiceImpl<T extends DSpaceObject> implements
} }
} }
metadataValue.setValue(String.valueOf(dcvalue)); metadataValue.setValue(String.valueOf(dcvalue));
} else {
metadataValue.setValue(null);
}
//An update here isn't needed, this is persited upon the merge of the owning object //An update here isn't needed, this is persited upon the merge of the owning object
// metadataValueService.update(context, metadataValue); // metadataValueService.update(context, metadataValue);
dso.addDetails(metadataField.toString()); dso.addDetails(metadataField.toString());
} }
}
setMetadataModified(dso); setMetadataModified(dso);
return newMetadata; return newMetadata;
} }

View File

@@ -911,6 +911,12 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl<Item> implements It
@Override @Override
public void move(Context context, Item item, Collection from, Collection to) public void move(Context context, Item item, Collection from, Collection to)
throws SQLException, AuthorizeException, IOException { throws SQLException, AuthorizeException, IOException {
// If the two collections are the same, do nothing.
if (from.equals(to)) {
return;
}
// Use the normal move method, and default to not inherit permissions // Use the normal move method, and default to not inherit permissions
this.move(context, item, from, to, false); this.move(context, item, from, to, false);
} }

View File

@@ -59,7 +59,7 @@ public class MetadataValue implements ReloadableEntity<Integer> {
* The value of the field * The value of the field
*/ */
@Lob @Lob
@Type(type = "org.hibernate.type.MaterializedClobType") @Type(type = "org.dspace.storage.rdbms.hibernate.DatabaseAwareLobType")
@Column(name = "text_value") @Column(name = "text_value")
private String value; private String value;

View File

@@ -14,8 +14,8 @@ import java.util.List;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* Crosswalk descriptive metadata to and from DIM (DSpace Intermediate * Crosswalk descriptive metadata to and from DIM (DSpace Intermediate

View File

@@ -40,8 +40,8 @@ import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.handle.service.HandleService; import org.dspace.handle.service.HandleService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* Crosswalk of technical metadata for DSpace AIP. This is * Crosswalk of technical metadata for DSpace AIP. This is

View File

@@ -23,8 +23,8 @@ import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService; import org.dspace.content.service.ItemService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* DIM dissemination crosswalk * DIM dissemination crosswalk

View File

@@ -19,8 +19,8 @@ import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService; import org.dspace.content.service.ItemService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* DIM ingestion crosswalk * DIM ingestion crosswalk

View File

@@ -14,8 +14,8 @@ import java.util.List;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* Dissemination Crosswalk plugin -- translate DSpace native * Dissemination Crosswalk plugin -- translate DSpace native

View File

@@ -14,7 +14,7 @@ import java.util.List;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
/** /**
* Ingestion Crosswalk plugin -- translate an external metadata format * Ingestion Crosswalk plugin -- translate an external metadata format

View File

@@ -24,11 +24,11 @@ import org.dspace.core.Context;
import org.dspace.core.factory.CoreServiceFactory; import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.JDOMException;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.input.SAXBuilder; import org.jdom2.input.SAXBuilder;
/** /**
* METS dissemination crosswalk * METS dissemination crosswalk

View File

@@ -35,8 +35,8 @@ import org.dspace.eperson.Group;
import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.factory.EPersonServiceFactory;
import org.dspace.eperson.service.EPersonService; import org.dspace.eperson.service.EPersonService;
import org.dspace.eperson.service.GroupService; import org.dspace.eperson.service.GroupService;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* METSRights Ingestion and Dissemination Crosswalk * METSRights Ingestion and Dissemination Crosswalk

View File

@@ -15,7 +15,6 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
@@ -42,16 +41,18 @@ import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.handle.service.HandleService; import org.dspace.handle.service.HandleService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Attribute; import org.jdom2.Attribute;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.JDOMException;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.Text; import org.jdom2.Text;
import org.jdom.Verifier; import org.jdom2.Verifier;
import org.jdom.input.SAXBuilder; import org.jdom2.filter.Filters;
import org.jdom.output.XMLOutputter; import org.jdom2.input.SAXBuilder;
import org.jdom.xpath.XPath; import org.jdom2.output.XMLOutputter;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
/** /**
* Configurable MODS Crosswalk * Configurable MODS Crosswalk
@@ -156,7 +157,7 @@ public class MODSDisseminationCrosswalk extends SelfNamedPlugin
static class modsTriple { static class modsTriple {
public String qdc = null; public String qdc = null;
public Element xml = null; public Element xml = null;
public XPath xpath = null; public XPathExpression xpath = null;
/** /**
* Initialize from text versions of QDC, XML and XPath. * Initialize from text versions of QDC, XML and XPath.
@@ -171,9 +172,9 @@ public class MODSDisseminationCrosswalk extends SelfNamedPlugin
final String postlog = "</mods>"; final String postlog = "</mods>";
try { try {
result.qdc = qdc; result.qdc = qdc;
result.xpath = XPath.newInstance(xpath); result.xpath =
result.xpath.addNamespace(MODS_NS.getPrefix(), MODS_NS.getURI()); XPathFactory.instance()
result.xpath.addNamespace(XLINK_NS); .compile(xpath, Filters.fpassthrough(), null, MODS_NS, XLINK_NS);
Document d = builder.build(new StringReader(prolog + xml + postlog)); Document d = builder.build(new StringReader(prolog + xml + postlog));
result.xml = (Element) d.getRootElement().getContent(0); result.xml = (Element) d.getRootElement().getContent(0);
} catch (JDOMException | IOException je) { } catch (JDOMException | IOException je) {
@@ -295,6 +296,7 @@ public class MODSDisseminationCrosswalk extends SelfNamedPlugin
* @throws IOException if IO error * @throws IOException if IO error
* @throws SQLException if database error * @throws SQLException if database error
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
* @return List of Elements
*/ */
@Override @Override
public List<Element> disseminateList(Context context, DSpaceObject dso) public List<Element> disseminateList(Context context, DSpaceObject dso)
@@ -352,37 +354,29 @@ public class MODSDisseminationCrosswalk extends SelfNamedPlugin
if (trip == null) { if (trip == null) {
log.warn("WARNING: " + getPluginInstanceName() + ": No MODS mapping for \"" + qdc + "\""); log.warn("WARNING: " + getPluginInstanceName() + ": No MODS mapping for \"" + qdc + "\"");
} else { } else {
try {
Element me = (Element) trip.xml.clone(); Element me = (Element) trip.xml.clone();
if (addSchema) { if (addSchema) {
me.setAttribute("schemaLocation", schemaLocation, XSI_NS); me.setAttribute("schemaLocation", schemaLocation, XSI_NS);
} }
Iterator ni = trip.xpath.selectNodes(me).iterator(); List<Object> matches = trip.xpath.evaluate(me);
if (!ni.hasNext()) { if (matches.isEmpty()) {
log.warn("XPath \"" + trip.xpath.getXPath() + log.warn("XPath \"" + trip.xpath.getExpression() +
"\" found no elements in \"" + "\" found no elements in \"" +
outputUgly.outputString(me) + outputUgly.outputString(me) +
"\", qdc=" + qdc); "\", qdc=" + qdc);
} }
while (ni.hasNext()) { for (Object match: matches) {
Object what = ni.next(); if (match instanceof Element) {
if (what instanceof Element) { ((Element) match).setText(checkedString(value));
((Element) what).setText(checkedString(value)); } else if (match instanceof Attribute) {
} else if (what instanceof Attribute) { ((Attribute) match).setValue(checkedString(value));
((Attribute) what).setValue(checkedString(value)); } else if (match instanceof Text) {
} else if (what instanceof Text) { ((Text) match).setText(checkedString(value));
((Text) what).setText(checkedString(value));
} else { } else {
log.warn("Got unknown object from XPath, class=" + what.getClass().getName()); log.warn("Got unknown object from XPath, class=" + match.getClass().getName());
} }
} }
result.add(me); result.add(me);
} catch (JDOMException je) {
log.error("Error following XPath in modsTriple: context=" +
outputUgly.outputString(trip.xml) +
", xpath=" + trip.xpath.getXPath() + ", exception=" +
je.toString());
}
} }
} }
return result; return result;

View File

@@ -15,9 +15,9 @@ import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.output.Format; import org.jdom2.output.Format;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
/** /**
* "Null" ingestion crosswalk * "Null" ingestion crosswalk

View File

@@ -20,8 +20,8 @@ import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService; import org.dspace.content.service.ItemService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* DIM ingestion crosswalk * DIM ingestion crosswalk

View File

@@ -31,8 +31,8 @@ import org.dspace.core.Context;
import org.dspace.core.Utils; import org.dspace.core.Utils;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* ORE dissemination crosswalk * ORE dissemination crosswalk

View File

@@ -34,12 +34,13 @@ import org.dspace.content.service.BundleService;
import org.dspace.content.service.ItemService; import org.dspace.content.service.ItemService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Attribute; import org.jdom2.Attribute;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.Namespace;
import org.jdom.Namespace; import org.jdom2.filter.Filters;
import org.jdom.xpath.XPath; import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
/** /**
* ORE ingestion crosswalk * ORE ingestion crosswalk
@@ -113,23 +114,21 @@ public class OREIngestionCrosswalk
Document doc = new Document(); Document doc = new Document();
doc.addContent(root.detach()); doc.addContent(root.detach());
XPath xpathLinks;
List<Element> aggregatedResources; List<Element> aggregatedResources;
String entryId; String entryId;
try { XPathExpression<Element> xpathLinks =
xpathLinks = XPath.newInstance("/atom:entry/atom:link[@rel=\"" + ORE_NS.getURI() + "aggregates" + "\"]"); XPathFactory.instance()
xpathLinks.addNamespace(ATOM_NS); .compile("/atom:entry/atom:link[@rel=\"" + ORE_NS.getURI() + "aggregates" + "\"]",
aggregatedResources = xpathLinks.selectNodes(doc); Filters.element(), null, ATOM_NS);
aggregatedResources = xpathLinks.evaluate(doc);
xpathLinks = XPath.newInstance("/atom:entry/atom:link[@rel='alternate']/@href"); XPathExpression<Attribute> xpathAltHref =
xpathLinks.addNamespace(ATOM_NS); XPathFactory.instance()
entryId = ((Attribute) xpathLinks.selectSingleNode(doc)).getValue(); .compile("/atom:entry/atom:link[@rel='alternate']/@href",
} catch (JDOMException e) { Filters.attribute(), null, ATOM_NS);
throw new CrosswalkException("JDOM exception occurred while ingesting the ORE", e); entryId = xpathAltHref.evaluateFirst(doc).getValue();
}
// Next for each resource, create a bitstream // Next for each resource, create a bitstream
XPath xpathDesc;
NumberFormat nf = NumberFormat.getInstance(); NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false); nf.setGroupingUsed(false);
nf.setMinimumIntegerDigits(4); nf.setMinimumIntegerDigits(4);
@@ -140,16 +139,12 @@ public class OREIngestionCrosswalk
String bundleName; String bundleName;
Element desc = null; Element desc = null;
try { XPathExpression<Element> xpathDesc =
xpathDesc = XPath.newInstance( XPathFactory.instance()
"/atom:entry/oreatom:triples/rdf:Description[@rdf:about=\"" + this.encodeForURL(href) + "\"][1]"); .compile("/atom:entry/oreatom:triples/rdf:Description[@rdf:about=\"" +
xpathDesc.addNamespace(ATOM_NS); this.encodeForURL(href) + "\"][1]",
xpathDesc.addNamespace(ORE_ATOM); Filters.element(), null, ATOM_NS, ORE_ATOM, RDF_NS);
xpathDesc.addNamespace(RDF_NS); desc = xpathDesc.evaluateFirst(doc);
desc = (Element) xpathDesc.selectSingleNode(doc);
} catch (JDOMException e) {
log.warn("Could not find description for {}", href, e);
}
if (desc != null && desc.getChild("type", RDF_NS).getAttributeValue("resource", RDF_NS) if (desc != null && desc.getChild("type", RDF_NS).getAttributeValue("resource", RDF_NS)
.equals(DS_NS.getURI() + "DSpaceBitstream")) { .equals(DS_NS.getURI() + "DSpaceBitstream")) {

View File

@@ -30,8 +30,8 @@ import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* PREMIS Crosswalk * PREMIS Crosswalk

View File

@@ -14,7 +14,7 @@ import java.util.Map;
import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
/** /**
* Translate DSpace native metadata into an external XML format, with parameters. * Translate DSpace native metadata into an external XML format, with parameters.

View File

@@ -36,10 +36,10 @@ import org.dspace.core.Context;
import org.dspace.core.SelfNamedPlugin; import org.dspace.core.SelfNamedPlugin;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.input.SAXBuilder; import org.jdom2.input.SAXBuilder;
/** /**
* Configurable QDC Crosswalk * Configurable QDC Crosswalk
@@ -290,7 +290,7 @@ public class QDCCrosswalk extends SelfNamedPlugin
qdc2element.put(qdc, element); qdc2element.put(qdc, element);
element2qdc.put(makeQualifiedTagName(element), qdc); element2qdc.put(makeQualifiedTagName(element), qdc);
log.debug("Building Maps: qdc=\"" + qdc + "\", element=\"" + element.toString() + "\""); log.debug("Building Maps: qdc=\"" + qdc + "\", element=\"" + element.toString() + "\"");
} catch (org.jdom.JDOMException je) { } catch (org.jdom2.JDOMException je) {
throw new CrosswalkInternalException( throw new CrosswalkInternalException(
"Failed parsing XML fragment in properties file: \"" + prolog + val + postlog + "\": " + je "Failed parsing XML fragment in properties file: \"" + prolog + val + postlog + "\": " + je
.toString(), je); .toString(), je);
@@ -326,6 +326,7 @@ public class QDCCrosswalk extends SelfNamedPlugin
* @throws IOException if IO error * @throws IOException if IO error
* @throws SQLException if database error * @throws SQLException if database error
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
* @return List of Elements
*/ */
@Override @Override
public List<Element> disseminateList(Context context, DSpaceObject dso) public List<Element> disseminateList(Context context, DSpaceObject dso)

View File

@@ -26,12 +26,12 @@ import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.dspace.workflow.WorkflowException; import org.dspace.workflow.WorkflowException;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.JDOMException;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.input.SAXBuilder; import org.jdom2.input.SAXBuilder;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
/** /**
* Role Crosswalk * Role Crosswalk

View File

@@ -24,8 +24,8 @@ import org.dspace.content.service.ItemService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.SelfNamedPlugin; import org.dspace.core.SelfNamedPlugin;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* Disseminator for Simple Dublin Core metadata in XML format. * Disseminator for Simple Dublin Core metadata in XML format.
@@ -84,6 +84,7 @@ public class SimpleDCDisseminationCrosswalk extends SelfNamedPlugin
* @throws IOException if IO error * @throws IOException if IO error
* @throws SQLException if database error * @throws SQLException if database error
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
* @return List of Elements
*/ */
@Override @Override
public List<Element> disseminateList(Context context, DSpaceObject dso) public List<Element> disseminateList(Context context, DSpaceObject dso)

View File

@@ -34,9 +34,9 @@ import org.dspace.core.Context;
import org.dspace.core.SelfNamedPlugin; import org.dspace.core.SelfNamedPlugin;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.Verifier; import org.jdom2.Verifier;
/** /**
* Crosswalk for creating appropriate &lt;meta&gt; elements to appear in the * Crosswalk for creating appropriate &lt;meta&gt; elements to appear in the
@@ -178,6 +178,7 @@ public class XHTMLHeadDisseminationCrosswalk
* @throws IOException if IO error * @throws IOException if IO error
* @throws SQLException if database error * @throws SQLException if database error
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
* @return List of Elements
*/ */
@Override @Override
public List<Element> disseminateList(Context context, DSpaceObject dso) throws CrosswalkException, public List<Element> disseminateList(Context context, DSpaceObject dso) throws CrosswalkException,

View File

@@ -21,7 +21,7 @@ import javax.xml.transform.stream.StreamSource;
import org.dspace.core.SelfNamedPlugin; import org.dspace.core.SelfNamedPlugin;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -130,12 +130,6 @@ public abstract class XSLTCrosswalk extends SelfNamedPlugin {
return aliasList.toArray(new String[aliasList.size()]); return aliasList.toArray(new String[aliasList.size()]);
} }
/**
* We need to force this, because some dependency elsewhere interferes.
*/
private static final String TRANSFORMER_FACTORY_CLASS
= "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
private Transformer transformer = null; private Transformer transformer = null;
private File transformFile = null; private File transformFile = null;
private long transformLastModified = 0; private long transformLastModified = 0;
@@ -181,8 +175,7 @@ public abstract class XSLTCrosswalk extends SelfNamedPlugin {
Source transformSource Source transformSource
= new StreamSource(new FileInputStream(transformFile)); = new StreamSource(new FileInputStream(transformFile));
TransformerFactory transformerFactory TransformerFactory transformerFactory
= TransformerFactory.newInstance( = TransformerFactory.newInstance();
TRANSFORMER_FACTORY_CLASS, null);
transformer = transformerFactory.newTransformer(transformSource); transformer = transformerFactory.newTransformer(transformSource);
transformLastModified = transformFile.lastModified(); transformLastModified = transformFile.lastModified();
} catch (TransformerConfigurationException | FileNotFoundException e) { } catch (TransformerConfigurationException | FileNotFoundException e) {

View File

@@ -18,6 +18,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import javax.xml.transform.Transformer; import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
@@ -41,14 +42,15 @@ import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.handle.factory.HandleServiceFactory; import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Document; import org.jdom2.Content;
import org.jdom.Element; import org.jdom2.Document;
import org.jdom.Namespace; import org.jdom2.Element;
import org.jdom.Verifier; import org.jdom2.Namespace;
import org.jdom.output.Format; import org.jdom2.Verifier;
import org.jdom.output.XMLOutputter; import org.jdom2.output.Format;
import org.jdom.transform.JDOMResult; import org.jdom2.output.XMLOutputter;
import org.jdom.transform.JDOMSource; import org.jdom2.transform.JDOMResult;
import org.jdom2.transform.JDOMSource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -244,6 +246,7 @@ public class XSLTDisseminationCrosswalk
* @throws SQLException if database error * @throws SQLException if database error
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
* @see DisseminationCrosswalk * @see DisseminationCrosswalk
* @return List of Elements
*/ */
@Override @Override
public List<Element> disseminateList(Context context, DSpaceObject dso) public List<Element> disseminateList(Context context, DSpaceObject dso)
@@ -268,7 +271,12 @@ public class XSLTDisseminationCrosswalk
try { try {
JDOMResult result = new JDOMResult(); JDOMResult result = new JDOMResult();
xform.transform(new JDOMSource(createDIM(dso).getChildren()), result); xform.transform(new JDOMSource(createDIM(dso).getChildren()), result);
return result.getResult(); List<Content> contentList = result.getResult();
// Transform List<Content> into List<Element>
List<Element> elementList = contentList.stream()
.filter(obj -> obj instanceof Element)
.map(Element.class::cast).collect(Collectors.toList());
return elementList;
} catch (TransformerException e) { } catch (TransformerException e) {
LOG.error("Got error: " + e.toString()); LOG.error("Got error: " + e.toString());
throw new CrosswalkInternalException("XSL translation failed: " + e.toString(), e); throw new CrosswalkInternalException("XSL translation failed: " + e.toString(), e);

View File

@@ -12,6 +12,7 @@ import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import javax.xml.transform.Transformer; import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
@@ -34,13 +35,14 @@ import org.dspace.content.service.ItemService;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.factory.CoreServiceFactory; import org.dspace.core.factory.CoreServiceFactory;
import org.jdom.Document; import org.jdom2.Content;
import org.jdom.Element; import org.jdom2.Document;
import org.jdom.input.SAXBuilder; import org.jdom2.Element;
import org.jdom.output.Format; import org.jdom2.input.SAXBuilder;
import org.jdom.output.XMLOutputter; import org.jdom2.output.Format;
import org.jdom.transform.JDOMResult; import org.jdom2.output.XMLOutputter;
import org.jdom.transform.JDOMSource; import org.jdom2.transform.JDOMResult;
import org.jdom2.transform.JDOMSource;
/** /**
* Configurable XSLT-driven ingestion Crosswalk * Configurable XSLT-driven ingestion Crosswalk
@@ -141,7 +143,12 @@ public class XSLTIngestionCrosswalk
try { try {
JDOMResult result = new JDOMResult(); JDOMResult result = new JDOMResult();
xform.transform(new JDOMSource(metadata), result); xform.transform(new JDOMSource(metadata), result);
ingestDIM(context, dso, result.getResult(), createMissingMetadataFields); List<Content> contentList = result.getResult();
// Transform List<Content> into List<Element>
List<Element> elementList = contentList.stream()
.filter(obj -> obj instanceof Element)
.map(Element.class::cast).collect(Collectors.toList());
ingestDIM(context, dso, elementList, createMissingMetadataFields);
} catch (TransformerException e) { } catch (TransformerException e) {
log.error("Got error: " + e.toString()); log.error("Got error: " + e.toString());
throw new CrosswalkInternalException("XSL Transformation failed: " + e.toString(), e); throw new CrosswalkInternalException("XSL Transformation failed: " + e.toString(), e);

View File

@@ -7,7 +7,8 @@
*/ */
package org.dspace.content.logic; package org.dspace.content.logic;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.core.Context; import org.dspace.core.Context;
@@ -21,7 +22,7 @@ import org.dspace.core.Context;
*/ */
public class DefaultFilter implements Filter { public class DefaultFilter implements Filter {
private LogicalStatement statement; private LogicalStatement statement;
private static Logger log = Logger.getLogger(Filter.class); private final static Logger log = LogManager.getLogger();
/** /**
* Set statement from Spring configuration in item-filters.xml * Set statement from Spring configuration in item-filters.xml

View File

@@ -10,7 +10,8 @@ package org.dspace.content.logic.condition;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection; import org.dspace.content.Collection;
import org.dspace.content.Community; import org.dspace.content.Community;
import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObject;
@@ -26,7 +27,7 @@ import org.dspace.core.Context;
* @version $Revision$ * @version $Revision$
*/ */
public class InCommunityCondition extends AbstractCondition { public class InCommunityCondition extends AbstractCondition {
private static Logger log = Logger.getLogger(InCommunityCondition.class); private final static Logger log = LogManager.getLogger();
/** /**
* Return true if item is in one of the specified collections * Return true if item is in one of the specified collections

View File

@@ -7,7 +7,8 @@
*/ */
package org.dspace.content.logic.condition; package org.dspace.content.logic.condition;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.content.logic.LogicalStatementException; import org.dspace.content.logic.LogicalStatementException;
import org.dspace.core.Context; import org.dspace.core.Context;
@@ -19,7 +20,7 @@ import org.dspace.core.Context;
* @version $Revision$ * @version $Revision$
*/ */
public class IsWithdrawnCondition extends AbstractCondition { public class IsWithdrawnCondition extends AbstractCondition {
private static Logger log = Logger.getLogger(IsWithdrawnCondition.class); private final static Logger log = LogManager.getLogger();
/** /**
* Return true if item is withdrawn * Return true if item is withdrawn

View File

@@ -11,7 +11,8 @@ import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.content.MetadataValue; import org.dspace.content.MetadataValue;
import org.dspace.content.logic.LogicalStatementException; import org.dspace.content.logic.LogicalStatementException;
@@ -26,7 +27,7 @@ import org.dspace.core.Context;
*/ */
public class MetadataValueMatchCondition extends AbstractCondition { public class MetadataValueMatchCondition extends AbstractCondition {
private static Logger log = Logger.getLogger(MetadataValueMatchCondition.class); private final static Logger log = LogManager.getLogger();
/** /**
* Return true if any value for a specified field in the item matches a specified regex pattern * Return true if any value for a specified field in the item matches a specified regex pattern

View File

@@ -11,7 +11,8 @@ import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.content.MetadataValue; import org.dspace.content.MetadataValue;
import org.dspace.content.logic.LogicalStatementException; import org.dspace.content.logic.LogicalStatementException;
@@ -26,7 +27,7 @@ import org.dspace.core.Context;
*/ */
public class MetadataValuesMatchCondition extends AbstractCondition { public class MetadataValuesMatchCondition extends AbstractCondition {
private static Logger log = Logger.getLogger(MetadataValuesMatchCondition.class); private final static Logger log = LogManager.getLogger();
/** /**
* Return true if any value for a specified field in the item matches any of the specified regex patterns * Return true if any value for a specified field in the item matches any of the specified regex patterns

View File

@@ -10,7 +10,8 @@ package org.dspace.content.logic.condition;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.ResourcePolicy;
import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.AuthorizeService;
@@ -27,7 +28,7 @@ import org.dspace.core.Context;
* @version $Revision$ * @version $Revision$
*/ */
public class ReadableByGroupCondition extends AbstractCondition { public class ReadableByGroupCondition extends AbstractCondition {
private static Logger log = Logger.getLogger(ReadableByGroupCondition.class); private final static Logger log = LogManager.getLogger();
// Authorize service // Authorize service
AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();

View File

@@ -83,10 +83,10 @@ import org.dspace.license.factory.LicenseServiceFactory;
import org.dspace.license.service.CreativeCommonsService; import org.dspace.license.service.CreativeCommonsService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.output.Format; import org.jdom2.output.Format;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
/** /**
* Base class for disseminator of * Base class for disseminator of

View File

@@ -51,7 +51,7 @@ import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.dspace.workflow.WorkflowException; import org.dspace.workflow.WorkflowException;
import org.dspace.workflow.factory.WorkflowServiceFactory; import org.dspace.workflow.factory.WorkflowServiceFactory;
import org.jdom.Element; import org.jdom2.Element;
/** /**
* Base class for package ingester of METS (Metadata Encoding and Transmission * Base class for package ingester of METS (Metadata Encoding and Transmission

View File

@@ -20,7 +20,7 @@ import org.dspace.content.crosswalk.CrosswalkException;
import org.dspace.content.crosswalk.MetadataValidationException; import org.dspace.content.crosswalk.MetadataValidationException;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.jdom.Element; import org.jdom2.Element;
/** /**
* Subclass of the METS packager framework to ingest a DSpace * Subclass of the METS packager framework to ingest a DSpace

View File

@@ -23,7 +23,7 @@ import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.factory.CoreServiceFactory; import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.core.service.PluginService; import org.dspace.core.service.PluginService;
import org.jdom.Element; import org.jdom2.Element;
/** /**
* Packager plugin to ingest a * Packager plugin to ingest a

View File

@@ -35,15 +35,17 @@ import org.dspace.core.Context;
import org.dspace.core.factory.CoreServiceFactory; import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Content; import org.jdom2.Content;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.JDOMException;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.input.SAXBuilder; import org.jdom2.filter.Filters;
import org.jdom.output.Format; import org.jdom2.input.SAXBuilder;
import org.jdom.output.XMLOutputter; import org.jdom2.output.Format;
import org.jdom.xpath.XPath; import org.jdom2.output.XMLOutputter;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
/** /**
* <P> * <P>
@@ -382,15 +384,12 @@ public class METSManifest {
public List getMdFiles() public List getMdFiles()
throws MetadataValidationException { throws MetadataValidationException {
if (mdFiles == null) { if (mdFiles == null) {
try {
// Use a special namespace with known prefix // Use a special namespace with known prefix
// so we get the right prefix. // so we get the right prefix.
XPath xpath = XPath.newInstance("descendant::mets:mdRef"); XPathExpression<Element> xpath =
xpath.addNamespace(metsNS); XPathFactory.instance()
mdFiles = xpath.selectNodes(mets); .compile("descendant::mets:mdRef", Filters.element(), null, metsNS);
} catch (JDOMException je) { mdFiles = xpath.evaluate(mets);
throw new MetadataValidationException("Failed while searching for mdRef elements in manifest: ", je);
}
} }
return mdFiles; return mdFiles;
} }
@@ -414,25 +413,22 @@ public class METSManifest {
return null; return null;
} }
try { XPathExpression<Element> xpath =
XPath xpath = XPath.newInstance( XPathFactory.instance()
"mets:fileSec/mets:fileGrp[@USE=\"CONTENT\"]/mets:file[@GROUPID=\"" + groupID + "\"]"); .compile(
xpath.addNamespace(metsNS); "mets:fileSec/mets:fileGrp[@USE=\"CONTENT\"]/mets:file[@GROUPID=\"" + groupID + "\"]",
List oFiles = xpath.selectNodes(mets); Filters.element(), null, metsNS);
List<Element> oFiles = xpath.evaluate(mets);
if (oFiles.size() > 0) { if (oFiles.size() > 0) {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Got ORIGINAL file for derived=" + file.toString()); log.debug("Got ORIGINAL file for derived=" + file.toString());
} }
Element flocat = ((Element) oFiles.get(0)).getChild("FLocat", metsNS); Element flocat = oFiles.get(0).getChild("FLocat", metsNS);
if (flocat != null) { if (flocat != null) {
return flocat.getAttributeValue("href", xlinkNS); return flocat.getAttributeValue("href", xlinkNS);
} }
} }
return null; return null;
} catch (JDOMException je) {
log.warn("Got exception on XPATH looking for Original file, " + je.toString());
return null;
}
} }
// translate bundle name from METS to DSpace; METS may be "CONTENT" // translate bundle name from METS to DSpace; METS may be "CONTENT"
@@ -888,20 +884,16 @@ public class METSManifest {
// use only when path varies each time you call it. // use only when path varies each time you call it.
protected Element getElementByXPath(String path, boolean nullOk) protected Element getElementByXPath(String path, boolean nullOk)
throws MetadataValidationException { throws MetadataValidationException {
try { XPathExpression<Element> xpath =
XPath xpath = XPath.newInstance(path); XPathFactory.instance()
xpath.addNamespace(metsNS); .compile(path, Filters.element(), null, metsNS, xlinkNS);
xpath.addNamespace(xlinkNS); Element result = xpath.evaluateFirst(mets);
Object result = xpath.selectSingleNode(mets);
if (result == null && nullOk) { if (result == null && nullOk) {
return null; return null;
} else if (result instanceof Element) { } else if (result == null && !nullOk) {
return (Element) result;
} else {
throw new MetadataValidationException("METSManifest: Failed to resolve XPath, path=\"" + path + "\""); throw new MetadataValidationException("METSManifest: Failed to resolve XPath, path=\"" + path + "\"");
} } else {
} catch (JDOMException je) { return result;
throw new MetadataValidationException("METSManifest: Failed to resolve XPath, path=\"" + path + "\"", je);
} }
} }

View File

@@ -35,7 +35,7 @@ import org.dspace.eperson.PasswordHash;
import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.factory.EPersonServiceFactory;
import org.dspace.eperson.service.EPersonService; import org.dspace.eperson.service.EPersonService;
import org.dspace.eperson.service.GroupService; import org.dspace.eperson.service.GroupService;
import org.jdom.Namespace; import org.jdom2.Namespace;
/** /**
* Plugin to export all Group and EPerson objects in XML, perhaps for reloading. * Plugin to export all Group and EPerson objects in XML, perhaps for reloading.

View File

@@ -152,14 +152,14 @@ public class Email {
private static final String RESOURCE_REPOSITORY_NAME = "Email"; private static final String RESOURCE_REPOSITORY_NAME = "Email";
private static final Properties VELOCITY_PROPERTIES = new Properties(); private static final Properties VELOCITY_PROPERTIES = new Properties();
static { static {
VELOCITY_PROPERTIES.put(Velocity.RESOURCE_LOADER, "string"); VELOCITY_PROPERTIES.put(Velocity.RESOURCE_LOADERS, "string");
VELOCITY_PROPERTIES.put("string.resource.loader.description", VELOCITY_PROPERTIES.put("resource.loader.string.description",
"Velocity StringResource loader"); "Velocity StringResource loader");
VELOCITY_PROPERTIES.put("string.resource.loader.class", VELOCITY_PROPERTIES.put("resource.loader.string.class",
StringResourceLoader.class.getName()); StringResourceLoader.class.getName());
VELOCITY_PROPERTIES.put("string.resource.loader.repository.name", VELOCITY_PROPERTIES.put("resource.loader.string.repository.name",
RESOURCE_REPOSITORY_NAME); RESOURCE_REPOSITORY_NAME);
VELOCITY_PROPERTIES.put("string.resource.loader.repository.static", VELOCITY_PROPERTIES.put("resource.loader.string.repository.static",
"false"); "false");
} }

View File

@@ -7,6 +7,7 @@
*/ */
package org.dspace.curate; package org.dspace.curate;
import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.sql.SQLException; import java.sql.SQLException;
@@ -154,7 +155,8 @@ public class CitationPage extends AbstractCurationTask {
try { try {
//Create the cited document //Create the cited document
InputStream citedInputStream = InputStream citedInputStream =
citationDocument.makeCitedDocument(Curator.curationContext(), bitstream).getLeft(); new ByteArrayInputStream(
citationDocument.makeCitedDocument(Curator.curationContext(), bitstream).getLeft());
//Add the cited document to the approiate bundle //Add the cited document to the approiate bundle
this.addCitedPageToItem(citedInputStream, bundle, pBundle, this.addCitedPageToItem(citedInputStream, bundle, pBundle,
dBundle, displayMap, item, bitstream); dBundle, displayMap, item, bitstream);

View File

@@ -19,7 +19,6 @@ public class CurationCliScriptConfiguration extends CurationScriptConfiguration<
public Options getOptions() { public Options getOptions() {
options = super.getOptions(); options = super.getOptions();
options.addOption("e", "eperson", true, "email address of curating eperson"); options.addOption("e", "eperson", true, "email address of curating eperson");
options.getOption("e").setType(String.class);
options.getOption("e").setRequired(true); options.getOption("e").setRequired(true);
return options; return options;
} }

View File

@@ -74,25 +74,17 @@ public enum IndexClientOptions {
options options
.addOption("r", "remove", true, "remove an Item, Collection or Community from index based on its handle"); .addOption("r", "remove", true, "remove an Item, Collection or Community from index based on its handle");
options.getOption("r").setType(String.class);
options.addOption("i", "index", true, options.addOption("i", "index", true,
"add or update an Item, Collection or Community based on its handle or uuid"); "add or update an Item, Collection or Community based on its handle or uuid");
options.getOption("i").setType(boolean.class);
options.addOption("c", "clean", false, options.addOption("c", "clean", false,
"clean existing index removing any documents that no longer exist in the db"); "clean existing index removing any documents that no longer exist in the db");
options.getOption("c").setType(boolean.class);
options.addOption("d", "delete", false, options.addOption("d", "delete", false,
"delete all records from existing index"); "delete all records from existing index");
options.getOption("d").setType(boolean.class);
options.addOption("b", "build", false, "(re)build index, wiping out current one if it exists"); options.addOption("b", "build", false, "(re)build index, wiping out current one if it exists");
options.getOption("b").setType(boolean.class);
options.addOption("s", "spellchecker", false, "Rebuild the spellchecker, can be combined with -b and -f."); options.addOption("s", "spellchecker", false, "Rebuild the spellchecker, can be combined with -b and -f.");
options.getOption("s").setType(boolean.class);
options.addOption("f", "force", false, options.addOption("f", "force", false,
"if updating existing index, force each handle to be reindexed even if uptodate"); "if updating existing index, force each handle to be reindexed even if uptodate");
options.getOption("f").setType(boolean.class);
options.addOption("h", "help", false, "print this help message"); options.addOption("h", "help", false, "print this help message");
options.getOption("h").setType(boolean.class);
return options; return options;
} }
} }

View File

@@ -95,7 +95,6 @@ public abstract class IndexFactoryImpl<T extends IndexableObject, S> implements
100000); 100000);
// Use Tika's Text parser as the streams are always from the TEXT bundle (i.e. already extracted text) // Use Tika's Text parser as the streams are always from the TEXT bundle (i.e. already extracted text)
// TODO: We may wish to consider using Tika to extract the text in the future.
TextAndCSVParser tikaParser = new TextAndCSVParser(); TextAndCSVParser tikaParser = new TextAndCSVParser();
BodyContentHandler tikaHandler = new BodyContentHandler(charLimit); BodyContentHandler tikaHandler = new BodyContentHandler(charLimit);
Metadata tikaMetadata = new Metadata(); Metadata tikaMetadata = new Metadata();

View File

@@ -8,7 +8,6 @@
package org.dspace.disseminate; package org.dspace.disseminate;
import java.awt.Color; import java.awt.Color;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -297,7 +296,7 @@ public class CitationDocumentServiceImpl implements CitationDocumentService, Ini
} }
@Override @Override
public Pair<InputStream, Long> makeCitedDocument(Context context, Bitstream bitstream) public Pair<byte[], Long> makeCitedDocument(Context context, Bitstream bitstream)
throws IOException, SQLException, AuthorizeException { throws IOException, SQLException, AuthorizeException {
PDDocument document = new PDDocument(); PDDocument document = new PDDocument();
PDDocument sourceDocument = new PDDocument(); PDDocument sourceDocument = new PDDocument();
@@ -318,7 +317,7 @@ public class CitationDocumentServiceImpl implements CitationDocumentService, Ini
document.save(out); document.save(out);
byte[] data = out.toByteArray(); byte[] data = out.toByteArray();
return Pair.of(new ByteArrayInputStream(data), Long.valueOf(data.length)); return Pair.of(data, Long.valueOf(data.length));
} }
} finally { } finally {

View File

@@ -8,7 +8,6 @@
package org.dspace.disseminate.service; package org.dspace.disseminate.service;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException; import java.sql.SQLException;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@@ -84,7 +83,7 @@ public interface CitationDocumentService {
* @throws SQLException if database error * @throws SQLException if database error
* @throws AuthorizeException if authorization error * @throws AuthorizeException if authorization error
*/ */
public Pair<InputStream, Long> makeCitedDocument(Context context, Bitstream bitstream) public Pair<byte[], Long> makeCitedDocument(Context context, Bitstream bitstream)
throws IOException, SQLException, AuthorizeException; throws IOException, SQLException, AuthorizeException;
/** /**

View File

@@ -7,10 +7,12 @@
*/ */
package org.dspace.eperson; package org.dspace.eperson;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.UUID; import java.util.UUID;
import javax.mail.MessagingException; import javax.mail.MessagingException;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
@@ -30,16 +32,17 @@ import org.dspace.services.factory.DSpaceServicesFactory;
* Recommended filter: EPerson+Create * Recommended filter: EPerson+Create
* *
* @author Stuart Lewis * @author Stuart Lewis
* @version $Revision$
*/ */
public class EPersonConsumer implements Consumer { public class EPersonConsumer implements Consumer {
/** /**
* log4j logger * log4j logger
*/ */
private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonConsumer.class); private static final Logger log
= org.apache.logging.log4j.LogManager.getLogger(EPersonConsumer.class);
protected EPersonService ePersonService protected EPersonService ePersonService
= EPersonServiceFactory.getInstance().getEPersonService(); = EPersonServiceFactory.getInstance().getEPersonService();
protected ConfigurationService configurationService protected ConfigurationService configurationService
= DSpaceServicesFactory.getInstance().getConfigurationService(); = DSpaceServicesFactory.getInstance().getConfigurationService();
@@ -74,6 +77,7 @@ public class EPersonConsumer implements Consumer {
if (et == Event.CREATE) { if (et == Event.CREATE) {
// Notify of new user registration // Notify of new user registration
String notifyRecipient = configurationService.getProperty("registration.notify"); String notifyRecipient = configurationService.getProperty("registration.notify");
EPerson eperson = ePersonService.find(context, id);
if (notifyRecipient == null) { if (notifyRecipient == null) {
notifyRecipient = ""; notifyRecipient = "";
} }
@@ -81,7 +85,6 @@ public class EPersonConsumer implements Consumer {
if (!notifyRecipient.equals("")) { if (!notifyRecipient.equals("")) {
try { try {
EPerson eperson = ePersonService.find(context, id);
Email adminEmail = Email Email adminEmail = Email
.getEmail(I18nUtil.getEmailFilename(context.getCurrentLocale(), "registration_notify")); .getEmail(I18nUtil.getEmailFilename(context.getCurrentLocale(), "registration_notify"));
adminEmail.addRecipient(notifyRecipient); adminEmail.addRecipient(notifyRecipient);
@@ -103,6 +106,26 @@ public class EPersonConsumer implements Consumer {
"error_emailing_administrator", ""), me); "error_emailing_administrator", ""), me);
} }
} }
// If enabled, send a "welcome" message to the new EPerson.
if (configurationService.getBooleanProperty("mail.welcome.enabled", false)) {
String addressee = eperson.getEmail();
if (StringUtils.isNotBlank(addressee)) {
log.debug("Sending welcome email to {}", addressee);
try {
Email message = Email.getEmail(
I18nUtil.getEmailFilename(context.getCurrentLocale(), "welcome"));
message.addRecipient(addressee);
message.send();
} catch (IOException | MessagingException ex) {
log.warn("Welcome message not sent to {}: {}",
addressee, ex.getMessage());
}
} else {
log.warn("Welcome message not sent to EPerson {} because it has no email address.",
eperson.getID().toString());
}
}
} else if (et == Event.DELETE) { } else if (et == Event.DELETE) {
// TODO: Implement this if required // TODO: Implement this if required
} }

View File

@@ -201,7 +201,7 @@ public class Group extends DSpaceObject implements DSpaceObjectLegacySupport {
void setName(String name) throws SQLException { void setName(String name) throws SQLException {
if (!StringUtils.equals(this.name, name) && !isPermanent()) { if (!StringUtils.equals(this.name, name) && !isPermanent()) {
this.name = name; this.name = name;
groupsChanged = true; setMetadataModified();
} }
} }

View File

@@ -31,7 +31,8 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity; import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.log4j.Logger; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.core.Constants; import org.dspace.core.Constants;
import org.dspace.core.Context; import org.dspace.core.Context;
@@ -55,7 +56,7 @@ public class GoogleAsyncEventListener extends AbstractUsageEventListener {
// 20 is the event max set by the GA API // 20 is the event max set by the GA API
private static final int GA_MAX_EVENTS = 20; private static final int GA_MAX_EVENTS = 20;
private static final String ANALYTICS_BATCH_ENDPOINT = "https://www.google-analytics.com/batch"; private static final String ANALYTICS_BATCH_ENDPOINT = "https://www.google-analytics.com/batch";
private static Logger log = Logger.getLogger(GoogleAsyncEventListener.class); private final static Logger log = LogManager.getLogger();
private static String analyticsKey; private static String analyticsKey;
private static CloseableHttpClient httpclient; private static CloseableHttpClient httpclient;
private static Buffer buffer; private static Buffer buffer;

View File

@@ -29,10 +29,10 @@ import org.dspace.harvest.dao.HarvestedCollectionDAO;
import org.dspace.harvest.service.HarvestedCollectionService; import org.dspace.harvest.service.HarvestedCollectionService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.input.DOMBuilder; import org.jdom2.input.DOMBuilder;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.DOMException; import org.w3c.dom.DOMException;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;

View File

@@ -70,11 +70,11 @@ import org.dspace.harvest.service.HarvestedCollectionService;
import org.dspace.harvest.service.HarvestedItemService; import org.dspace.harvest.service.HarvestedItemService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.Namespace; import org.jdom2.Namespace;
import org.jdom.input.DOMBuilder; import org.jdom2.input.DOMBuilder;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;

View File

@@ -34,8 +34,6 @@ public class DOI
implements Identifier, ReloadableEntity<Integer> { implements Identifier, ReloadableEntity<Integer> {
public static final String SCHEME = "doi:"; public static final String SCHEME = "doi:";
public static final String RESOLVER = "http://dx.doi.org";
@Id @Id
@Column(name = "doi_id") @Column(name = "doi_id")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "doi_seq") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "doi_seq")

View File

@@ -1028,7 +1028,7 @@ public class DOIIdentifierProvider extends FilteredIdentifierProvider {
Item item = (Item) dso; Item item = (Item) dso;
List<MetadataValue> metadata = itemService.getMetadata(item, MD_SCHEMA, DOI_ELEMENT, DOI_QUALIFIER, null); List<MetadataValue> metadata = itemService.getMetadata(item, MD_SCHEMA, DOI_ELEMENT, DOI_QUALIFIER, null);
String leftPart = DOI.RESOLVER + SLASH + getPrefix() + SLASH + getNamespaceSeparator(); String leftPart = doiService.getResolver() + SLASH + getPrefix() + SLASH + getNamespaceSeparator();
for (MetadataValue id : metadata) { for (MetadataValue id : metadata) {
if (id.getValue().startsWith(leftPart)) { if (id.getValue().startsWith(leftPart)) {
return doiService.DOIFromExternalFormat(id.getValue()); return doiService.DOIFromExternalFormat(id.getValue());

View File

@@ -17,11 +17,13 @@ import org.dspace.core.Context;
import org.dspace.identifier.dao.DOIDAO; import org.dspace.identifier.dao.DOIDAO;
import org.dspace.identifier.doi.DOIIdentifierException; import org.dspace.identifier.doi.DOIIdentifierException;
import org.dspace.identifier.service.DOIService; import org.dspace.identifier.service.DOIService;
import org.dspace.services.ConfigurationService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
/** /**
* Service implementation for the DOI object. * Service implementation for the {@link DOI} object.
* This class is responsible for all business logic calls for the DOI object and is autowired by spring. * This class is responsible for all business logic calls for the DOI object
* and is autowired by Spring.
* This class should never be accessed directly. * This class should never be accessed directly.
* *
* @author kevinvandevelde at atmire.com * @author kevinvandevelde at atmire.com
@@ -31,6 +33,16 @@ public class DOIServiceImpl implements DOIService {
@Autowired(required = true) @Autowired(required = true)
protected DOIDAO doiDAO; protected DOIDAO doiDAO;
@Autowired(required = true)
protected ConfigurationService configurationService;
private static final Pattern DOI_URL_PATTERN
= Pattern.compile("http(s)?://([a-z0-9-.]+)?doi.org(?<path>/.*)",
Pattern.CASE_INSENSITIVE);
private static final String DOI_URL_PATTERN_PATH_GROUP = "path";
private static final String RESOLVER_DEFAULT = "https://doi.org";
protected DOIServiceImpl() { protected DOIServiceImpl() {
} }
@@ -66,25 +78,46 @@ public class DOIServiceImpl implements DOIService {
if (null == identifier) { if (null == identifier) {
throw new IllegalArgumentException("Identifier is null.", new NullPointerException()); throw new IllegalArgumentException("Identifier is null.", new NullPointerException());
} }
if (identifier.isEmpty()) { if (identifier.isEmpty()) {
throw new IllegalArgumentException("Cannot format an empty identifier."); throw new IllegalArgumentException("Cannot format an empty identifier.");
} }
if (identifier.startsWith(DOI.SCHEME)) {
return DOI.RESOLVER + "/" + identifier.substring(DOI.SCHEME.length()); String resolver = getResolver();
if (identifier.startsWith(DOI.SCHEME)) { // doi:something
StringBuilder result = new StringBuilder(resolver);
if (!resolver.endsWith("/")) {
result.append('/');
} }
if (identifier.startsWith("10.") && identifier.contains("/")) { result.append(identifier.substring(DOI.SCHEME.length()));
return DOI.RESOLVER + "/" + identifier; return result.toString();
} }
if (identifier.startsWith(DOI.RESOLVER + "/10.")) {
if (identifier.startsWith("10.") && identifier.contains("/")) { // 10.something
StringBuilder result = new StringBuilder(resolver);
if (!resolver.endsWith("/")) {
result.append('/');
}
result.append(identifier);
return result.toString();
}
if (identifier.startsWith(resolver + "/10.")) { // https://doi.org/10.something
return identifier; return identifier;
} }
Matcher matcher = DOI_URL_PATTERN.matcher(identifier);
if (matcher.matches()) { // various old URL forms
return resolver + matcher.group(DOI_URL_PATTERN_PATH_GROUP);
}
throw new IdentifierException(identifier + "does not seem to be a DOI."); throw new IdentifierException(identifier + "does not seem to be a DOI.");
} }
@Override @Override
public String DOIFromExternalFormat(String identifier) throws DOIIdentifierException { public String DOIFromExternalFormat(String identifier) throws DOIIdentifierException {
Pattern pattern = Pattern.compile("^" + DOI.RESOLVER + "/+(10\\..*)$"); Pattern pattern = Pattern.compile("^" + getResolver() + "/+(10\\..*)$");
Matcher matcher = pattern.matcher(identifier); Matcher matcher = pattern.matcher(identifier);
if (matcher.find()) { if (matcher.find()) {
return DOI.SCHEME + matcher.group(1); return DOI.SCHEME + matcher.group(1);
@@ -99,18 +132,29 @@ public class DOIServiceImpl implements DOIService {
if (null == identifier) { if (null == identifier) {
throw new IllegalArgumentException("Identifier is null.", new NullPointerException()); throw new IllegalArgumentException("Identifier is null.", new NullPointerException());
} }
if (identifier.startsWith(DOI.SCHEME)) {
return identifier;
}
if (identifier.isEmpty()) { if (identifier.isEmpty()) {
throw new IllegalArgumentException("Cannot format an empty identifier."); throw new IllegalArgumentException("Cannot format an empty identifier.");
} }
if (identifier.startsWith("10.") && identifier.contains("/")) {
if (identifier.startsWith(DOI.SCHEME)) { // doi:something
return identifier;
}
if (identifier.startsWith("10.") && identifier.contains("/")) { // 10.something
return DOI.SCHEME + identifier; return DOI.SCHEME + identifier;
} }
if (identifier.startsWith(DOI.RESOLVER + "/10.")) {
return DOI.SCHEME + identifier.substring(18); String resolver = getResolver();
if (identifier.startsWith(resolver + "/10.")) { //https://doi.org/10.something
return DOI.SCHEME + identifier.substring(resolver.length());
} }
Matcher matcher = DOI_URL_PATTERN.matcher(identifier);
if (matcher.matches()) { // various old URL forms
return DOI.SCHEME + matcher.group(DOI_URL_PATTERN_PATH_GROUP).substring(1);
}
throw new DOIIdentifierException(identifier + "does not seem to be a DOI.", throw new DOIIdentifierException(identifier + "does not seem to be a DOI.",
DOIIdentifierException.UNRECOGNIZED); DOIIdentifierException.UNRECOGNIZED);
} }
@@ -126,4 +170,14 @@ public class DOIServiceImpl implements DOIService {
throws SQLException { throws SQLException {
return doiDAO.findSimilarNotInState(context, doiPattern, statuses, dsoIsNotNull); return doiDAO.findSimilarNotInState(context, doiPattern, statuses, dsoIsNotNull);
} }
@Override
public String getResolver() {
String resolver = configurationService.getProperty("identifier.doi.resolver",
RESOLVER_DEFAULT);
if (resolver.endsWith("/")) {
resolver = resolver.substring(0, resolver.length() - 1);
}
return resolver;
}
} }

View File

@@ -23,8 +23,8 @@ import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.handle.factory.HandleServiceFactory; import org.dspace.handle.factory.HandleServiceFactory;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.utils.DSpace; import org.dspace.utils.DSpace;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;

View File

@@ -45,13 +45,13 @@ import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.handle.service.HandleService; import org.dspace.handle.service.HandleService;
import org.dspace.identifier.DOI; import org.dspace.identifier.DOI;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.Element; import org.jdom2.Element;
import org.jdom.JDOMException; import org.jdom2.JDOMException;
import org.jdom.filter.ElementFilter; import org.jdom2.filter.ElementFilter;
import org.jdom.input.SAXBuilder; import org.jdom2.input.SAXBuilder;
import org.jdom.output.Format; import org.jdom2.output.Format;
import org.jdom.output.XMLOutputter; import org.jdom2.output.XMLOutputter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -17,26 +17,65 @@ import org.dspace.identifier.IdentifierException;
import org.dspace.identifier.doi.DOIIdentifierException; import org.dspace.identifier.doi.DOIIdentifierException;
/** /**
* Service interface class for the DOI object. * Service interface class for the {@link DOI} object.
* The implementation of this class is responsible for all business logic calls for the DOI object and is autowired * The implementation of this class is responsible for all business logic calls
* by spring * for the {@link DOI} object and is autowired by Spring.
* *
* @author kevinvandevelde at atmire.com * @author kevinvandevelde at atmire.com
*/ */
public interface DOIService { public interface DOIService {
/**
* Update a DOI in storage.
*
* @param context current DSpace session.
* @param doi the DOI to persist.
* @throws SQLException passed through.
*/
public void update(Context context, DOI doi) throws SQLException; public void update(Context context, DOI doi) throws SQLException;
/**
* Create a new DOI in storage.
*
* @param context current DSpace session.
* @return the new DOI.
* @throws SQLException passed through.
*/
public DOI create(Context context) throws SQLException; public DOI create(Context context) throws SQLException;
/**
* Find a specific DOI in storage.
*
* @param context current DSpace session.
* @param doi string representation of the DOI.
* @return the DOI object found.
* @throws SQLException passed through, can mean none found.
*/
public DOI findByDoi(Context context, String doi) throws SQLException; public DOI findByDoi(Context context, String doi) throws SQLException;
/**
* Find the DOI assigned to a given DSpace Object.
*
* @param context current DSpace session.
* @param dso The DSpace Object.
* @return the DSO's DOI.
* @throws SQLException passed through.
*/
public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso) throws SQLException; public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso) throws SQLException;
/**
* Find the DOI assigned to a given DSpace Object, unless it has one of a
* given set of statuses.
*
* @param context current DSpace context.
* @param dso the DSpace Object.
* @param statusToExclude uninteresting statuses.
* @return the DSO's DOI.
* @throws SQLException passed through.
*/
public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List<Integer> statusToExclude) public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List<Integer> statusToExclude)
throws SQLException; throws SQLException;
/** /**
* This method helps to convert a DOI into a URL. It takes DOIs in one of * This method helps to convert a DOI into a URL. It takes DOIs in one of
* the following formats and returns it as URL (f.e. * the following formats and returns it as URL (f.e.
@@ -50,11 +89,17 @@ public interface DOIService {
* @param identifier A DOI that should be returned in external form. * @param identifier A DOI that should be returned in external form.
* @return A String containing a URL to the official DOI resolver. * @return A String containing a URL to the official DOI resolver.
* @throws IllegalArgumentException If identifier is null or an empty String. * @throws IllegalArgumentException If identifier is null or an empty String.
* @throws org.dspace.identifier.IdentifierException If identifier could not be recognized as valid DOI. * @throws IdentifierException If identifier could not be recognized as valid DOI.
*/ */
public String DOIToExternalForm(String identifier) public String DOIToExternalForm(String identifier)
throws IdentifierException; throws IdentifierException;
/**
* Convert an HTTP DOI URL (https://doi.org/10.something) to a "doi:" URI.
* @param identifier HTTP URL
* @return DOI URI
* @throws DOIIdentifierException if {@link identifier} is not recognizable.
*/
public String DOIFromExternalFormat(String identifier) public String DOIFromExternalFormat(String identifier)
throws DOIIdentifierException; throws DOIIdentifierException;
@@ -65,15 +110,23 @@ public interface DOIService {
* f.e. 10.123/456, doi:10.123/456, http://dx.doi.org/10.123/456. * f.e. 10.123/456, doi:10.123/456, http://dx.doi.org/10.123/456.
* @return Given Identifier with DOI-Scheme, f.e. doi:10.123/456. * @return Given Identifier with DOI-Scheme, f.e. doi:10.123/456.
* @throws IllegalArgumentException If identifier is empty or null. * @throws IllegalArgumentException If identifier is empty or null.
* @throws org.dspace.identifier.doi.DOIIdentifierException If DOI could not be recognized. * @throws DOIIdentifierException If DOI could not be recognized.
*/ */
public String formatIdentifier(String identifier) public String formatIdentifier(String identifier)
throws DOIIdentifierException; throws DOIIdentifierException;
/**
* Find all DOIs that have one of a given set of statuses.
* @param context current DSpace session.
* @param statuses desired statuses.
* @return all DOIs having any of the given statuses.
* @throws SQLException passed through.
*/
public List<DOI> getDOIsByStatus(Context context, List<Integer> statuses) throws SQLException; public List<DOI> getDOIsByStatus(Context context, List<Integer> statuses) throws SQLException;
/** /**
* Find all DOIs that are similar to the specified pattern ant not in the specified states. * Find all DOIs that are similar to the specified pattern and not in the
* specified states.
* *
* @param context DSpace context * @param context DSpace context
* @param doiPattern The pattern, e.g. "10.5072/123.%" * @param doiPattern The pattern, e.g. "10.5072/123.%"
@@ -85,4 +138,11 @@ public interface DOIService {
public List<DOI> getSimilarDOIsNotInState(Context context, String doiPattern, List<Integer> statuses, public List<DOI> getSimilarDOIsNotInState(Context context, String doiPattern, List<Integer> statuses,
boolean dsoIsNotNull) boolean dsoIsNotNull)
throws SQLException; throws SQLException;
/**
* Get the URL stem of the DOI resolver, e.g. "https://doi.org/".
*
* @return URL to the DOI resolver.
*/
public String getResolver();
} }

View File

@@ -23,7 +23,7 @@ public class CanvasCacheEvictService {
CacheManager cacheManager; CacheManager cacheManager;
public void evictSingleCacheValue(String cacheKey) { public void evictSingleCacheValue(String cacheKey) {
Objects.requireNonNull(cacheManager.getCache(CACHE_NAME)).evict(cacheKey); Objects.requireNonNull(cacheManager.getCache(CACHE_NAME)).evictIfPresent(cacheKey);
} }
} }

View File

@@ -26,11 +26,11 @@ public class ManifestsCacheEvictService {
CacheManager cacheManager; CacheManager cacheManager;
public void evictSingleCacheValue(String cacheKey) { public void evictSingleCacheValue(String cacheKey) {
Objects.requireNonNull(cacheManager.getCache(CACHE_NAME)).evict(cacheKey); Objects.requireNonNull(cacheManager.getCache(CACHE_NAME)).evictIfPresent(cacheKey);
} }
public void evictAllCacheValues() { public void evictAllCacheValues() {
Objects.requireNonNull(cacheManager.getCache(CACHE_NAME)).clear(); Objects.requireNonNull(cacheManager.getCache(CACHE_NAME)).invalidate();
} }
} }

View File

@@ -9,10 +9,10 @@ package org.dspace.importer.external.arxiv.metadatamapping.contributor;
import java.util.Collection; import java.util.Collection;
import org.apache.axiom.om.OMElement;
import org.dspace.importer.external.metadatamapping.MetadatumDTO; import org.dspace.importer.external.metadatamapping.MetadatumDTO;
import org.dspace.importer.external.metadatamapping.contributor.MetadataContributor; import org.dspace.importer.external.metadatamapping.contributor.MetadataContributor;
import org.dspace.importer.external.metadatamapping.contributor.SimpleXpathMetadatumContributor; import org.dspace.importer.external.metadatamapping.contributor.SimpleXpathMetadatumContributor;
import org.jdom2.Element;
/** /**
* Arxiv specific implementation of {@link MetadataContributor} * Arxiv specific implementation of {@link MetadataContributor}
@@ -32,7 +32,7 @@ public class ArXivIdMetadataContributor extends SimpleXpathMetadatumContributor
* @return a collection of import records. Only the identifier of the found records may be put in the record. * @return a collection of import records. Only the identifier of the found records may be put in the record.
*/ */
@Override @Override
public Collection<MetadatumDTO> contributeMetadata(OMElement t) { public Collection<MetadatumDTO> contributeMetadata(Element t) {
Collection<MetadatumDTO> values = super.contributeMetadata(t); Collection<MetadatumDTO> values = super.contributeMetadata(t);
parseValue(values); parseValue(values);
return values; return values;

View File

@@ -7,8 +7,10 @@
*/ */
package org.dspace.importer.external.arxiv.service; package org.dspace.importer.external.arxiv.service;
import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@@ -20,10 +22,6 @@ import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMXMLBuilderFactory;
import org.apache.axiom.om.OMXMLParserWrapper;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.importer.external.datamodel.ImportRecord; import org.dspace.importer.external.datamodel.ImportRecord;
@@ -31,7 +29,14 @@ import org.dspace.importer.external.datamodel.Query;
import org.dspace.importer.external.exception.MetadataSourceException; import org.dspace.importer.external.exception.MetadataSourceException;
import org.dspace.importer.external.service.AbstractImportMetadataSourceService; import org.dspace.importer.external.service.AbstractImportMetadataSourceService;
import org.dspace.importer.external.service.components.QuerySource; import org.dspace.importer.external.service.components.QuerySource;
import org.jaxen.JaxenException; import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.Namespace;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
/** /**
* Implements a data source for querying ArXiv * Implements a data source for querying ArXiv
@@ -39,7 +44,7 @@ import org.jaxen.JaxenException;
* @author Pasquale Cavallo (pasquale.cavallo at 4Science dot it) * @author Pasquale Cavallo (pasquale.cavallo at 4Science dot it)
* *
*/ */
public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadataSourceService<OMElement> public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadataSourceService<Element>
implements QuerySource { implements QuerySource {
private WebTarget webTarget; private WebTarget webTarget;
@@ -213,15 +218,20 @@ public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadata
Response response = invocationBuilder.get(); Response response = invocationBuilder.get();
if (response.getStatus() == 200) { if (response.getStatus() == 200) {
String responseString = response.readEntity(String.class); String responseString = response.readEntity(String.class);
OMXMLParserWrapper records = OMXMLBuilderFactory.createOMBuilder(new StringReader(responseString));
OMElement element = records.getDocumentElement(); SAXBuilder saxBuilder = new SAXBuilder();
AXIOMXPath xpath = null; Document document = saxBuilder.build(new StringReader(responseString));
Element root = document.getRootElement();
List namespaces = Arrays.asList(Namespace.getNamespace("opensearch",
"http://a9.com/-/spec/opensearch/1.1/"));
XPathExpression<Element> xpath =
XPathFactory.instance().compile("opensearch:totalResults", Filters.element(), null, namespaces);
Element count = xpath.evaluateFirst(root);
try { try {
xpath = new AXIOMXPath("opensearch:totalResults");
xpath.addNamespace("opensearch", "http://a9.com/-/spec/opensearch/1.1/");
OMElement count = (OMElement) xpath.selectSingleNode(element);
return Integer.parseInt(count.getText()); return Integer.parseInt(count.getText());
} catch (JaxenException e) { } catch (NumberFormatException e) {
return null; return null;
} }
} else { } else {
@@ -274,8 +284,8 @@ public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadata
Response response = invocationBuilder.get(); Response response = invocationBuilder.get();
if (response.getStatus() == 200) { if (response.getStatus() == 200) {
String responseString = response.readEntity(String.class); String responseString = response.readEntity(String.class);
List<OMElement> omElements = splitToRecords(responseString); List<Element> elements = splitToRecords(responseString);
for (OMElement record : omElements) { for (Element record : elements) {
results.add(transformSourceRecords(record)); results.add(transformSourceRecords(record));
} }
return results; return results;
@@ -321,8 +331,8 @@ public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadata
Response response = invocationBuilder.get(); Response response = invocationBuilder.get();
if (response.getStatus() == 200) { if (response.getStatus() == 200) {
String responseString = response.readEntity(String.class); String responseString = response.readEntity(String.class);
List<OMElement> omElements = splitToRecords(responseString); List<Element> elements = splitToRecords(responseString);
for (OMElement record : omElements) { for (Element record : elements) {
results.add(transformSourceRecords(record)); results.add(transformSourceRecords(record));
} }
return results; return results;
@@ -359,8 +369,8 @@ public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadata
Response response = invocationBuilder.get(); Response response = invocationBuilder.get();
if (response.getStatus() == 200) { if (response.getStatus() == 200) {
String responseString = response.readEntity(String.class); String responseString = response.readEntity(String.class);
List<OMElement> omElements = splitToRecords(responseString); List<Element> elements = splitToRecords(responseString);
for (OMElement record : omElements) { for (Element record : elements) {
results.add(transformSourceRecords(record)); results.add(transformSourceRecords(record));
} }
return results; return results;
@@ -387,16 +397,21 @@ public class ArXivImportMetadataSourceServiceImpl extends AbstractImportMetadata
} }
} }
private List<OMElement> splitToRecords(String recordsSrc) { private List<Element> splitToRecords(String recordsSrc) {
OMXMLParserWrapper records = OMXMLBuilderFactory.createOMBuilder(new StringReader(recordsSrc));
OMElement element = records.getDocumentElement();
AXIOMXPath xpath = null;
try { try {
xpath = new AXIOMXPath("ns:entry"); SAXBuilder saxBuilder = new SAXBuilder();
xpath.addNamespace("ns", "http://www.w3.org/2005/Atom"); Document document = saxBuilder.build(new StringReader(recordsSrc));
List<OMElement> recordsList = xpath.selectNodes(element); Element root = document.getRootElement();
List namespaces = Arrays.asList(Namespace.getNamespace("ns",
"http://www.w3.org/2005/Atom"));
XPathExpression<Element> xpath =
XPathFactory.instance().compile("ns:entry", Filters.element(), null, namespaces);
List<Element> recordsList = xpath.evaluate(root);
return recordsList; return recordsList;
} catch (JaxenException e) { } catch (JDOMException | IOException e) {
return null; return null;
} }
} }

View File

@@ -7,33 +7,36 @@
*/ */
package org.dspace.importer.external.metadatamapping.contributor; package org.dspace.importer.external.metadatamapping.contributor;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.apache.axiom.om.OMAttribute; import org.apache.logging.log4j.Logger;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMText;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.dspace.importer.external.metadatamapping.MetadataFieldConfig; import org.dspace.importer.external.metadatamapping.MetadataFieldConfig;
import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; import org.dspace.importer.external.metadatamapping.MetadataFieldMapping;
import org.dspace.importer.external.metadatamapping.MetadatumDTO; import org.dspace.importer.external.metadatamapping.MetadatumDTO;
import org.jaxen.JaxenException; import org.jdom2.Attribute;
import org.slf4j.Logger; import org.jdom2.Element;
import org.slf4j.LoggerFactory; import org.jdom2.Namespace;
import org.jdom2.Text;
import org.jdom2.filter.Filters;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
/** /**
* Metadata contributor that takes an axiom OMElement and turns it into a metadatum * Metadata contributor that takes a JDOM Element and turns it into a metadatum
* *
* @author Roeland Dillen (roeland at atmire dot com) * @author Roeland Dillen (roeland at atmire dot com)
*/ */
public class SimpleXpathMetadatumContributor implements MetadataContributor<OMElement> { public class SimpleXpathMetadatumContributor implements MetadataContributor<Element> {
private MetadataFieldConfig field; private MetadataFieldConfig field;
private static final Logger log = LoggerFactory.getLogger(SimpleXpathMetadatumContributor.class); private static final Logger log
= org.apache.logging.log4j.LogManager.getLogger();
/** /**
* Return prefixToNamespaceMapping * Return prefixToNamespaceMapping
@@ -44,14 +47,14 @@ public class SimpleXpathMetadatumContributor implements MetadataContributor<OMEl
return prefixToNamespaceMapping; return prefixToNamespaceMapping;
} }
private MetadataFieldMapping<OMElement, MetadataContributor<OMElement>> metadataFieldMapping; private MetadataFieldMapping<Element, MetadataContributor<Element>> metadataFieldMapping;
/** /**
* Return metadataFieldMapping * Return metadataFieldMapping
* *
* @return MetadataFieldMapping * @return MetadataFieldMapping
*/ */
public MetadataFieldMapping<OMElement, MetadataContributor<OMElement>> getMetadataFieldMapping() { public MetadataFieldMapping<Element, MetadataContributor<Element>> getMetadataFieldMapping() {
return metadataFieldMapping; return metadataFieldMapping;
} }
@@ -62,7 +65,7 @@ public class SimpleXpathMetadatumContributor implements MetadataContributor<OMEl
*/ */
@Override @Override
public void setMetadataFieldMapping( public void setMetadataFieldMapping(
MetadataFieldMapping<OMElement, MetadataContributor<OMElement>> metadataFieldMapping) { MetadataFieldMapping<Element, MetadataContributor<Element>> metadataFieldMapping) {
this.metadataFieldMapping = metadataFieldMapping; this.metadataFieldMapping = metadataFieldMapping;
} }
@@ -140,36 +143,35 @@ public class SimpleXpathMetadatumContributor implements MetadataContributor<OMEl
* Depending on the retrieved node (using the query), different types of values will be added to the MetadatumDTO * Depending on the retrieved node (using the query), different types of values will be added to the MetadatumDTO
* list * list
* *
* @param t A class to retrieve metadata from. * @param t An element to retrieve metadata from.
* @return a collection of import records. Only the identifier of the found records may be put in the record. * @return a collection of import records. Only the identifier of the found records may be put in the record.
*/ */
@Override @Override
public Collection<MetadatumDTO> contributeMetadata(OMElement t) { public Collection<MetadatumDTO> contributeMetadata(Element t) {
List<MetadatumDTO> values = new LinkedList<>(); List<MetadatumDTO> values = new LinkedList<>();
try {
AXIOMXPath xpath = new AXIOMXPath(query); List<Namespace> namespaces = new ArrayList<>();
for (String ns : prefixToNamespaceMapping.keySet()) { for (String ns : prefixToNamespaceMapping.keySet()) {
xpath.addNamespace(prefixToNamespaceMapping.get(ns), ns); namespaces.add(Namespace.getNamespace(prefixToNamespaceMapping.get(ns), ns));
} }
List<Object> nodes = xpath.selectNodes(t);
XPathExpression<Object> xpath =
XPathFactory.instance().compile(query, Filters.fpassthrough(), null, namespaces);
List<Object> nodes = xpath.evaluate(t);
for (Object el : nodes) { for (Object el : nodes) {
if (el instanceof OMElement) { if (el instanceof Element) {
values.add(metadataFieldMapping.toDCValue(field, ((OMElement) el).getText())); values.add(metadataFieldMapping.toDCValue(field, ((Element) el).getText()));
} else if (el instanceof OMAttribute) { } else if (el instanceof Attribute) {
values.add(metadataFieldMapping.toDCValue(field, ((OMAttribute) el).getAttributeValue())); values.add(metadataFieldMapping.toDCValue(field, ((Attribute) el).getValue()));
} else if (el instanceof String) { } else if (el instanceof String) {
values.add(metadataFieldMapping.toDCValue(field, (String) el)); values.add(metadataFieldMapping.toDCValue(field, (String) el));
} else if (el instanceof OMText) { } else if (el instanceof Text) {
values.add(metadataFieldMapping.toDCValue(field, ((OMText) el).getText())); values.add(metadataFieldMapping.toDCValue(field, ((Text) el).getText()));
} else { } else {
log.error("node of type: " + el.getClass()); log.error("Encountered unsupported XML node of type: {}. Skipped that node.", el.getClass());
} }
} }
return values; return values;
} catch (JaxenException e) {
log.error(query, e);
throw new RuntimeException(e);
}
} }
} }

View File

@@ -25,10 +25,6 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import com.google.common.io.CharStreams; import com.google.common.io.CharStreams;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMXMLBuilderFactory;
import org.apache.axiom.om.OMXMLParserWrapper;
import org.apache.axiom.om.xpath.AXIOMXPath;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.importer.external.datamodel.ImportRecord; import org.dspace.importer.external.datamodel.ImportRecord;
import org.dspace.importer.external.datamodel.Query; import org.dspace.importer.external.datamodel.Query;
@@ -38,7 +34,13 @@ import org.dspace.importer.external.exception.MetadataSourceException;
import org.dspace.importer.external.service.AbstractImportMetadataSourceService; import org.dspace.importer.external.service.AbstractImportMetadataSourceService;
import org.dspace.importer.external.service.components.FileSource; import org.dspace.importer.external.service.components.FileSource;
import org.dspace.importer.external.service.components.QuerySource; import org.dspace.importer.external.service.components.QuerySource;
import org.jaxen.JaxenException; import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
/** /**
* Implements a data source for querying PubMed Central * Implements a data source for querying PubMed Central
@@ -46,7 +48,7 @@ import org.jaxen.JaxenException;
* @author Roeland Dillen (roeland at atmire dot com) * @author Roeland Dillen (roeland at atmire dot com)
* @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it)
*/ */
public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadataSourceService<OMElement> public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadataSourceService<Element>
implements QuerySource, FileSource { implements QuerySource, FileSource {
private String baseAddress; private String baseAddress;
@@ -243,17 +245,21 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
private String getSingleElementValue(String src, String elementName) { private String getSingleElementValue(String src, String elementName) {
OMXMLParserWrapper records = OMXMLBuilderFactory.createOMBuilder(new StringReader(src));
OMElement element = records.getDocumentElement();
AXIOMXPath xpath = null;
String value = null; String value = null;
try { try {
xpath = new AXIOMXPath("//" + elementName); SAXBuilder saxBuilder = new SAXBuilder();
List<OMElement> recordsList = xpath.selectNodes(element); Document document = saxBuilder.build(new StringReader(src));
if (!recordsList.isEmpty()) { Element root = document.getRootElement();
value = recordsList.get(0).getText();
XPathExpression<Element> xpath =
XPathFactory.instance().compile("//" + elementName, Filters.element());
Element record = xpath.evaluateFirst(root);
if (record != null) {
value = record.getText();
} }
} catch (JaxenException e) { } catch (JDOMException | IOException e) {
value = null; value = null;
} }
return value; return value;
@@ -314,9 +320,9 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
invocationBuilder = getRecordsTarget.request(MediaType.TEXT_PLAIN_TYPE); invocationBuilder = getRecordsTarget.request(MediaType.TEXT_PLAIN_TYPE);
response = invocationBuilder.get(); response = invocationBuilder.get();
List<OMElement> omElements = splitToRecords(response.readEntity(String.class)); List<Element> elements = splitToRecords(response.readEntity(String.class));
for (OMElement record : omElements) { for (Element record : elements) {
records.add(transformSourceRecords(record)); records.add(transformSourceRecords(record));
} }
@@ -324,15 +330,18 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
} }
} }
private List<OMElement> splitToRecords(String recordsSrc) { private List<Element> splitToRecords(String recordsSrc) {
OMXMLParserWrapper records = OMXMLBuilderFactory.createOMBuilder(new StringReader(recordsSrc));
OMElement element = records.getDocumentElement();
AXIOMXPath xpath = null;
try { try {
xpath = new AXIOMXPath("//PubmedArticle"); SAXBuilder saxBuilder = new SAXBuilder();
List<OMElement> recordsList = xpath.selectNodes(element); Document document = saxBuilder.build(new StringReader(recordsSrc));
Element root = document.getRootElement();
XPathExpression<Element> xpath =
XPathFactory.instance().compile("//PubmedArticle", Filters.element());
List<Element> recordsList = xpath.evaluate(root);
return recordsList; return recordsList;
} catch (JaxenException e) { } catch (JDOMException | IOException e) {
return null; return null;
} }
} }
@@ -362,13 +371,13 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
Response response = invocationBuilder.get(); Response response = invocationBuilder.get();
List<OMElement> omElements = splitToRecords(response.readEntity(String.class)); List<Element> elements = splitToRecords(response.readEntity(String.class));
if (omElements.size() == 0) { if (elements.isEmpty()) {
return null; return null;
} }
return transformSourceRecords(omElements.get(0)); return transformSourceRecords(elements.get(0));
} }
} }
@@ -441,8 +450,8 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat
private List<ImportRecord> parseXMLString(String xml) { private List<ImportRecord> parseXMLString(String xml) {
List<ImportRecord> records = new LinkedList<ImportRecord>(); List<ImportRecord> records = new LinkedList<ImportRecord>();
List<OMElement> omElements = splitToRecords(xml); List<Element> elements = splitToRecords(xml);
for (OMElement record : omElements) { for (Element record : elements) {
records.add(transformSourceRecords(record)); records.add(transformSourceRecords(record));
} }
return records; return records;

View File

@@ -10,7 +10,7 @@ package org.dspace.license;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import org.jdom.Document; import org.jdom2.Document;
/** /**
* Service interface class for the Creative commons license connector service. * Service interface class for the Creative commons license connector service.

View File

@@ -32,13 +32,14 @@ import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.jaxen.JaxenException; import org.jdom2.Attribute;
import org.jaxen.jdom.JDOMXPath; import org.jdom2.Document;
import org.jdom.Attribute; import org.jdom2.Element;
import org.jdom.Document; import org.jdom2.JDOMException;
import org.jdom.Element; import org.jdom2.filter.Filters;
import org.jdom.JDOMException; import org.jdom2.input.SAXBuilder;
import org.jdom.input.SAXBuilder; import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
@@ -96,7 +97,7 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
List<String> licenses; List<String> licenses;
try (CloseableHttpResponse response = client.execute(httpGet)) { try (CloseableHttpResponse response = client.execute(httpGet)) {
licenses = retrieveLicenses(response); licenses = retrieveLicenses(response);
} catch (JDOMException | JaxenException | IOException e) { } catch (JDOMException | IOException e) {
log.error("Error while retrieving the license details using url: " + uri, e); log.error("Error while retrieving the license details using url: " + uri, e);
licenses = Collections.emptyList(); licenses = Collections.emptyList();
} }
@@ -110,7 +111,7 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
try (CloseableHttpResponse response = client.execute(licenseHttpGet)) { try (CloseableHttpResponse response = client.execute(licenseHttpGet)) {
CCLicense ccLicense = retrieveLicenseObject(license, response); CCLicense ccLicense = retrieveLicenseObject(license, response);
ccLicenses.put(ccLicense.getLicenseId(), ccLicense); ccLicenses.put(ccLicense.getLicenseId(), ccLicense);
} catch (JaxenException | JDOMException | IOException e) { } catch (JDOMException | IOException e) {
log.error("Error while retrieving the license details using url: " + licenseUri, e); log.error("Error while retrieving the license details using url: " + licenseUri, e);
} }
} }
@@ -125,25 +126,23 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
* @param response The response from the API * @param response The response from the API
* @return a list of license identifiers for which details need to be retrieved * @return a list of license identifiers for which details need to be retrieved
* @throws IOException * @throws IOException
* @throws JaxenException
* @throws JDOMException * @throws JDOMException
*/ */
private List<String> retrieveLicenses(CloseableHttpResponse response) private List<String> retrieveLicenses(CloseableHttpResponse response)
throws IOException, JaxenException, JDOMException { throws IOException, JDOMException {
List<String> domains = new LinkedList<>(); List<String> domains = new LinkedList<>();
String[] excludedLicenses = configurationService.getArrayProperty("cc.license.classfilter"); String[] excludedLicenses = configurationService.getArrayProperty("cc.license.classfilter");
String responseString = EntityUtils.toString(response.getEntity()); String responseString = EntityUtils.toString(response.getEntity());
JDOMXPath licenseClassXpath = new JDOMXPath("//licenses/license"); XPathExpression<Element> licenseClassXpath =
XPathFactory.instance().compile("//licenses/license", Filters.element());
try (StringReader stringReader = new StringReader(responseString)) { try (StringReader stringReader = new StringReader(responseString)) {
InputSource is = new InputSource(stringReader); InputSource is = new InputSource(stringReader);
org.jdom.Document classDoc = this.parser.build(is); org.jdom2.Document classDoc = this.parser.build(is);
List<Element> elements = licenseClassXpath.selectNodes(classDoc); List<Element> elements = licenseClassXpath.evaluate(classDoc);
for (Element element : elements) { for (Element element : elements) {
String licenseId = getSingleNodeValue(element, "@id"); String licenseId = getSingleNodeValue(element, "@id");
if (StringUtils.isNotBlank(licenseId) && !ArrayUtils.contains(excludedLicenses, licenseId)) { if (StringUtils.isNotBlank(licenseId) && !ArrayUtils.contains(excludedLicenses, licenseId)) {
@@ -163,30 +162,29 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
* @param response for a specific CC License response * @param response for a specific CC License response
* @return the corresponding CC License Object * @return the corresponding CC License Object
* @throws IOException * @throws IOException
* @throws JaxenException
* @throws JDOMException * @throws JDOMException
*/ */
private CCLicense retrieveLicenseObject(final String licenseId, CloseableHttpResponse response) private CCLicense retrieveLicenseObject(final String licenseId, CloseableHttpResponse response)
throws IOException, JaxenException, JDOMException { throws IOException, JDOMException {
String responseString = EntityUtils.toString(response.getEntity()); String responseString = EntityUtils.toString(response.getEntity());
XPathExpression<Object> licenseClassXpath =
JDOMXPath licenseClassXpath = new JDOMXPath("//licenseclass"); XPathFactory.instance().compile("//licenseclass", Filters.fpassthrough());
JDOMXPath licenseFieldXpath = new JDOMXPath("field"); XPathExpression<Element> licenseFieldXpath =
XPathFactory.instance().compile("field", Filters.element());
try (StringReader stringReader = new StringReader(responseString)) { try (StringReader stringReader = new StringReader(responseString)) {
InputSource is = new InputSource(stringReader); InputSource is = new InputSource(stringReader);
org.jdom.Document classDoc = this.parser.build(is); org.jdom2.Document classDoc = this.parser.build(is);
Object element = licenseClassXpath.selectSingleNode(classDoc); Object element = licenseClassXpath.evaluateFirst(classDoc);
String licenseLabel = getSingleNodeValue(element, "label"); String licenseLabel = getSingleNodeValue(element, "label");
List<CCLicenseField> ccLicenseFields = new LinkedList<>(); List<CCLicenseField> ccLicenseFields = new LinkedList<>();
List<Element> licenseFields = licenseFieldXpath.selectNodes(element); List<Element> licenseFields = licenseFieldXpath.evaluate(element);
for (Element licenseField : licenseFields) { for (Element licenseField : licenseFields) {
CCLicenseField ccLicenseField = parseLicenseField(licenseField); CCLicenseField ccLicenseField = parseLicenseField(licenseField);
ccLicenseFields.add(ccLicenseField); ccLicenseFields.add(ccLicenseField);
@@ -196,13 +194,14 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
} }
} }
private CCLicenseField parseLicenseField(final Element licenseField) throws JaxenException { private CCLicenseField parseLicenseField(final Element licenseField) {
String id = getSingleNodeValue(licenseField, "@id"); String id = getSingleNodeValue(licenseField, "@id");
String label = getSingleNodeValue(licenseField, "label"); String label = getSingleNodeValue(licenseField, "label");
String description = getSingleNodeValue(licenseField, "description"); String description = getSingleNodeValue(licenseField, "description");
JDOMXPath enumXpath = new JDOMXPath("enum"); XPathExpression<Element> enumXpath =
List<Element> enums = enumXpath.selectNodes(licenseField); XPathFactory.instance().compile("enum", Filters.element());
List<Element> enums = enumXpath.evaluate(licenseField);
List<CCLicenseFieldEnum> ccLicenseFieldEnumList = new LinkedList<>(); List<CCLicenseFieldEnum> ccLicenseFieldEnumList = new LinkedList<>();
@@ -215,7 +214,7 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
} }
private CCLicenseFieldEnum parseEnum(final Element enumElement) throws JaxenException { private CCLicenseFieldEnum parseEnum(final Element enumElement) {
String id = getSingleNodeValue(enumElement, "@id"); String id = getSingleNodeValue(enumElement, "@id");
String label = getSingleNodeValue(enumElement, "label"); String label = getSingleNodeValue(enumElement, "label");
String description = getSingleNodeValue(enumElement, "description"); String description = getSingleNodeValue(enumElement, "description");
@@ -236,9 +235,10 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
} }
} }
private String getSingleNodeValue(final Object t, String query) throws JaxenException { private String getSingleNodeValue(final Object t, String query) {
JDOMXPath xpath = new JDOMXPath(query); XPathExpression xpath =
Object singleNode = xpath.selectSingleNode(t); XPathFactory.instance().compile(query, Filters.fpassthrough());
Object singleNode = xpath.evaluateFirst(t);
return getNodeValue(singleNode); return getNodeValue(singleNode);
} }
@@ -273,7 +273,7 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
try (CloseableHttpResponse response = client.execute(httpPost)) { try (CloseableHttpResponse response = client.execute(httpPost)) {
return retrieveLicenseUri(response); return retrieveLicenseUri(response);
} catch (JDOMException | JaxenException | IOException e) { } catch (JDOMException | IOException e) {
log.error("Error while retrieving the license uri for license : " + licenseId + " with answers " log.error("Error while retrieving the license uri for license : " + licenseId + " with answers "
+ answerMap.toString(), e); + answerMap.toString(), e);
} }
@@ -286,21 +286,20 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
* @param response for a specific CC License URI response * @param response for a specific CC License URI response
* @return the corresponding CC License URI as a string * @return the corresponding CC License URI as a string
* @throws IOException * @throws IOException
* @throws JaxenException
* @throws JDOMException * @throws JDOMException
*/ */
private String retrieveLicenseUri(final CloseableHttpResponse response) private String retrieveLicenseUri(final CloseableHttpResponse response)
throws IOException, JaxenException, JDOMException { throws IOException, JDOMException {
String responseString = EntityUtils.toString(response.getEntity()); String responseString = EntityUtils.toString(response.getEntity());
JDOMXPath licenseClassXpath = new JDOMXPath("//result/license-uri"); XPathExpression<Object> licenseClassXpath =
XPathFactory.instance().compile("//result/license-uri", Filters.fpassthrough());
try (StringReader stringReader = new StringReader(responseString)) { try (StringReader stringReader = new StringReader(responseString)) {
InputSource is = new InputSource(stringReader); InputSource is = new InputSource(stringReader);
org.jdom.Document classDoc = this.parser.build(is); org.jdom2.Document classDoc = this.parser.build(is);
Object node = licenseClassXpath.selectSingleNode(classDoc); Object node = licenseClassXpath.evaluateFirst(classDoc);
String nodeValue = getNodeValue(node); String nodeValue = getNodeValue(node);
if (StringUtils.isNotBlank(nodeValue)) { if (StringUtils.isNotBlank(nodeValue)) {
@@ -364,12 +363,7 @@ public class CCLicenseConnectorServiceImpl implements CCLicenseConnectorService,
* @return the license name * @return the license name
*/ */
public String retrieveLicenseName(final Document doc) { public String retrieveLicenseName(final Document doc) {
try {
return getSingleNodeValue(doc, "//result/license-name"); return getSingleNodeValue(doc, "//result/license-name");
} catch (JaxenException e) {
log.error("Error while retrieving the license name from the license document", e);
}
return null;
} }
} }

View File

@@ -40,8 +40,8 @@ import org.dspace.core.Utils;
import org.dspace.license.service.CreativeCommonsService; import org.dspace.license.service.CreativeCommonsService;
import org.dspace.services.ConfigurationService; import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.factory.DSpaceServicesFactory;
import org.jdom.Document; import org.jdom2.Document;
import org.jdom.transform.JDOMSource; import org.jdom2.transform.JDOMSource;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -18,7 +18,7 @@ import org.dspace.content.Bitstream;
import org.dspace.content.Item; import org.dspace.content.Item;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.license.CCLicense; import org.dspace.license.CCLicense;
import org.jdom.Document; import org.jdom2.Document;
/** /**
* Service interface class for the Creative commons licensing. * Service interface class for the Creative commons licensing.

View File

@@ -286,10 +286,10 @@ public class RDFConsumer implements Consumer {
@Override @Override
public void end(Context ctx) throws Exception { public void end(Context ctx) throws Exception {
log.debug("Started processing of queued events."); log.debug("Started processing of queued events.");
// create a new context, to be sure to work as anonymous user // store the context mode, set context read only for performance reasons, and restore the old mode
// we don't want to store private data in a triplestore with public Context.Mode oldMode = ctx.getCurrentMode();
// SPARQL endpoint. try {
ctx = new Context(Context.Mode.READ_ONLY); ctx.setMode(Context.Mode.READ_ONLY);
if (toDelete == null) { if (toDelete == null) {
log.debug("Deletion queue does not exists, creating empty queue."); log.debug("Deletion queue does not exists, creating empty queue.");
this.toDelete = new LinkedList<>(); this.toDelete = new LinkedList<>();
@@ -330,7 +330,10 @@ public class RDFConsumer implements Consumer {
+ id.id.toString() + "."); + id.id.toString() + ".");
delete(ctx, id); delete(ctx, id);
} }
ctx.abort(); } finally {
// restore context mode
ctx.setMode(oldMode);
}
log.debug("Deletion finished."); log.debug("Deletion finished.");
} }

View File

@@ -1,70 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.statistics;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
/**
* A neutral data object to hold data for statistics.
*/
public class DataTermsFacet {
private List<TermsFacet> terms;
public DataTermsFacet() {
terms = new ArrayList<TermsFacet>();
}
public void addTermFacet(TermsFacet termsFacet) {
terms.add(termsFacet);
}
/**
* Render this data object into JSON format.
*
* An example of the output could be of the format:
* [{"term":"247166","count":10},{"term":"247168","count":6}]
*
* @return JSON-formatted data.
*/
public String toJson() {
Gson gson = new Gson();
return gson.toJson(terms);
}
public static class TermsFacet {
private String term;
private Integer count;
public TermsFacet(String term, Integer count) {
setTerm(term);
setCount(count);
}
public String getTerm() {
return term;
}
public void setTerm(String term) {
this.term = term;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
}

Some files were not shown because too many files have changed in this diff Show More