diff --git a/Dockerfile b/Dockerfile.jdk8
similarity index 90%
rename from Dockerfile
rename to Dockerfile.jdk8
index 03913666ea..c404ad451f 100644
--- a/Dockerfile
+++ b/Dockerfile.jdk8
@@ -1,5 +1,12 @@
# This image will be published as dspace/dspace
# See https://dspace-labs.github.io/DSpace-Docker-Images/ for usage details
+#
+# This version is JDK8 compatible
+# - tomcat:8-jre8
+# - ANT 1.10.5
+# - maven:latest
+# - note:
+# - default tag for branch: dspace/dspace: dspace/dspace:dspace-7_x-jdk8
# Step 1 - Run Maven Build
FROM maven as build
@@ -12,7 +19,7 @@ COPY dspace/src/main/docker/local.cfg /app/local.cfg
RUN mvn package
# Step 2 - Run Ant Deploy
-FROM tomcat:8 as ant_build
+FROM tomcat:8-jre8 as ant_build
ARG TARGET_DIR=dspace-installer
COPY --from=build /app /dspace-src
WORKDIR /dspace-src/dspace/target/${TARGET_DIR}
@@ -29,7 +36,7 @@ RUN ant update_configs update_code update_webapps update_solr_indexes
# Step 3 - Run tomcat
# Create a new tomcat image that does not retain the the build directory contents
-FROM tomcat:8
+FROM tomcat:8-jre8
COPY --from=ant_build /dspace /dspace
EXPOSE 8080 8009
diff --git a/Dockerfile.jdk8-test b/Dockerfile.jdk8-test
new file mode 100644
index 0000000000..3cae9e4b66
--- /dev/null
+++ b/Dockerfile.jdk8-test
@@ -0,0 +1,64 @@
+# This image will be published as dspace/dspace
+# See https://dspace-labs.github.io/DSpace-Docker-Images/ for usage details
+#
+# This version is JDK8 compatible
+# - tomcat:8-jre8
+# - ANT 1.10.5
+# - maven:latest
+# - note: expose /solr to any host; provide /rest over http
+# - default tag for branch: dspace/dspace: dspace/dspace:dspace-7_x-jdk8-test
+
+# Step 1 - Run Maven Build
+FROM maven as build
+WORKDIR /app
+
+# Copy the DSpace source code into the workdir (excluding .dockerignore contents)
+ADD . /app/
+COPY dspace/src/main/docker/local.cfg /app/local.cfg
+
+# Provide web.xml overrides to make webapps easier to test
+COPY dspace/src/main/docker/test/solr_web.xml /app/dspace-solr/src/main/webapp/WEB-INF/web.xml
+COPY dspace/src/main/docker/test/rest_web.xml /app/dspace-rest/src/main/webapp/WEB-INF/web.xml
+
+RUN mvn package
+
+# Step 2 - Run Ant Deploy
+FROM tomcat:8-jre8 as ant_build
+ARG TARGET_DIR=dspace-installer
+COPY --from=build /app /dspace-src
+WORKDIR /dspace-src/dspace/target/${TARGET_DIR}
+
+# Create the initial install deployment using ANT
+ENV ANT_VERSION 1.10.5
+ENV ANT_HOME /tmp/ant-$ANT_VERSION
+ENV PATH $ANT_HOME/bin:$PATH
+
+RUN mkdir $ANT_HOME && \
+ wget -qO- "https://www.apache.org/dist/ant/binaries/apache-ant-$ANT_VERSION-bin.tar.gz" | tar -zx --strip-components=1 -C $ANT_HOME
+
+RUN ant update_configs update_code update_webapps update_solr_indexes
+
+# Step 3 - Run tomcat
+# Create a new tomcat image that does not retain the the build directory contents
+FROM tomcat:8-jre8
+COPY --from=ant_build /dspace /dspace
+EXPOSE 8080 8009
+
+# Ant will be embedded in the final container to allow additional deployments
+ENV ANT_VERSION 1.10.5
+ENV ANT_HOME /tmp/ant-$ANT_VERSION
+ENV PATH $ANT_HOME/bin:$PATH
+
+RUN mkdir $ANT_HOME && \
+ wget -qO- "https://www.apache.org/dist/ant/binaries/apache-ant-$ANT_VERSION-bin.tar.gz" | tar -zx --strip-components=1 -C $ANT_HOME
+
+ENV DSPACE_INSTALL=/dspace
+ENV JAVA_OPTS=-Xmx2000m
+
+RUN ln -s $DSPACE_INSTALL/webapps/solr /usr/local/tomcat/webapps/solr && \
+ ln -s $DSPACE_INSTALL/webapps/spring-rest /usr/local/tomcat/webapps/spring-rest && \
+ ln -s $DSPACE_INSTALL/webapps/rest /usr/local/tomcat/webapps/rest && \
+ ln -s $DSPACE_INSTALL/webapps/oai /usr/local/tomcat/webapps/oai && \
+ ln -s $DSPACE_INSTALL/webapps/rdf /usr/local/tomcat/webapps/rdf && \
+ ln -s $DSPACE_INSTALL/webapps/sword /usr/local/tomcat/webapps/sword && \
+ ln -s $DSPACE_INSTALL/webapps/swordv2 /usr/local/tomcat/webapps/swordv2
diff --git a/README.md b/README.md
index aa38a079d4..a62fc1943d 100644
--- a/README.md
+++ b/README.md
@@ -40,6 +40,9 @@ Please be aware that, as a Java web application, DSpace requires a database (Pos
and a servlet container (usually Tomcat) in order to function.
More information about these and all other prerequisites can be found in the Installation instructions above.
+## Dockerfile Usage
+See the [DSpace Docker Tutorial](https://dspace-labs.github.io/DSpace-Docker-Images/).
+
## Contributing
DSpace is a community built and supported project. We do not have a centralized development or support team,
diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml
index fb6a90d965..5c698f7e89 100644
--- a/dspace-api/pom.xml
+++ b/dspace-api/pom.xml
@@ -351,6 +351,24 @@
org.apache.jenaapache-jena-libspom
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+ log4j
+ log4j
+
+ commons-cli
@@ -364,10 +382,6 @@
org.apache.commonscommons-collections4
-
- org.apache.commons
- commons-collections4
- org.apache.commonscommons-dbcp2
@@ -382,8 +396,8 @@
commons-io
- commons-lang
- commons-lang
+ org.apache.commons
+ commons-lang3org.apache.commons
@@ -399,7 +413,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
@@ -417,8 +431,16 @@
jdom
- log4j
- log4j
+ org.apache.logging.log4j
+ log4j-api
+
+
+ org.apache.logging.log4j
+ log4j-1.2-api
+
+
+ org.apache.logging.log4j
+ log4j-coreoro
@@ -530,6 +552,10 @@
org.mockitomockito-core
+
+
+ log4j
+ log4j
@@ -547,6 +573,10 @@
org.mockitomockito-core
+
+
+ log4j
+ log4j
@@ -575,8 +605,8 @@
- commons-configuration
- commons-configuration
+ org.apache.commons
+ commons-configuration2com.maxmind.geoip2
@@ -615,7 +645,6 @@
com.google.guavaguava
- 19.0
diff --git a/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java b/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java
index 7d603158ba..a58691e251 100644
--- a/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java
+++ b/dspace-api/src/main/java/org/dspace/administer/CreateAdministrator.java
@@ -15,7 +15,7 @@ import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
import org.dspace.core.I18nUtil;
diff --git a/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java b/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java
index f1b8a0684c..b2f7280252 100644
--- a/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java
+++ b/dspace-api/src/main/java/org/dspace/administer/RegistryLoader.java
@@ -17,7 +17,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.BitstreamFormat;
@@ -47,7 +47,7 @@ public class RegistryLoader {
/**
* log4j category
*/
- private static Logger log = Logger.getLogger(RegistryLoader.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RegistryLoader.class);
protected static BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance()
.getBitstreamFormatService();
diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
index 9f94506980..b8b7b7311f 100644
--- a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
+++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java
@@ -25,8 +25,8 @@ import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.authority.AuthorityValue;
import org.dspace.authority.factory.AuthorityServiceFactory;
import org.dspace.authority.service.AuthorityValueService;
@@ -92,7 +92,7 @@ public class MetadataImport {
/**
* Logger
*/
- protected static final Logger log = Logger.getLogger(MetadataImport.class);
+ protected static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataImport.class);
protected final AuthorityValueService authorityValueService;
diff --git a/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java b/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java
index 40cea2f786..28f7b6644a 100644
--- a/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java
+++ b/dspace-api/src/main/java/org/dspace/app/checker/ChecksumChecker.java
@@ -23,7 +23,8 @@ import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.checker.BitstreamDispatcher;
import org.dspace.checker.CheckerCommand;
import org.dspace.checker.HandleDispatcher;
@@ -48,7 +49,7 @@ import org.dspace.core.Utils;
* @author Nathan Sarr
*/
public final class ChecksumChecker {
- private static final Logger LOG = Logger.getLogger(ChecksumChecker.class);
+ private static final Logger LOG = LogManager.getLogger(ChecksumChecker.class);
private static final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService();
diff --git a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java
index 170aa0c620..d3ffb14a9a 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemexport/ItemExportServiceImpl.java
@@ -32,8 +32,8 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.mail.MessagingException;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.itemexport.service.ItemExportService;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
@@ -98,7 +98,7 @@ public class ItemExportServiceImpl implements ItemExportService {
/**
* log4j logger
*/
- private Logger log = Logger.getLogger(ItemExportServiceImpl.class);
+ private Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemExportServiceImpl.class);
protected ItemExportServiceImpl() {
diff --git a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java
index 829594f448..e848c7b9a3 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemimport/ItemImportServiceImpl.java
@@ -55,10 +55,10 @@ import gr.ekt.bteio.loaders.OAIPMHDataLoader;
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.io.FileDeleteStrategy;
import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.dspace.app.itemimport.service.ItemImportService;
import org.dspace.app.util.LocalSchemaFilenameFilter;
@@ -124,7 +124,7 @@ import org.xml.sax.SAXException;
* allow the registration of files (bitstreams) into DSpace.
*/
public class ItemImportServiceImpl implements ItemImportService, InitializingBean {
- private final Logger log = Logger.getLogger(ItemImportServiceImpl.class);
+ private final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemImportServiceImpl.class);
@Autowired(required = true)
protected AuthorizeService authorizeService;
diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java
index 8b07335904..2270d736a8 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/ItemArchive.java
@@ -30,7 +30,7 @@ import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.util.LocalSchemaFilenameFilter;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.DSpaceObject;
@@ -47,7 +47,7 @@ import org.w3c.dom.Document;
* Encapsulates the Item in the context of the DSpace Archive Format
*/
public class ItemArchive {
- private static final Logger log = Logger.getLogger(ItemArchive.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemArchive.class);
public static final String DUBLIN_CORE_XML = "dublin_core.xml";
diff --git a/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java b/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java
index 82ed5f75a0..8b3907ce50 100644
--- a/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java
+++ b/dspace-api/src/main/java/org/dspace/app/itemupdate/MetadataUtilities.java
@@ -28,7 +28,7 @@ import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.xpath.XPathAPI;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Item;
diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java
index 28db4cea8a..c17d168c04 100644
--- a/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java
+++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/ExcelFilter.java
@@ -11,7 +11,7 @@ import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.hssf.extractor.ExcelExtractor;
@@ -36,7 +36,7 @@ import org.dspace.content.Item;
*/
public class ExcelFilter extends MediaFilter {
- private static Logger log = Logger.getLogger(ExcelFilter.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ExcelFilter.class);
public String getFilteredName(String oldFilename) {
return oldFilename + ".txt";
diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java
index fb9a120aa3..74751aec7e 100644
--- a/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java
+++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/MediaFilterCLITool.java
@@ -22,7 +22,7 @@ import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
import org.dspace.app.mediafilter.factory.MediaFilterServiceFactory;
import org.dspace.app.mediafilter.service.MediaFilterService;
import org.dspace.content.Collection;
diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java
index 6f398dabde..10ad5469d7 100644
--- a/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java
+++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/PDFFilter.java
@@ -16,7 +16,7 @@ import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.dspace.content.Item;
@@ -30,7 +30,7 @@ import org.dspace.core.ConfigurationManager;
*/
public class PDFFilter extends MediaFilter {
- private static Logger log = Logger.getLogger(PDFFilter.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PDFFilter.class);
@Override
public String getFilteredName(String oldFilename) {
diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java
index e0345ed3e8..86b7096f68 100644
--- a/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java
+++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/PowerPointFilter.java
@@ -10,7 +10,7 @@ package org.dspace.app.mediafilter;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.apache.poi.POITextExtractor;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.hslf.extractor.PowerPointExtractor;
@@ -23,7 +23,7 @@ import org.dspace.content.Item;
*/
public class PowerPointFilter extends MediaFilter {
- private static Logger log = Logger.getLogger(PowerPointFilter.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PowerPointFilter.class);
@Override
public String getFilteredName(String oldFilename) {
diff --git a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java
index 5051c01fd4..d8fa8cc768 100644
--- a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java
+++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java
@@ -11,7 +11,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Item;
import org.textmining.extraction.TextExtractor;
import org.textmining.extraction.word.WordTextExtractorFactory;
@@ -24,7 +24,7 @@ import org.textmining.extraction.word.WordTextExtractorFactory;
*/
public class WordFilter extends MediaFilter {
- private static Logger log = Logger.getLogger(WordFilter.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(WordFilter.class);
@Override
public String getFilteredName(String oldFilename) {
diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java
index d9922a9179..a5f7341039 100644
--- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java
+++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemHelpdeskStrategy.java
@@ -9,8 +9,8 @@ package org.dspace.app.requestitem;
import java.sql.SQLException;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Item;
import org.dspace.core.ConfigurationManager;
import org.dspace.core.Context;
@@ -31,7 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired;
*/
public class RequestItemHelpdeskStrategy extends RequestItemSubmitterStrategy {
- private Logger log = Logger.getLogger(RequestItemHelpdeskStrategy.class);
+ private Logger log = org.apache.logging.log4j.LogManager.getLogger(RequestItemHelpdeskStrategy.class);
@Autowired(required = true)
protected EPersonService ePersonService;
diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java
index 652f81f8c7..4d2f78408a 100644
--- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java
+++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemMetadataStrategy.java
@@ -10,7 +10,7 @@ package org.dspace.app.requestitem;
import java.sql.SQLException;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.content.Item;
import org.dspace.content.MetadataValue;
import org.dspace.content.service.ItemService;
diff --git a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java
index baf64e8657..7f3d086c03 100644
--- a/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/requestitem/RequestItemServiceImpl.java
@@ -10,7 +10,7 @@ package org.dspace.app.requestitem;
import java.sql.SQLException;
import java.util.Date;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.requestitem.dao.RequestItemDAO;
import org.dspace.app.requestitem.service.RequestItemService;
import org.dspace.content.Bitstream;
@@ -28,7 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
*/
public class RequestItemServiceImpl implements RequestItemService {
- private final Logger log = Logger.getLogger(RequestItemServiceImpl.class);
+ private final Logger log = org.apache.logging.log4j.LogManager.getLogger(RequestItemServiceImpl.class);
@Autowired(required = true)
protected RequestItemDAO requestItemDAO;
diff --git a/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java
index 8d58347bc5..184f00a53e 100644
--- a/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java
+++ b/dspace-api/src/main/java/org/dspace/app/sfx/SFXFileReaderServiceImpl.java
@@ -15,8 +15,8 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.sfx.service.SFXFileReaderService;
import org.dspace.content.DCPersonName;
import org.dspace.content.Item;
@@ -58,7 +58,7 @@ public class SFXFileReaderServiceImpl implements SFXFileReaderService {
/**
* log4j logger
*/
- private final Logger log = Logger.getLogger(SFXFileReaderServiceImpl.class);
+ private final Logger log = org.apache.logging.log4j.LogManager.getLogger(SFXFileReaderServiceImpl.class);
protected SFXFileReaderServiceImpl() {
}
diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java
index 2384225562..269cad21f2 100644
--- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java
+++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAResponse.java
@@ -13,7 +13,7 @@ import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.util.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java
index d1680a687d..36c0c70f6d 100644
--- a/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java
+++ b/dspace-api/src/main/java/org/dspace/app/sherpa/SHERPAService.java
@@ -7,7 +7,7 @@
*/
package org.dspace.app.sherpa;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
@@ -16,7 +16,7 @@ import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.core.ConfigurationManager;
public class SHERPAService {
@@ -29,7 +29,7 @@ public class SHERPAService {
/**
* log4j category
*/
- private static final Logger log = Logger.getLogger(SHERPAService.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPAService.class);
public SHERPAService() {
HttpClientBuilder builder = HttpClientBuilder.create();
diff --git a/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java b/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java
index 732c606ae8..44f2723539 100644
--- a/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java
+++ b/dspace-api/src/main/java/org/dspace/app/sherpa/submit/SHERPASubmitService.java
@@ -11,8 +11,8 @@ import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.sherpa.SHERPAResponse;
import org.dspace.app.sherpa.SHERPAService;
import org.dspace.content.Item;
@@ -27,7 +27,7 @@ public class SHERPASubmitService {
/**
* log4j logger
*/
- private static Logger log = Logger.getLogger(SHERPASubmitService.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPASubmitService.class);
public void setConfiguration(SHERPASubmitConfigurationService configuration) {
this.configuration = configuration;
diff --git a/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java b/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java
index 9c0640e072..bf8bddcd8a 100644
--- a/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java
+++ b/dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java
@@ -27,9 +27,9 @@ import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Collection;
import org.dspace.content.Community;
import org.dspace.content.Item;
@@ -52,7 +52,7 @@ public class GenerateSitemaps {
/**
* Logger
*/
- private static Logger log = Logger.getLogger(GenerateSitemaps.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GenerateSitemaps.class);
private static final CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
private static final CollectionService collectionService =
diff --git a/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java b/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java
index 02957bde4f..a151892db7 100644
--- a/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java
+++ b/dspace-api/src/main/java/org/dspace/app/statistics/StatisticsLoader.java
@@ -21,7 +21,7 @@ import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.dspace.core.ConfigurationManager;
/**
diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java
index 24c2c598ee..58bdb75878 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/DCInput.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/DCInput.java
@@ -13,7 +13,7 @@ import java.util.Map;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.content.MetadataSchema;
import org.dspace.core.Utils;
import org.slf4j.Logger;
@@ -63,6 +63,12 @@ public class DCInput {
*/
private String label = null;
+ /**
+ * a style instruction to apply to the input. The exact way to use the style value is UI depending that receive the
+ * value from the REST API as is
+ */
+ private String style = null;
+
/**
* the input type
*/
@@ -199,7 +205,7 @@ public class DCInput {
typeBind.add(type.trim());
}
}
-
+ style = fieldMap.get("style");
}
/**
@@ -262,7 +268,7 @@ public class DCInput {
}
/**
- * Get the DC element for this form row.
+ * Get the DC element for this form field.
*
* @return the DC element
*/
@@ -271,7 +277,7 @@ public class DCInput {
}
/**
- * Get the DC namespace prefix for this form row.
+ * Get the DC namespace prefix for this form field.
*
* @return the DC namespace prefix
*/
@@ -290,7 +296,7 @@ public class DCInput {
}
/**
- * Is there a required string for this form row?
+ * Is there a required string for this form field?
*
* @return true if a required string is set
*/
@@ -299,7 +305,7 @@ public class DCInput {
}
/**
- * Get the DC qualifier for this form row.
+ * Get the DC qualifier for this form field.
*
* @return the DC qualifier
*/
@@ -308,7 +314,7 @@ public class DCInput {
}
/**
- * Get the language for this form row.
+ * Get the language for this form field.
*
* @return the language state
*/
@@ -317,7 +323,7 @@ public class DCInput {
}
/**
- * Get the hint for this form row, formatted for an HTML table
+ * Get the hint for this form field
*
* @return the hints
*/
@@ -326,7 +332,7 @@ public class DCInput {
}
/**
- * Get the label for this form row.
+ * Get the label for this form field.
*
* @return the label
*/
@@ -334,6 +340,15 @@ public class DCInput {
return label;
}
+ /**
+ * Get the style for this form field
+ *
+ * @return the style
+ */
+ public String getStyle() {
+ return style;
+ }
+
/**
* Get the name of the pairs type
*
diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java b/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java
index 52405c2874..faa3fb7190 100644
--- a/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java
+++ b/dspace-api/src/main/java/org/dspace/app/util/DCInputSet.java
@@ -25,25 +25,26 @@ public class DCInputSet {
/**
* the inputs ordered by row position
*/
- private DCInput[] inputs = null;
+ private DCInput[][] inputs = null;
/**
* constructor
*
* @param formName form name
- * @param headings
* @param mandatoryFlags
- * @param fields fields
+ * @param rows the rows
* @param listMap map
*/
- public DCInputSet(String formName,
- List
- commons-lang
- commons-lang
+ org.apache.commons
+ commons-lang3
@@ -107,7 +106,15 @@
org.apache.commonscommons-lang3
-
+
+
+ log4j
+ log4j
+
+
+ org.slf4j
+ slf4j-log4j12
+
@@ -144,10 +151,6 @@
jtwig-spring${jtwig.version}
-
- org.ow2.asm
- asm
- com.google.guavaguava
@@ -160,6 +163,18 @@
org.apache.commonscommons-lang3
+
+ javax.servlet
+ servlet-api
+
+
+ log4j
+ log4j
+
+
+ org.slf4j
+ slf4j-log4j12
+
@@ -185,18 +200,26 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
- log4j
- log4j
+ org.apache.logging.log4j
+ log4j-api
- org.slf4j
- slf4j-log4j12
+ org.apache.logging.log4j
+ log4j-core
+
+
+ org.apache.logging.log4j
+ log4j-web
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-implruntime
@@ -224,10 +247,12 @@
junittest
+
+
org.hamcresthamcrest-all
- test
+ compileorg.mockito
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java b/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java
index 2edac1ce43..bc83483d7b 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/app/BasicConfiguration.java
@@ -8,7 +8,7 @@
package org.dspace.xoai.app;
import com.lyncode.xoai.dataprovider.services.api.ResourceResolver;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.xoai.services.api.CollectionsService;
import org.dspace.xoai.services.api.EarliestDateResolver;
import org.dspace.xoai.services.api.FieldResolver;
@@ -49,7 +49,7 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class BasicConfiguration {
- private static final Logger log = Logger.getLogger(BasicConfiguration.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicConfiguration.class);
@Bean
public ConfigurationService configurationService() {
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java
index aff9195264..1697b8d6d8 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/app/XOAI.java
@@ -34,8 +34,8 @@ import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.SolrServer;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java b/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java
index 456785c1e4..96e82d8eae 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/controller/DSpaceOAIDataProvider.java
@@ -9,7 +9,7 @@ package org.dspace.xoai.controller;
import static java.util.Arrays.asList;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
-import static org.apache.log4j.Logger.getLogger;
+import static org.apache.logging.log4j.LogManager.getLogger;
import java.io.IOException;
import java.io.OutputStream;
@@ -28,7 +28,7 @@ import com.lyncode.xoai.dataprovider.core.XOAIManager;
import com.lyncode.xoai.dataprovider.exceptions.InvalidContextException;
import com.lyncode.xoai.dataprovider.exceptions.OAIException;
import com.lyncode.xoai.dataprovider.exceptions.WritingXmlException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.xoai.services.api.cache.XOAICacheService;
import org.dspace.xoai.services.api.config.XOAIManagerResolver;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java
index a9b5818f3d..76d7336531 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/data/DSpaceSolrItem.java
@@ -14,8 +14,8 @@ import java.util.List;
import com.lyncode.xoai.dataprovider.core.ItemMetadata;
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.common.SolrDocument;
/**
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java
index b84868cf23..63ff355650 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAtLeastOneMetadataFilter.java
@@ -16,9 +16,9 @@ import com.lyncode.builder.ListBuilder;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterList;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.data.DSpaceMetadataFilterOperator;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java
index 5b6bd3d1b4..ebb19c84b5 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceAuthorizationFilter.java
@@ -10,8 +10,8 @@ package org.dspace.xoai.filter;
import java.sql.SQLException;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.Item;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java
index bad0c4975a..ac9c81600a 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceMetadataExistsFilter.java
@@ -12,8 +12,8 @@ import java.util.List;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterValue;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.SimpleType;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.SolrFilterResult;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java
index 502653a39c..b89056943b 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/DSpaceSetSpecFilter.java
@@ -8,8 +8,8 @@
package org.dspace.xoai.filter;
import com.lyncode.xoai.dataprovider.core.ReferenceSet;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.dspace.xoai.data.DSpaceItem;
import org.dspace.xoai.filter.results.SolrFilterResult;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java
index 37aa1b1c13..41a2a667c3 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/SolrFilterResult.java
@@ -7,8 +7,8 @@
*/
package org.dspace.xoai.filter;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
* @author Lyncode Development Team (dspace at lyncode dot com)
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java b/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java
index 38d0716950..21425fdda4 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/filter/results/SolrFilterResult.java
@@ -7,8 +7,8 @@
*/
package org.dspace.xoai.filter.results;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
* @author Lyncode Development Team (dspace at lyncode dot com)
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java
index 01ec853539..de8dc0d4ad 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/DSpaceEarliestDateResolver.java
@@ -10,8 +10,8 @@ package org.dspace.xoai.services.impl;
import java.sql.SQLException;
import java.util.Date;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.MetadataValue;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.MetadataValueService;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java
index bdcab2bbf4..5db2ff4103 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/MetadataFieldCache.java
@@ -10,8 +10,8 @@ package org.dspace.xoai.services.impl;
import java.util.HashMap;
import java.util.Map;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
* @author Lyncode Development Team (dspace at lyncode dot com)
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java
index de58edd542..2e91f4c9d4 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrQueryResolver.java
@@ -13,7 +13,7 @@ import java.util.List;
import com.lyncode.xoai.dataprovider.filter.Scope;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
import com.lyncode.xoai.dataprovider.filter.conditions.Condition;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.xoai.services.api.solr.SolrQueryResolver;
import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java
index fe71aacad7..c2a26b53b3 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/solr/DSpaceSolrServerResolver.java
@@ -7,8 +7,8 @@
*/
package org.dspace.xoai.services.impl.solr;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java
index 43df0dca82..41c2f76663 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/BaseDSpaceFilterResolver.java
@@ -17,7 +17,7 @@ import com.lyncode.xoai.dataprovider.filter.conditions.CustomCondition;
import com.lyncode.xoai.dataprovider.filter.conditions.NotCondition;
import com.lyncode.xoai.dataprovider.filter.conditions.OrCondition;
import com.lyncode.xoai.dataprovider.xml.xoaiconfig.parameters.ParameterMap;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.xoai.filter.AndFilter;
import org.dspace.xoai.filter.DSpaceFilter;
import org.dspace.xoai.filter.NotFilter;
@@ -30,7 +30,7 @@ import org.dspace.xoai.services.api.xoai.DSpaceFilterResolver;
import org.springframework.beans.factory.annotation.Autowired;
public class BaseDSpaceFilterResolver implements DSpaceFilterResolver {
- private static final Logger LOGGER = Logger.getLogger(BaseDSpaceFilterResolver.class);
+ private static final Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger(BaseDSpaceFilterResolver.class);
@Autowired
FieldResolver fieldResolver;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java
index 1836444369..9d36797e10 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceItemSolrRepository.java
@@ -19,8 +19,8 @@ import com.lyncode.xoai.dataprovider.data.Item;
import com.lyncode.xoai.dataprovider.data.ItemIdentifier;
import com.lyncode.xoai.dataprovider.exceptions.IdDoesNotExistException;
import com.lyncode.xoai.dataprovider.filter.ScopedFilter;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrDocument;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java
index d6cc49c286..979520c199 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceRepositoryConfiguration.java
@@ -19,8 +19,8 @@ import com.lyncode.xoai.dataprovider.core.DeleteMethod;
import com.lyncode.xoai.dataprovider.core.Granularity;
import com.lyncode.xoai.dataprovider.services.api.RepositoryConfiguration;
import org.apache.commons.io.FileUtils;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.xoai.exceptions.InvalidMetadataFieldException;
import org.dspace.xoai.services.api.EarliestDateResolver;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java
index f79cd873ee..c51b11eabf 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceResumptionTokenFormatter.java
@@ -12,8 +12,8 @@ import java.util.Date;
import com.lyncode.xoai.dataprovider.core.ResumptionToken;
import com.lyncode.xoai.dataprovider.exceptions.BadResumptionToken;
import com.lyncode.xoai.dataprovider.services.api.ResumptionTokenFormatter;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.xoai.util.DateUtils;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java
index 859f2390a8..c322c988a5 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/services/impl/xoai/DSpaceSetRepository.java
@@ -14,8 +14,8 @@ import java.util.List;
import com.lyncode.xoai.dataprovider.core.ListSetsResult;
import com.lyncode.xoai.dataprovider.core.Set;
import com.lyncode.xoai.dataprovider.services.api.SetRepository;
-import org.apache.log4j.LogManager;
-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.Community;
import org.dspace.content.DSpaceObject;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java b/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java
index 975bb8ada6..365a718a92 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/solr/DSpaceSolrServer.java
@@ -8,8 +8,8 @@
package org.dspace.xoai.solr;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java
index 611d0692f7..9ecef225a0 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/util/DateUtils.java
@@ -13,8 +13,8 @@ import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
/**
* @author Lyncode Development Team (dspace at lyncode dot com)
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java
index 1faee45890..10bbc61e70 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/util/ItemUtils.java
@@ -16,8 +16,8 @@ import java.util.List;
import com.lyncode.xoai.dataprovider.xml.xoai.Element;
import com.lyncode.xoai.dataprovider.xml.xoai.Metadata;
import com.lyncode.xoai.util.Base64Utils;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.util.factory.UtilServiceFactory;
import org.dspace.app.util.service.MetadataExposureService;
import org.dspace.authorize.AuthorizeException;
diff --git a/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java b/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java
index c0ddf3e701..f7661d5908 100644
--- a/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java
+++ b/dspace-oai/src/main/java/org/dspace/xoai/util/URLUtils.java
@@ -9,8 +9,8 @@ package org.dspace.xoai.util;
import java.io.UnsupportedEncodingException;
-import org.apache.log4j.LogManager;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.util.Util;
import org.dspace.core.Constants;
diff --git a/dspace-oai/src/main/webapp/WEB-INF/web.xml b/dspace-oai/src/main/webapp/WEB-INF/web.xml
index 33d3c2c31b..d731a0c659 100644
--- a/dspace-oai/src/main/webapp/WEB-INF/web.xml
+++ b/dspace-oai/src/main/webapp/WEB-INF/web.xml
@@ -8,9 +8,9 @@
http://www.dspace.org/license/
-->
-
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
XOAI Data Provider
@@ -20,6 +20,11 @@
${dspace.dir}
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j2.xml
+ The location of the Log4J configuration
+
diff --git a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java
index efe6125589..8432633e7b 100644
--- a/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java
+++ b/dspace-oai/src/test/java/org/dspace/xoai/tests/helpers/stubs/StubbedSetRepository.java
@@ -8,7 +8,7 @@
package org.dspace.xoai.tests.helpers.stubs;
import static java.lang.Math.min;
-import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import java.util.ArrayList;
import java.util.List;
diff --git a/dspace-rdf/pom.xml b/dspace-rdf/pom.xml
index 5a7eeca9ab..9c6c154ddc 100644
--- a/dspace-rdf/pom.xml
+++ b/dspace-rdf/pom.xml
@@ -33,6 +33,18 @@
jackson-databindcom.fasterxml.jackson.core
+
+ org.slf4j
+ slf4j-api
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+ log4j
+ log4j
+ pom
@@ -64,16 +76,26 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
+
- log4j
- log4j
+ org.apache.logging.log4j
+ log4j-api
- commons-lang
- commons-lang
+ org.apache.logging.log4j
+ log4j-core
+
+
+ org.apache.logging.log4j
+ log4j-web
+
+
+
+ org.apache.commons
+ commons-lang3
diff --git a/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java b/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java
index 1e07364187..526f138a71 100644
--- a/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java
+++ b/dspace-rdf/src/main/java/org/dspace/rdf/providing/DataProviderServlet.java
@@ -17,8 +17,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hp.hpl.jena.rdf.model.Model;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.dspace.handle.factory.HandleServiceFactory;
@@ -33,7 +33,7 @@ public class DataProviderServlet extends HttpServlet {
protected static final String DEFAULT_LANG = "TURTLE";
- private static final Logger log = Logger.getLogger(DataProviderServlet.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DataProviderServlet.class);
protected final transient HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
diff --git a/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java b/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java
index 33b4107128..b6a6854938 100644
--- a/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java
+++ b/dspace-rdf/src/main/java/org/dspace/rdf/providing/LocalURIRedirectionServlet.java
@@ -14,8 +14,8 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.dspace.handle.factory.HandleServiceFactory;
@@ -28,7 +28,7 @@ import org.dspace.rdf.negotiation.Negotiator;
public class LocalURIRedirectionServlet extends HttpServlet {
public static final String ACCEPT_HEADER_NAME = "Accept";
- private final static Logger log = Logger.getLogger(LocalURIRedirectionServlet.class);
+ private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(LocalURIRedirectionServlet.class);
protected final transient HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
diff --git a/dspace-rdf/src/main/webapp/WEB-INF/web.xml b/dspace-rdf/src/main/webapp/WEB-INF/web.xml
index 222e17de2c..c15ec675f3 100644
--- a/dspace-rdf/src/main/webapp/WEB-INF/web.xml
+++ b/dspace-rdf/src/main/webapp/WEB-INF/web.xml
@@ -8,10 +8,9 @@
http://www.dspace.org/license/
-->
-
+RDF Data Provider
@@ -23,6 +22,14 @@
${dspace.dir}
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j2.xml
+
+ The location of the Log4J configuration
+
+
+
dspace.requestorg.dspace.utils.servlet.DSpaceWebappServletFilter
diff --git a/dspace-rest/pom.xml b/dspace-rest/pom.xml
index ba7a990095..6d012d246a 100644
--- a/dspace-rest/pom.xml
+++ b/dspace-rest/pom.xml
@@ -220,7 +220,6 @@
javax.servletjavax.servlet-api
- 3.1.0provided
@@ -229,9 +228,17 @@
1.2.1
- log4j
- log4j
+ org.apache.logging.log4j
+ log4j-api
+
+ org.apache.logging.log4j
+ log4j-core
+
+
+ org.apache.logging.log4j
+ log4j-web
+ org.dspacedspace-services
diff --git a/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java b/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java
index eb96a53185..3a6ad85960 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/BitstreamResource.java
@@ -32,7 +32,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
@@ -69,7 +69,7 @@ public class BitstreamResource extends Resource {
.getResourcePolicyService();
protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService();
- private static Logger log = Logger.getLogger(BitstreamResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamResource.class);
/**
* Return bitstream properties without file data. It can throw
diff --git a/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java b/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java
index 7d5fd4c015..af06792b7b 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/CollectionsResource.java
@@ -29,7 +29,7 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
@@ -60,7 +60,7 @@ public class CollectionsResource extends Resource {
protected WorkspaceItemService workspaceItemService = ContentServiceFactory.getInstance().getWorkspaceItemService();
protected WorkflowService workflowService = WorkflowServiceFactory.getInstance().getWorkflowService();
- private static Logger log = Logger.getLogger(CollectionsResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionsResource.class);
/**
* Return instance of collection with passed id. You can add more properties
diff --git a/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java b/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java
index 331ae4cfd5..5ac25d69e9 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/CommunitiesResource.java
@@ -28,7 +28,7 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
@@ -51,7 +51,7 @@ public class CommunitiesResource extends Resource {
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
- private static Logger log = Logger.getLogger(CommunitiesResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunitiesResource.class);
/**
* Returns community with basic properties. If you want more, use expand
diff --git a/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java b/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java
index 7312e5c4b7..133ed50d9c 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/FilteredCollectionsResource.java
@@ -24,7 +24,7 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.factory.ContentServiceFactory;
@@ -45,7 +45,7 @@ public class FilteredCollectionsResource extends Resource {
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService();
- private static Logger log = Logger.getLogger(FilteredCollectionsResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(FilteredCollectionsResource.class);
/**
* Return array of all collections in DSpace. You can add more properties
diff --git a/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java b/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java
index 5129bce840..0f4331adc5 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/FilteredItemsResource.java
@@ -25,7 +25,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Item;
import org.dspace.content.MetadataField;
@@ -58,7 +58,7 @@ public class FilteredItemsResource extends Resource {
protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService();
protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService();
- private static Logger log = Logger.getLogger(FilteredItemsResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(FilteredItemsResource.class);
/**
* Return instance of collection with passed id. You can add more properties
diff --git a/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java b/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java
index 904d62c6c8..bff755f2de 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/FiltersResource.java
@@ -17,7 +17,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.rest.common.ItemFilter;
/**
@@ -27,7 +27,7 @@ import org.dspace.rest.common.ItemFilter;
*/
@Path("/filters")
public class FiltersResource {
- private static Logger log = Logger.getLogger(FiltersResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(FiltersResource.class);
/**
* Return all Use Case Item Filters in DSpace.
diff --git a/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java b/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java
index 71a3b8a084..51436a1c00 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/HandleResource.java
@@ -18,7 +18,7 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.factory.ContentServiceFactory;
@@ -44,7 +44,7 @@ public class HandleResource extends Resource {
protected HandleService handleService = HandleServiceFactory.getInstance().getHandleService();
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
- private static Logger log = Logger.getLogger(HandleResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleResource.class);
@GET
@Path("/{prefix}/{suffix}")
diff --git a/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java b/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java
index 716f361f76..b2ffc559b0 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/HierarchyResource.java
@@ -21,7 +21,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.Collection;
@@ -45,7 +45,7 @@ import org.dspace.services.factory.DSpaceServicesFactory;
@Path("/hierarchy")
@Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class HierarchyResource extends Resource {
- private static Logger log = Logger.getLogger(HierarchyResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HierarchyResource.class);
protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService();
protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
diff --git a/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java b/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java
index 84dd35e9a9..615aacac21 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/ItemsResource.java
@@ -32,7 +32,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
@@ -72,7 +72,7 @@ public class ItemsResource extends Resource {
.getResourcePolicyService();
protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService();
- private static final Logger log = Logger.getLogger(ItemsResource.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemsResource.class);
/**
* Return item properties without metadata and bitstreams. You can add
diff --git a/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java b/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java
index 333f611f6c..79e655e63d 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/MetadataRegistryResource.java
@@ -28,7 +28,7 @@ import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
@@ -70,7 +70,7 @@ public class MetadataRegistryResource extends Resource {
protected MetadataSchemaService metadataSchemaService = ContentServiceFactory.getInstance()
.getMetadataSchemaService();
protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService();
- private static Logger log = Logger.getLogger(MetadataRegistryResource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataRegistryResource.class);
/**
* Return all metadata registry items in DSpace.
diff --git a/dspace-rest/src/main/java/org/dspace/rest/Resource.java b/dspace-rest/src/main/java/org/dspace/rest/Resource.java
index 65fdbd2048..7a7624fef0 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/Resource.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/Resource.java
@@ -16,7 +16,7 @@ import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Context;
import org.dspace.eperson.factory.EPersonServiceFactory;
@@ -40,7 +40,7 @@ public class Resource {
@javax.ws.rs.core.Context
public ServletContext servletContext;
- private static Logger log = Logger.getLogger(Resource.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Resource.class);
private static final boolean writeStatistics;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java b/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java
index dfb5e2bb39..c09e924536 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/RestIndex.java
@@ -23,7 +23,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.AuthenticationMethod;
import org.dspace.authenticate.ShibAuthentication;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
@@ -44,7 +44,7 @@ import org.dspace.utils.DSpace;
@Path("/")
public class RestIndex {
protected EPersonService epersonService = EPersonServiceFactory.getInstance().getEPersonService();
- private static Logger log = Logger.getLogger(RestIndex.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RestIndex.class);
/**
* Return html page with information about REST api. It contains methods all
diff --git a/dspace-rest/src/main/java/org/dspace/rest/RestReports.java b/dspace-rest/src/main/java/org/dspace/rest/RestReports.java
index dda44b5868..4af556b6f8 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/RestReports.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/RestReports.java
@@ -20,7 +20,7 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.rest.common.Report;
import org.dspace.services.ConfigurationService;
import org.dspace.services.factory.DSpaceServicesFactory;
@@ -34,7 +34,7 @@ import org.dspace.services.factory.DSpaceServicesFactory;
*/
@Path("/reports")
public class RestReports {
- private static Logger log = Logger.getLogger(RestReports.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RestReports.class);
protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService();
public static final String REST_RPT_URL = "rest.report-url.";
diff --git a/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java b/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java
index 65bedce85b..5d0bedb442 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/authentication/DSpaceAuthenticationProvider.java
@@ -13,7 +13,7 @@ import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authenticate.AuthenticationMethod;
import org.dspace.authenticate.factory.AuthenticateServiceFactory;
import org.dspace.authenticate.service.AuthenticationService;
@@ -40,7 +40,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
*/
public class DSpaceAuthenticationProvider implements AuthenticationProvider {
- private static Logger log = Logger.getLogger(DSpaceAuthenticationProvider.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAuthenticationProvider.class);
protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance()
.getAuthenticationService();
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java b/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java
index ecfc31ef26..7eb198990e 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/Bitstream.java
@@ -14,7 +14,7 @@ import java.util.List;
import javax.servlet.ServletContext;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Bundle;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.BitstreamService;
@@ -35,7 +35,7 @@ public class Bitstream extends DSpaceObject {
protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService();
protected BundleService bundleService = ContentServiceFactory.getInstance().getBundleService();
- Logger log = Logger.getLogger(Bitstream.class);
+ Logger log = org.apache.logging.log4j.LogManager.getLogger(Bitstream.class);
private String bundleName;
private String description;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java b/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java
index 9bb66dba20..5c2c9b817b 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/Collection.java
@@ -16,7 +16,7 @@ import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.CommunityService;
@@ -36,7 +36,7 @@ public class Collection extends DSpaceObject {
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected ItemService itemService = ContentServiceFactory.getInstance().getItemService();
- Logger log = Logger.getLogger(Collection.class);
+ Logger log = org.apache.logging.log4j.LogManager.getLogger(Collection.class);
//Relationships
private Bitstream logo;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Community.java b/dspace-rest/src/main/java/org/dspace/rest/common/Community.java
index 45d62ffe96..4f69eba0aa 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/Community.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/Community.java
@@ -16,7 +16,7 @@ import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.factory.ContentServiceFactory;
@@ -37,7 +37,7 @@ public class Community extends DSpaceObject {
protected ItemService itemService = ContentServiceFactory.getInstance().getItemService();
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
- private static Logger log = Logger.getLogger(Community.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Community.class);
//Exandable relationships
private Bitstream logo;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java b/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java
index 525b823301..c7ff0ef9b3 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/FilteredCollection.java
@@ -16,7 +16,7 @@ import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.CommunityService;
@@ -34,7 +34,7 @@ public class FilteredCollection extends DSpaceObject {
protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected ItemService itemService = ContentServiceFactory.getInstance().getItemService();
- Logger log = Logger.getLogger(FilteredCollection.class);
+ Logger log = org.apache.logging.log4j.LogManager.getLogger(FilteredCollection.class);
//Relationships
private Community parentCommunity;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/Item.java b/dspace-rest/src/main/java/org/dspace/rest/common/Item.java
index e336247736..3794153b7d 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/Item.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/Item.java
@@ -16,7 +16,7 @@ import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.util.factory.UtilServiceFactory;
import org.dspace.app.util.service.MetadataExposureService;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
@@ -43,7 +43,7 @@ public class Item extends DSpaceObject {
.getMetadataExposureService();
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
- Logger log = Logger.getLogger(Item.class);
+ Logger log = org.apache.logging.log4j.LogManager.getLogger(Item.class);
String isArchived;
String isWithdrawn;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java
index 6a1466eb35..bc5bd13134 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilter.java
@@ -17,7 +17,7 @@ import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.core.Context;
import org.dspace.core.factory.CoreServiceFactory;
import org.dspace.rest.filter.ItemFilterDefs;
@@ -32,7 +32,7 @@ import org.dspace.rest.filter.ItemFilterTest;
*/
@XmlRootElement(name = "item-filter")
public class ItemFilter {
- static Logger log = Logger.getLogger(ItemFilter.class);
+ static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilter.class);
private ItemFilterTest itemFilterTest = null;
private String filterName = "";
diff --git a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java
index 448d3a8cfc..6f56e2b44c 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/common/ItemFilterQuery.java
@@ -11,7 +11,7 @@ import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
/**
* Metadata Query for DSpace Items using the REST API
@@ -20,7 +20,7 @@ import org.apache.log4j.Logger;
*/
@XmlRootElement(name = "item-filter-query")
public class ItemFilterQuery {
- Logger log = Logger.getLogger(ItemFilterQuery.class);
+ Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterQuery.class);
private String field = "";
private String operation = "";
diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java
index 278c0c8a1e..96a866357d 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsMeta.java
@@ -9,7 +9,7 @@ package org.dspace.rest.filter;
import java.util.regex.Pattern;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Item;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
@@ -24,7 +24,7 @@ import org.dspace.services.factory.DSpaceServicesFactory;
public class ItemFilterDefsMeta implements ItemFilterList {
protected static ItemService itemService = ContentServiceFactory.getInstance().getItemService();
- static Logger log = Logger.getLogger(ItemFilterDefsMeta.class);
+ static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterDefsMeta.class);
public static final String CAT_META_GEN = "General Metadata Filters";
public static final String CAT_META_SPEC = "Specific Metadata Filters";
diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java
index daa5d022b2..9e80f31196 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterDefsPerm.java
@@ -9,7 +9,7 @@ package org.dspace.rest.filter;
import java.sql.SQLException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.Bitstream;
@@ -26,7 +26,7 @@ import org.dspace.rest.filter.ItemFilterUtil.BundleName;
public class ItemFilterDefsPerm implements ItemFilterList {
protected static AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
public static final String CAT_PERM = "Perimission Filters";
- private static Logger log = Logger.getLogger(ItemFilterDefsPerm.class);
+ private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterDefsPerm.class);
public ItemFilterDefsPerm() {
}
diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java
index 837ed4ee4b..f70bc9664d 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterSet.java
@@ -14,7 +14,7 @@ import java.util.List;
import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.core.Context;
@@ -28,7 +28,7 @@ import org.dspace.rest.common.ItemFilter;
*/
public class ItemFilterSet {
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
- static Logger log = Logger.getLogger(ItemFilterSet.class);
+ static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterSet.class);
private List itemFilters;
private ItemFilter allFiltersFilter;
diff --git a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java
index d6d68ba6a7..ddb75f0db8 100644
--- a/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java
+++ b/dspace-rest/src/main/java/org/dspace/rest/filter/ItemFilterUtil.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.regex.Pattern;
import com.ibm.icu.util.Calendar;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.content.Bitstream;
import org.dspace.content.Bundle;
import org.dspace.content.Item;
@@ -25,7 +25,7 @@ import org.dspace.services.factory.DSpaceServicesFactory;
public class ItemFilterUtil {
protected static ItemService itemService = ContentServiceFactory.getInstance().getItemService();
- static Logger log = Logger.getLogger(ItemFilterUtil.class);
+ static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemFilterUtil.class);
public enum BundleName { ORIGINAL, TEXT, LICENSE, THUMBNAIL }
diff --git a/dspace-rest/src/main/webapp/WEB-INF/web.xml b/dspace-rest/src/main/webapp/WEB-INF/web.xml
index 90d68ac6a2..1b33aac885 100644
--- a/dspace-rest/src/main/webapp/WEB-INF/web.xml
+++ b/dspace-rest/src/main/webapp/WEB-INF/web.xml
@@ -8,10 +8,9 @@
http://www.dspace.org/license/
-->
-
+dspace.request
@@ -77,6 +76,14 @@
${dspace.dir}
+
+
+ The location of the Log4J configuration
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j2.xml
+
+
contextConfigLocation
@@ -109,4 +116,4 @@
-
\ No newline at end of file
+
diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml
index 3d82e158fd..e402bed92b 100644
--- a/dspace-services/pom.xml
+++ b/dspace-services/pom.xml
@@ -95,8 +95,8 @@
compile
- commons-lang
- commons-lang
+ org.apache.commons
+ commons-lang3
@@ -108,7 +108,7 @@
javax.servlet
- servlet-api
+ javax.servlet-apiprovided
@@ -140,13 +140,20 @@
test
- org.slf4j
- slf4j-log4j12
+ org.apache.logging.log4j
+ log4j-api
+ ${log4j.version}
- log4j
- log4j
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j.version}
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ ${log4j.version}
+ commons-logging
@@ -159,8 +166,8 @@
commons-collections4
- commons-configuration
- commons-configuration
+ org.apache.commons
+ commons-configuration2
diff --git a/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java b/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java
index 00a938a27d..1f86c16b29 100644
--- a/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java
+++ b/dspace-services/src/main/java/org/dspace/kernel/DSpaceKernelManager.java
@@ -21,7 +21,7 @@ import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java b/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java
index 143f918bcb..a4520de0df 100644
--- a/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/DSpaceServiceManager.java
@@ -16,7 +16,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
import org.dspace.kernel.Activator;
import org.dspace.kernel.mixins.ConfigChangeListener;
import org.dspace.kernel.mixins.InitializedService;
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java
deleted file mode 100644
index bbb57932fd..0000000000
--- a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBean.java
+++ /dev/null
@@ -1,197 +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/
- */
-
-/**
- * This based heavily on the CommonsConfigurationFactoryBean available in
- * 'spring-modules-jakarta-commons' version 0.8:
- * https://java.net/projects/springmodules/sources/svn/content/tags/release-0_8/projects/commons/src/java/org
- * /springmodules/commons/configuration/CommonsConfigurationFactoryBean.java?rev=2110
- *
- * As this module is no longer maintained by Spring, it is now recommended to
- * maintain it within your own codebase, so that minor updates can be made to
- * support new versions of Apache Commons Configuration (as needed). See this
- * Spring ticket: https://jira.spring.io/browse/SPR-10213
- *
- * For DSpace, we've specifically updated this bean to automatically load all
- * configurations from the DSpaceConfigurationService (which uses Commons
- * Configuration internally). See constructor below.
- *
- * This bean is loaded in 'spring-dspace-core-services.xml' where it is wired
- * up to PropertyPlaceholderConfigurer.
- */
-package org.dspace.servicemanager.config;
-
-import java.net.URL;
-
-import org.apache.commons.configuration.CompositeConfiguration;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.PropertiesConfiguration;
-import org.dspace.services.ConfigurationService;
-import org.springframework.beans.factory.FactoryBean;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.core.io.Resource;
-import org.springframework.util.Assert;
-
-/**
- * FactoryBean which wraps a Commons CompositeConfiguration object for usage
- * with PropertiesLoaderSupport. This allows the configuration object to behave
- * like a normal java.util.Properties object which can be passed on to
- * setProperties() method allowing PropertyOverrideConfigurer and
- * PropertyPlaceholderConfigurer to take advantage of Commons Configuration.
- * Internally a CompositeConfiguration object is used for merging multiple
- * Configuration objects.
- *
- * @see java.util.Properties
- * @see org.springframework.core.io.support.PropertiesLoaderSupport
- *
- * @author Costin Leau
- *
- */
-public class DSpaceConfigurationFactoryBean implements InitializingBean, FactoryBean {
-
- private CompositeConfiguration configuration;
-
- private Configuration[] configurations;
-
- private Resource[] locations;
-
- private boolean throwExceptionOnMissing = true;
-
- /**
- * Initialize all properties via the passed in DSpace ConfigurationService
- * @param configurationService current DSpace configuration service
- */
- public DSpaceConfigurationFactoryBean(ConfigurationService configurationService) {
- Assert.notNull(configurationService.getConfiguration());
- this.configuration = new CompositeConfiguration(configurationService.getConfiguration());
- }
-
- /**
- * Initialize all properties via the passed in Commons Configuration
- * @param configuration Commons configuration
- */
- public DSpaceConfigurationFactoryBean(Configuration configuration) {
- Assert.notNull(configuration);
- this.configuration = new CompositeConfiguration(configuration);
- }
-
- /**
- * @see org.springframework.beans.factory.FactoryBean#getObject()
- */
- @Override
- public Object getObject() throws Exception {
- return (configuration != null) ? ConfigurationConverter.getProperties(configuration) : null;
- }
-
- /**
- * @see org.springframework.beans.factory.FactoryBean#getObjectType()
- */
- @Override
- public Class getObjectType() {
- return java.util.Properties.class;
- }
-
- /**
- * @see org.springframework.beans.factory.FactoryBean#isSingleton()
- */
- @Override
- public boolean isSingleton() {
- return true;
- }
-
- /**
- * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
- */
- public void afterPropertiesSet() throws Exception {
- if (configuration == null && (configurations == null || configurations.length == 0)
- && (locations == null || locations.length == 0)) {
- throw new IllegalArgumentException("no configuration object or location specified");
- }
-
- if (configuration == null) {
- configuration = new CompositeConfiguration();
- }
-
- configuration.setThrowExceptionOnMissing(throwExceptionOnMissing);
-
- if (configurations != null) {
- for (int i = 0; i < configurations.length; i++) {
- configuration.addConfiguration(configurations[i]);
- }
- }
-
- if (locations != null) {
- for (int i = 0; i < locations.length; i++) {
- URL url = locations[i].getURL();
- Configuration props = new PropertiesConfiguration(url);
- configuration.addConfiguration(props);
- }
- }
- }
-
- /**
- * @return Returns the configurations.
- */
- public Configuration[] getConfigurations() {
- return configurations;
- }
-
- /**
- * Set the commons configurations objects which will be used as properties.
- *
- * @param configurations array of Commons Configuration objects
- */
- public void setConfigurations(Configuration[] configurations) {
- this.configurations = configurations;
- }
-
- public Resource[] getLocations() {
- return locations;
- }
-
- /**
- * Shortcut for loading configuration from Spring resources. It will
- * internally create a PropertiesConfiguration object based on the URL
- * retrieved from the given Resources.
- *
- * @param locations array of resource locations
- */
- public void setLocations(Resource[] locations) {
- this.locations = locations;
- }
-
- /**
- * Return whether to throw an exception if a configuration is missing.
- * @return true if exception should be throw, false otherwise.
- */
- public boolean isThrowExceptionOnMissing() {
- return throwExceptionOnMissing;
- }
-
- /**
- * Set the underlying Commons CompositeConfiguration throwExceptionOnMissing
- * flag.
- * @see org.apache.commons.configuration.AbstractConfiguration
- * @param throwExceptionOnMissing whether to throw an exception if a config is missing
- */
- public void setThrowExceptionOnMissing(boolean throwExceptionOnMissing) {
- this.throwExceptionOnMissing = throwExceptionOnMissing;
- }
-
- /**
- * Getter for the underlying CompositeConfiguration object.
- *
- * @return CompositeConfiguration object
- */
- public CompositeConfiguration getConfiguration() {
- return configuration;
- }
-
-}
-
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java
new file mode 100644
index 0000000000..b85450dcd0
--- /dev/null
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationPlaceholderConfigurer.java
@@ -0,0 +1,36 @@
+/**
+ * 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.servicemanager.config;
+
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.spring.ConfigurationPropertySource;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.core.env.MutablePropertySources;
+
+/**
+ * Extends Spring PropertySourcesPlaceholderConfigurer to allow our Configuration to be included as a Spring
+ * PropertySource. This allows ${...} placeholders within bean definition property values and @Value annotations
+ * to be resolved using DSpaceConfigurationService
+ *
+ * NOTE: This is initialized in spring-dspace-core-services.xml
+ *
+ * @see PropertySourcesPlaceholderConfigurer
+ * @see DSpaceConfigurationService
+ */
+public class DSpaceConfigurationPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer {
+
+ public DSpaceConfigurationPlaceholderConfigurer(Configuration configuration) {
+ ConfigurationPropertySource apacheCommonsConfigPropertySource =
+ new ConfigurationPropertySource(configuration.getClass().getName(), configuration);
+ MutablePropertySources propertySources = new MutablePropertySources();
+ propertySources.addLast(apacheCommonsConfigPropertySource);
+ setPropertySources(propertySources);
+ }
+}
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java
index 83238a9667..3d511a1e67 100644
--- a/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/config/DSpaceConfigurationService.java
@@ -22,10 +22,14 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.DefaultConfigurationBuilder;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ConfigurationConverter;
+import org.apache.commons.configuration2.builder.ConfigurationBuilderEvent;
+import org.apache.commons.configuration2.builder.combined.ReloadingCombinedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Parameters;
+import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
+import org.apache.commons.configuration2.event.Event;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.dspace.services.ConfigurationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -60,15 +64,19 @@ public final class DSpaceConfigurationService implements ConfigurationService {
// The DSpace Server ID configuration
public static final String DSPACE_SERVER_ID = "serverId";
- // Current ConfigurationBuilder
- private DefaultConfigurationBuilder configurationBuilder = null;
+ // Configuration list delimiter. Configurations with this character will be split into arrays
+ public static final char CONFIG_LIST_DELIMITER = ',';
- // Current Configuration
- private Configuration configuration = null;
+ // Current ConfigurationBuilder
+ // NOTE: we only cache the "builder", as it controls when a configuration is automatically reloaded
+ private ReloadingCombinedConfigurationBuilder configurationBuilder = null;
// Current Home directory
private String homePath = null;
+ // Current Configuration Definition File
+ private String configDefinition = null;
+
/**
* Initializes a ConfigurationService based on default values. The DSpace
* Home directory is determined based on system properties / searching.
@@ -98,7 +106,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
@Override
public Properties getProperties() {
// Return our configuration as a set of Properties
- return ConfigurationConverter.getProperties(configuration);
+ return ConfigurationConverter.getProperties(getConfiguration());
}
/**
@@ -109,7 +117,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
@Override
public List getPropertyKeys() {
- Iterator keys = configuration.getKeys();
+ Iterator keys = getConfiguration().getKeys();
List keyList = new ArrayList<>();
while (keys.hasNext()) {
@@ -126,7 +134,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
@Override
public List getPropertyKeys(String prefix) {
- Iterator keys = configuration.getKeys(prefix);
+ Iterator keys = getConfiguration().getKeys(prefix);
List keyList = new ArrayList<>();
while (keys.hasNext()) {
@@ -142,7 +150,13 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public Configuration getConfiguration() {
- return configuration;
+ try {
+ return this.configurationBuilder.getConfiguration();
+ } catch (ConfigurationException ce) {
+ log.error("Unable to get configuration object based on definition at " + this.configDefinition);
+ System.err.println("Unable to get configuration object based on definition at " + this.configDefinition);
+ throw new RuntimeException(ce);
+ }
}
/**
@@ -153,7 +167,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public Object getPropertyValue(String name) {
- return configuration.getProperty(name);
+ return getConfiguration().getProperty(name);
}
/**
@@ -175,7 +189,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public String getProperty(String name, String defaultValue) {
- return (String) getPropertyAsType(name, defaultValue);
+ return getPropertyAsType(name, defaultValue);
}
/**
@@ -325,7 +339,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
@Override
public boolean hasProperty(String name) {
- if (configuration.containsKey(name)) {
+ if (getConfiguration().containsKey(name)) {
return true;
} else {
return false;
@@ -346,15 +360,15 @@ public final class DSpaceConfigurationService implements ConfigurationService {
if (name == null) {
throw new IllegalArgumentException("name cannot be null for setting configuration");
} else {
- Object oldValue = configuration.getProperty(name);
+ Object oldValue = getConfiguration().getProperty(name);
if (value == null && oldValue != null) {
changed = true;
- configuration.clearProperty(name);
+ getConfiguration().clearProperty(name);
log.info("Cleared the configuration setting for name (" + name + ")");
} else if (value != null && !value.equals(oldValue)) {
changed = true;
- configuration.setProperty(name, value);
+ getConfiguration().setProperty(name, value);
}
}
return changed;
@@ -409,14 +423,14 @@ public final class DSpaceConfigurationService implements ConfigurationService {
}
// Check if the value has changed
- if (this.configuration.containsKey(key) &&
- this.configuration.getProperty(key).equals(value)) {
+ if (getConfiguration().containsKey(key) &&
+ getConfiguration().getProperty(key).equals(value)) {
// no change to the value
return false;
} else {
// Either this config doesn't exist, or it is not the same value,
// so we'll update it.
- this.configuration.setProperty(key, value);
+ getConfiguration().setProperty(key, value);
return true;
}
}
@@ -425,7 +439,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
* Clears all the configuration settings.
*/
public void clear() {
- this.configuration.clear();
+ getConfiguration().clear();
log.info("Cleared all configuration settings");
}
@@ -435,7 +449,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
* @param key key of the configuration
*/
public void clearConfig(String key) {
- this.configuration.clearProperty(key);
+ getConfiguration().clearProperty(key);
}
// loading from files code
@@ -451,35 +465,50 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
private void loadInitialConfig(String providedHome) {
// Determine the DSpace home directory
- homePath = getDSpaceHome(providedHome);
+ this.homePath = getDSpaceHome(providedHome);
// Based on homePath get full path to the configuration definition
- String configDefinition = homePath + File.separatorChar + DSPACE_CONFIG_DEFINITION_PATH;
+ this.configDefinition = this.homePath + File.separatorChar + DSPACE_CONFIG_DEFINITION_PATH;
// Check if our configuration definition exists in the homePath
- File configDefFile = new File(configDefinition);
+ File configDefFile = new File(this.configDefinition);
if (!configDefFile.exists()) {
try {
//If it doesn't exist, check for a configuration definition on Classpath
// (NOTE: This is mostly for Unit Testing to find the test config-definition.xml)
ClassPathResource resource = new ClassPathResource(DSPACE_CONFIG_DEFINITION_PATH);
- configDefinition = resource.getFile().getAbsolutePath();
+ this.configDefinition = resource.getFile().getAbsolutePath();
} catch (IOException ioe) {
log.error("Error attempting to load configuration definition from classpath", ioe);
}
}
try {
+ Parameters params = new Parameters();
+ // Treat comma as a config list delimiter (when not escaped by \,)
+ DefaultListDelimiterHandler listDelimiterHandler = new DefaultListDelimiterHandler(CONFIG_LIST_DELIMITER);
// Load our configuration definition, which in turn loads all our config files/settings
- // See: http://commons.apache.org/proper/commons-configuration/userguide_v1.10/howto_configurationbuilder
- // .html
- configurationBuilder = new DefaultConfigurationBuilder(configDefinition);
+ // See: http://commons.apache.org/proper/commons-configuration/userguide/howto_combinedbuilder.html
+ this.configurationBuilder = new ReloadingCombinedConfigurationBuilder()
+ .configure(params.fileBased()
+ .setFile(new File(this.configDefinition))
+ .setListDelimiterHandler(listDelimiterHandler));
- // Actually parser our configuration definition & return the resulting Configuration
- configuration = configurationBuilder.getConfiguration();
+ // Parse our configuration definition and initialize resulting Configuration
+ this.configurationBuilder.getConfiguration();
+
+ // Register an event listener for triggering automatic reloading checks
+ // See: https://commons.apache.org/proper/commons-configuration/userguide/howto_reloading.html#Reloading_Checks_on_Builder_Access
+ // NOTE: This MUST be added *after* the first call to getConfiguration(), as getReloadingController() is
+ // not initialized until the configuration is first parsed/read.
+ this.configurationBuilder.addEventListener(ConfigurationBuilderEvent.CONFIGURATION_REQUEST,
+ // Lamba which checks reloadable configurations for any updates.
+ // Auto-reloadable configs are ONLY those flagged config-reload="true" in the configuration definition
+ (Event e) -> this.configurationBuilder.getReloadingController()
+ .checkForReloading(null));
} catch (ConfigurationException ce) {
- log.error("Unable to load configurations based on definition at " + configDefinition);
- System.err.println("Unable to load configurations based on definition at " + configDefinition);
+ log.error("Unable to load configurations based on definition at " + this.configDefinition);
+ System.err.println("Unable to load configurations based on definition at " + this.configDefinition);
throw new RuntimeException(ce);
}
@@ -490,22 +519,25 @@ public final class DSpaceConfigurationService implements ConfigurationService {
}
/**
- * Reload the configuration from the DSpace configuration files.
+ * Reload all configurations from the DSpace configuration definition.
*
- * Uses the initialized ConfigurationBuilder to reload all configurations.
+ * This method invalidates the current Configuration object, and uses
+ * the initialized ConfigurationBuilder to reload all configurations.
*/
@Override
public synchronized void reloadConfig() {
try {
- configurationBuilder.reload();
- this.configuration = configurationBuilder.getConfiguration();
+ // As this is a forced reload, completely invalidate the configuration
+ // This ensures all configs, including System properties and Environment variables are reloaded
+ this.configurationBuilder.getConfiguration().invalidate();
+
+ // Reload/reinitialize our configuration
+ this.configurationBuilder.getConfiguration();
// Finally, (re)set any dynamic, default properties
setDynamicProperties();
} catch (ConfigurationException ce) {
- log.error("Unable to reload configurations based on definition at " +
- configurationBuilder.getFile().getAbsolutePath(),
- ce);
+ log.error("Unable to reload configurations based on definition at " + this.configDefinition, ce);
}
log.info("Reloaded configuration service: " + toString());
}
@@ -516,7 +548,7 @@ public final class DSpaceConfigurationService implements ConfigurationService {
*/
private void setDynamicProperties() {
// Ensure our DSPACE_HOME property is set to the determined homePath
- setProperty(DSPACE_HOME, homePath);
+ setProperty(DSPACE_HOME, this.homePath);
try {
// Attempt to set a default "serverId" property to value of hostname
@@ -534,8 +566,8 @@ public final class DSpaceConfigurationService implements ConfigurationService {
int size = props != null ? props.size() : 0;
// Return the configuration directory and number of configs loaded
- return "ConfigDir=" + configuration
- .getString(DSPACE_HOME) + File.separatorChar + DEFAULT_CONFIG_DIR + ", Size=" + size;
+ return "ConfigDir=" + getConfiguration().getString(DSPACE_HOME) + File.separatorChar
+ + DEFAULT_CONFIG_DIR + ", Size=" + size;
}
/**
@@ -652,10 +684,11 @@ public final class DSpaceConfigurationService implements ConfigurationService {
* @param object type
* @return converted value
*/
+ @SuppressWarnings("unchecked")
private T convert(String name, Class type) {
// If this key doesn't exist, just return null
- if (!configuration.containsKey(name)) {
+ if (!getConfiguration().containsKey(name)) {
// Special case. For booleans, return false if key doesn't exist
if (Boolean.class.equals(type) || boolean.class.equals(type)) {
return (T) Boolean.FALSE;
@@ -667,33 +700,33 @@ public final class DSpaceConfigurationService implements ConfigurationService {
// Based on the type of class, call the appropriate
// method of the Configuration object
if (type.isArray()) {
- return (T) configuration.getStringArray(name);
+ return (T) getConfiguration().getStringArray(name);
} else if (String.class.equals(type) || type.isAssignableFrom(String.class)) {
- return (T) configuration.getString(name);
+ return (T) getConfiguration().getString(name);
} else if (BigDecimal.class.equals(type)) {
- return (T) configuration.getBigDecimal(name);
+ return (T) getConfiguration().getBigDecimal(name);
} else if (BigInteger.class.equals(type)) {
- return (T) configuration.getBigInteger(name);
+ return (T) getConfiguration().getBigInteger(name);
} else if (Boolean.class.equals(type) || boolean.class.equals(type)) {
- return (T) Boolean.valueOf(configuration.getBoolean(name));
+ return (T) Boolean.valueOf(getConfiguration().getBoolean(name));
} else if (Byte.class.equals(type) || byte.class.equals(type)) {
- return (T) Byte.valueOf(configuration.getByte(name));
+ return (T) Byte.valueOf(getConfiguration().getByte(name));
} else if (Double.class.equals(type) || double.class.equals(type)) {
- return (T) Double.valueOf(configuration.getDouble(name));
+ return (T) Double.valueOf(getConfiguration().getDouble(name));
} else if (Float.class.equals(type) || float.class.equals(type)) {
- return (T) Float.valueOf(configuration.getFloat(name));
+ return (T) Float.valueOf(getConfiguration().getFloat(name));
} else if (Integer.class.equals(type) || int.class.equals(type)) {
- return (T) Integer.valueOf(configuration.getInt(name));
+ return (T) Integer.valueOf(getConfiguration().getInt(name));
} else if (List.class.equals(type)) {
- return (T) configuration.getList(name);
+ return (T) getConfiguration().getList(name);
} else if (Long.class.equals(type) || long.class.equals(type)) {
- return (T) Long.valueOf(configuration.getLong(name));
+ return (T) Long.valueOf(getConfiguration().getLong(name));
} else if (Short.class.equals(type) || short.class.equals(type)) {
- return (T) Short.valueOf(configuration.getShort(name));
+ return (T) Short.valueOf(getConfiguration().getShort(name));
} else {
// If none of the above works, try to convert the value to the required type
SimpleTypeConverter converter = new SimpleTypeConverter();
- return (T) converter.convertIfNecessary(configuration.getProperty(name), type);
+ return (T) converter.convertIfNecessary(getConfiguration().getProperty(name), type);
}
}
}
diff --git a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java
index 0deaba1ac5..ab2afb5ed6 100644
--- a/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java
+++ b/dspace-services/src/main/java/org/dspace/servicemanager/example/EventListenerExample.java
@@ -7,7 +7,8 @@
*/
package org.dspace.servicemanager.example;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
import org.dspace.services.model.Event;
import org.dspace.services.model.EventListener;
@@ -23,8 +24,7 @@ public final class EventListenerExample implements EventListener {
/**
* log4j category
*/
- private static Logger log = Logger
- .getLogger(EventListenerExample.class);
+ private static Logger log = LogManager.getLogger(EventListenerExample.class);
/**
* @return null
diff --git a/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java b/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java
index 4beb2a9f35..050e4c089c 100644
--- a/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java
+++ b/dspace-services/src/main/java/org/dspace/services/ConfigurationService.java
@@ -10,7 +10,7 @@ package org.dspace.services;
import java.util.List;
import java.util.Properties;
-import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration2.Configuration;
/**
diff --git a/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java b/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java
index 1d8eff903f..f20458f51a 100644
--- a/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java
+++ b/dspace-services/src/main/java/org/dspace/services/email/EmailServiceImpl.java
@@ -12,7 +12,9 @@ import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
+import javax.naming.NoInitialContextException;
import org.dspace.kernel.mixins.InitializedService;
import org.dspace.services.ConfigurationService;
@@ -33,7 +35,7 @@ import org.springframework.beans.factory.annotation.Required;
public class EmailServiceImpl
extends Authenticator
implements EmailService, InitializedService {
- private static final Logger logger = (Logger) LoggerFactory.getLogger(EmailServiceImpl.class);
+ private static final Logger logger = LoggerFactory.getLogger(EmailServiceImpl.class);
private Session session = null;
@@ -53,7 +55,7 @@ public class EmailServiceImpl
/**
* Provide a reference to the JavaMail session.
*
- * @return the managed Session, or null if none could be created.
+ * @return the managed Session, or {@code null} if none could be created.
*/
@Override
public Session getSession() {
@@ -67,12 +69,16 @@ public class EmailServiceImpl
if (null == sessionName) {
sessionName = "Session";
}
+ String sessionUri = "java:comp/env/mail/" + sessionName;
+ logger.debug("Looking up Session as {}", sessionUri);
try {
InitialContext ctx = new InitialContext(null);
- session = (Session) ctx.lookup("java:comp/env/mail/" + sessionName);
+ session = (Session) ctx.lookup(sessionUri);
+ } catch (NameNotFoundException | NoInitialContextException ex) {
+ // Not a problem -- build a new Session from configuration.
} catch (NamingException ex) {
- logger.warn("Couldn't get an email session from environment: {}",
- ex.getMessage());
+ logger.warn("Couldn't get an email session from environment: {}: {}",
+ ex.getClass().getName(), ex.getMessage());
}
if (null != session) {
@@ -106,8 +112,6 @@ public class EmailServiceImpl
props.put("mail.smtp.auth", "true");
session = Session.getInstance(props, this);
}
-
-
}
}
diff --git a/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java b/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java
index 3ef22825ce..de67e504a5 100644
--- a/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java
+++ b/dspace-services/src/main/java/org/dspace/services/events/SystemEventService.java
@@ -13,7 +13,7 @@ import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
import org.dspace.kernel.mixins.ShutdownService;
import org.dspace.services.CachingService;
import org.dspace.services.EventService;
diff --git a/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java b/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java
index 6f0b18ff40..07798a0225 100644
--- a/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java
+++ b/dspace-services/src/main/java/org/dspace/services/sessions/StatelessRequestServiceImpl.java
@@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.kernel.mixins.InitializedService;
import org.dspace.kernel.mixins.ShutdownService;
import org.dspace.services.ConfigurationService;
diff --git a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml
index e2837bb14f..e5f14b2b07 100644
--- a/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml
+++ b/dspace-services/src/main/resources/spring/spring-dspace-core-services.xml
@@ -16,18 +16,19 @@
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java
new file mode 100644
index 0000000000..fb121a2570
--- /dev/null
+++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationBeanTest.java
@@ -0,0 +1,134 @@
+/**
+ * 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.servicemanager.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import org.dspace.services.ConfigurationService;
+import org.dspace.test.DSpaceAbstractKernelTest;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Testing the org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean to ensure it performs
+ * property substitution in Spring XML configs (e.g. replacing ${dspace.dir} with the value from dspace.cfg)
+ *
+ * NOTE: This uses a TestDynamicPropertyBean bean defined in spring-test-beans.xml for all tests. It also depends
+ * on the org.springframework.beans.factory.config.PropertyPlaceholderConfigurer defined in
+ * spring-dspace-core-services.xml
+ *
+ * @author Tim Donohue
+ */
+public class DSpaceConfigurationBeanTest
+ extends DSpaceAbstractKernelTest {
+
+ // Path to our main test config file (local.properties)
+ private String propertyFilePath;
+
+ @Before
+ public void init() {
+ // Save the path to our main test configuration file
+ propertyFilePath = new DSpaceConfigurationService().getDSpaceHome(null) + File.separatorChar
+ + DSpaceConfigurationService.DEFAULT_CONFIG_DIR + File.separatorChar + "local.properties";
+ }
+
+ /**
+ * Test that property substitution is working properly in Spring XML configs.
+ * Properties in those XML configs (e.g. ${key}) should be dynamically replaced
+ * with the corresponding value from our ConfigurationService
+ */
+ @Test
+ public void testGetBeanSettingFromConfigurationService() {
+
+ // Load configs from files
+ ConfigurationService cfg = getKernel().getConfigurationService();
+ assertNotNull("ConfigurationService returned null", cfg);
+ assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property"));
+
+ //Load example service which is configured using a dynamic property (which is specified in a config file)
+ // See spring-test-beans.xml
+ TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean",
+ TestDynamicPropertyBean.class);
+
+ assertNotNull("Bean returned null", bean);
+ assertNotNull("Bean.name() returned null", bean.getProperty());
+
+ // The bean's getProperty() method should return the same value as "testDynamicBean.property" in DSpace's
+ // configuration. This is cause bean's property is set to ${testDynamicBean.property} in spring-test-beans.xml
+ assertEquals("Bean.getProperty() does not match configuration", cfg.getProperty("testDynamicBean.property"),
+ bean.getProperty());
+ }
+
+ /**
+ * Test that property substitution is working properly in Spring PropertySource (e.g. @Value annotations)
+ * Properties in those annotations, e.g. @Value("${key}"), should be dynamically replaced with the corresponding
+ * value from our ConfigurationService
+ */
+ @Test
+ public void testGetPropertySourceFromConfigurationService() {
+ // Load configs from files
+ ConfigurationService cfg = getKernel().getConfigurationService();
+ assertNotNull("ConfigurationService returned null", cfg);
+ assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property"));
+
+ // Load test bean which is defined by TestDynamicAnnotationConfiguration
+ TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("propertyBeanUsingAnnotation",
+ TestDynamicPropertyBean.class);
+
+ // The Test bean's property should be automatically set (see TestDynamicAnnotationConfiguration)
+ String configValue = bean.getProperty();
+
+ assertNotNull("PropertySource config returned null", configValue);
+
+ // The value of "configValue" should be equal to "testDynamicBean.property" in our configuration.
+ // This is because configValue is set via an @Value annotation in TestDynamicAnnotationConfiguration
+ assertEquals("PropertySource config does not match configuration", cfg.getProperty("testDynamicBean.property"),
+ configValue);
+ }
+
+ /**
+ * Test that automatic reloading of configuration via bean settings also works.
+ *
+ * @TODO: This test does not actually work yet, because Commons Configuration v2 doesn't yet have a
+ * org.apache.commons.configuration2.spring.ConfigurationPropertiesFactoryBean that supports reloading properties.
+ * NOTE: This test also fails in Commons Configuration v1 (e.g. in DSpace 6.x). So, it's possible we may not be
+ * able to support reloadable properties via Spring beans (until Commons Configuration does)
+ */
+ /*@Test
+ public void testReloadBeanSettingFromConfigurationService() throws ConfigurationException, InterruptedException {
+ //Load example service which is configured using a dynamic property (which is specified in a config file)
+ // See spring-test-beans.xml
+ TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean",
+ TestDynamicPropertyBean.class);
+ assertNotNull("WeLoveDSpace", bean.getProperty());
+
+ // Change the value of that Property in the file itself (using a separate builder instance)
+ FileBasedConfigurationBuilder builder = new Configurations()
+ .propertiesBuilder(propertyFilePath);
+ PropertiesConfiguration config = builder.getConfiguration();
+ // Clear out current value. Add in a new value
+ config.clearProperty("testDynamicBean.property");
+ config.addProperty("testDynamicBean.property", "NewValue");
+ // Save updates to file
+ builder.save();
+
+ // Check immediately. Property should be unchanged
+ // NOTE: If this fails, then somehow the configuration reloaded *immediately*
+ assertEquals("WeLoveDSpace", bean.getProperty());
+
+ // Wait now for 3 seconds
+ Thread.sleep(3_000);
+
+ // Check again. Property should have reloaded
+ // NOTE: reload time is set in config-definition.xml to reload every 2 seconds
+ assertEquals("NewValue", bean.getProperty());
+ } */
+}
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java
deleted file mode 100644
index 90804d7823..0000000000
--- a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationFactoryBeanTest.java
+++ /dev/null
@@ -1,57 +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.servicemanager.config;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.dspace.services.ConfigurationService;
-import org.dspace.test.DSpaceAbstractKernelTest;
-import org.junit.Test;
-
-/**
- * Testing the DSpaceConfigurationFactoryBean to ensure it performs property
- * substitution in Spring XML configs (e.g. replacing ${dspace.dir} with the
- * value from dspace.cfg)
- *
- * NOTE: This uses a TestDynamicPropertyBean bean defined in spring-test-beans.xml
- * for all tests.
- *
- * @author Tim Donohue
- */
-public class DSpaceConfigurationFactoryBeanTest
- extends DSpaceAbstractKernelTest {
-
- /**
- * Test that property substitution is working properly in Spring XML configs.
- * Properties in those configs (e.g. ${key}) should be dynamically replaced
- * with the corresponding value from our ConfigurationService
- */
- @Test
- public void testGetBeanSettingFromConfigurationService() {
-
- // Load configs from files
- ConfigurationService cfg = getKernel().getConfigurationService();
- assertNotNull("ConfigurationService returned null", cfg);
- assertNotNull("test config returned null", cfg.getProperty("testDynamicBean.property"));
-
- //Load example service which is configured using a dynamic property (which is specified in a config file)
- // See spring-test-beans.xml
- TestDynamicPropertyBean bean = getKernel().getServiceManager().getServiceByName("dynamicPropertyBean",
- TestDynamicPropertyBean.class);
-
- assertNotNull("Bean returned null", bean);
- assertNotNull("Bean.name() returned null", bean.getProperty());
-
- // The name of the ServiceExample bean should be the SAME as the value of "serviceExample.bean.name" in
- // configuration,
- // as the spring-test-beans.xml uses ${serviceExample.bean.name} to set the name
- assertEquals("Bean.name() does not match configuration", cfg.getProperty("testDynamicBean.property"),
- bean.getProperty());
- }
-}
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java
index d831fe09c5..e57b05ea50 100644
--- a/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java
+++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/DSpaceConfigurationServiceTest.java
@@ -13,11 +13,16 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import mockit.Expectations;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Configurations;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -33,10 +38,17 @@ public class DSpaceConfigurationServiceTest {
DSpaceConfigurationService configurationService;
int numPropsLoaded;
+ // Path to our main test config file (local.properties)
+ private String propertyFilePath;
+
@Before
public void init() {
configurationService = new DSpaceConfigurationService();
+ // Save the path to our main test configuration file
+ propertyFilePath = configurationService.getDSpaceHome(null) + File.separatorChar
+ + DSpaceConfigurationService.DEFAULT_CONFIG_DIR + File.separatorChar + "local.properties";
+
// clear out default configs (leaves us with an empty Configuration)
configurationService.clear();
@@ -174,6 +186,17 @@ public class DSpaceConfigurationServiceTest {
assertEquals(1, array.length);
assertEquals("A,B,C", array[0]);
configurationService.clearConfig("new.array");
+
+ // Test multiline arrays (requires loading configs from local.properties test config file)
+ // Specifying the same property multiple times should create an array of values.
+ DSpaceConfigurationService dscs = new DSpaceConfigurationService();
+ array = dscs.getArrayProperty("prop.multiline.array");
+ assertNotNull(array);
+ assertEquals(3, array.length);
+ assertEquals("line1", array[0]);
+ assertEquals("line2", array[1]);
+ assertEquals("line3", array[2]);
+ dscs.clear();
}
/**
@@ -242,7 +265,7 @@ public class DSpaceConfigurationServiceTest {
/**
* Test method for
- * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#getHasProperty(java.lang.String)}.
+ * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#hasProperty(java.lang.String)}.
*/
@Test
public void testHasProperty() {
@@ -416,7 +439,7 @@ public class DSpaceConfigurationServiceTest {
/**
* Test method for
- * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#loadConfig(java.lang.String, java.lang.String)}.
+ * {@link org.dspace.servicemanager.config.DSpaceConfigurationService#loadConfig(java.lang.String, java.lang.Object)}.
*/
@Test
public void testLoadConfig() {
@@ -495,6 +518,41 @@ public class DSpaceConfigurationServiceTest {
dscs = null;
}
+ /**
+ * Tests the ability of our ConfigurationService to automatically reload properties after a set period
+ * of time.
+ */
+ @Test
+ public void testAutomaticReload() throws ConfigurationException, InterruptedException {
+ // Initialize new config service
+ DSpaceConfigurationService dscs = new DSpaceConfigurationService();
+
+ // Assert a property exists with a specific initial value
+ assertNotNull(dscs.getProperty("prop.to.auto.reload"));
+ assertEquals("D-space", dscs.getProperty("prop.to.auto.reload"));
+
+ // Now, change the value of that Property in the file itself (using a separate builder instance)
+ FileBasedConfigurationBuilder builder = new Configurations()
+ .propertiesBuilder(propertyFilePath);
+ PropertiesConfiguration config = builder.getConfiguration();
+ // Clear out current value. Add in a new value
+ config.clearProperty("prop.to.auto.reload");
+ config.addProperty("prop.to.auto.reload", "DSpace");
+ // Save updates to file
+ builder.save();
+
+ // Check immediately. Property should be unchanged
+ // NOTE: If this fails, then somehow the configuration reloaded *immediately*
+ assertEquals("D-space", dscs.getProperty("prop.to.auto.reload"));
+
+ // Wait now for 3 seconds
+ Thread.sleep(3_000);
+
+ // Check again. Property should have reloaded
+ // NOTE: reload time is set in config-definition.xml to reload every 2 seconds
+ assertEquals("DSpace", dscs.getProperty("prop.to.auto.reload"));
+ }
+
/**
* Tests the ability of the system to properly extract system properties into the configuration.
* (NOTE: This ability to load system properties is specified in the test "config-definition.xml")
@@ -532,6 +590,11 @@ public class DSpaceConfigurationServiceTest {
// In local.properties, this value is something like " test "
assertEquals("test", dscs.getProperty("prop.needing.trimmed"));
+ // Also test that properties in included files are loaded
+ // This property is specified in "included.properties", which is loaded via an "include =" statement in
+ // local.properties
+ assertEquals("works", dscs.getProperty("prop.from.included.file"));
+
dscs.clear();
dscs = null;
}
diff --git a/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java b/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java
new file mode 100644
index 0000000000..581e33e2a3
--- /dev/null
+++ b/dspace-services/src/test/java/org/dspace/servicemanager/config/TestDynamicAnnotationConfiguration.java
@@ -0,0 +1,33 @@
+/**
+ * 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.servicemanager.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * A test bean which we will configure to load its one property via @Value annotation
+ *
+ * See DSpaceConfigurationFactoryBeanTest.
+ *
+ * @author Tim Donohue
+ */
+@Configuration
+public class TestDynamicAnnotationConfiguration {
+ // This setting should be loaded from the "testDynamicBean.property" configuration in local.properties
+ @Value("${testDynamicBean.property}")
+ private String value;
+
+ @Bean
+ public TestDynamicPropertyBean propertyBeanUsingAnnotation() {
+ TestDynamicPropertyBean bean = new TestDynamicPropertyBean();
+ bean.setProperty(value);
+ return bean;
+ }
+}
diff --git a/dspace-services/src/test/resources/config/config-definition.xml b/dspace-services/src/test/resources/config/config-definition.xml
index c172deb491..4ff26e0c34 100644
--- a/dspace-services/src/test/resources/config/config-definition.xml
+++ b/dspace-services/src/test/resources/config/config-definition.xml
@@ -8,26 +8,27 @@
http://www.dspace.org/license/
-->
-
-
-
-
+
+
-
+
-
-
+
+
-
\ No newline at end of file
+
diff --git a/dspace-services/src/test/resources/config/included.properties b/dspace-services/src/test/resources/config/included.properties
new file mode 100644
index 0000000000..fcdc3a1efc
--- /dev/null
+++ b/dspace-services/src/test/resources/config/included.properties
@@ -0,0 +1,3 @@
+# This is used by Unit Tests to ensure included properties files works
+# See DSpaceConfigurationServiceTest.testGetPropertiesFromFile()
+prop.from.included.file = works
diff --git a/dspace-services/src/test/resources/config/local.properties b/dspace-services/src/test/resources/config/local.properties
index 88cc11cb27..92cb538046 100644
--- a/dspace-services/src/test/resources/config/local.properties
+++ b/dspace-services/src/test/resources/config/local.properties
@@ -2,6 +2,7 @@
# set the service manager into a testing mode
service.manager.developing = true
+
# a list of all extra spring configs we want the service manager to load on start
service.manager.spring.configs=spring/spring-test-services.xml,spring/spring-test-beans.xml
@@ -10,5 +11,21 @@ service.manager.spring.configs=spring/spring-test-services.xml,spring/spring-tes
testDynamicBean.property = WeLoveDSpace
# This is a setting with leading/trailing spaces. Used in Unit Tests to ensure values are trimmed
+#See DSpaceConfigurationServiceTest.testGetPropertiesFromFile()
prop.needing.trimmed = test
+# This setting is used in Unit Tests to ensure multi-line arrays are supported
+# See DSpaceConfigurationServiceTest.testGetArray()
+prop.multiline.array = line1
+prop.multiline.array = line2
+prop.multiline.array = line3
+
+# This setting is used in Unit Tests to ensure "include =" works to include other config files
+# See: https://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html
+# See DSpaceConfigurationServiceTest.testGetPropertiesFromFile()
+include = included.properties
+
+# This setting is used by Unit Tests to check for automatic reloading
+# (We purposefully misspell DSpace and correct it in tests)
+# See DSpaceConfigurationServiceTest.testAutomaticReload()
+prop.to.auto.reload = D-space
diff --git a/dspace-services/src/test/resources/log4j.properties b/dspace-services/src/test/resources/log4j.properties
index f90d80b3ad..7dbc0a3bd0 100644
--- a/dspace-services/src/test/resources/log4j.properties
+++ b/dspace-services/src/test/resources/log4j.properties
@@ -1,7 +1,7 @@
log4j.rootCategory=info
log4j.rootLogger=info, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %p %m [%d] (%F:%L) %n
diff --git a/dspace-services/src/test/resources/spring/spring-test-beans.xml b/dspace-services/src/test/resources/spring/spring-test-beans.xml
index 1242cb5cee..ed53d7f8f4 100644
--- a/dspace-services/src/test/resources/spring/spring-test-beans.xml
+++ b/dspace-services/src/test/resources/spring/spring-test-beans.xml
@@ -10,11 +10,18 @@
-->
+ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+
+
+
@@ -26,12 +33,10 @@
-
+
-
\ No newline at end of file
+
diff --git a/dspace-solr/pom.xml b/dspace-solr/pom.xml
index 42797d4740..0672ce9cbc 100644
--- a/dspace-solr/pom.xml
+++ b/dspace-solr/pom.xml
@@ -169,6 +169,14 @@
jetty-xmlorg.eclipse.jetty
+
+ org.apache.zookeeper
+ zookeeper
+
+
+ log4j
+ log4j
+
@@ -224,6 +232,10 @@
jetty-xmlorg.eclipse.jetty
+
+ log4j
+ log4j
+ org.apache.zookeeperzookeeper
@@ -231,31 +243,55 @@
+
+
+ org.apache.zookeeper
+ zookeeper
+ 3.4.6
+
+
+ log4j
+ log4j
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+
+
- org.slf4j
- jul-to-slf4j
- 1.7.14
+ org.apache.logging.log4j
+ log4j-jul
+ ${log4j.version}
- org.slf4j
- slf4j-log4j12
- runtime
+ org.apache.logging.log4j
+ log4j-api
- log4j
- log4j
- jar
-
-
- javax.servlet
- servlet-api
- provided
+ org.apache.logging.log4j
+ log4j-core
+
+ org.apache.logging.log4j
+ log4j-web
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ commons-loggingcommons-logging
+
+
+ javax.servlet
+ javax.servlet-api
+ provided
+
diff --git a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java b/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java
deleted file mode 100644
index a177e2db32..0000000000
--- a/dspace-solr/src/main/java/org/dspace/solr/filters/ConfigureLog4jListener.java
+++ /dev/null
@@ -1,80 +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.solr.filters;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.apache.log4j.Hierarchy;
-import org.apache.log4j.Level;
-import org.apache.log4j.PropertyConfigurator;
-import org.apache.log4j.helpers.Loader;
-import org.apache.log4j.spi.Configurator;
-import org.apache.log4j.spi.RootLogger;
-import org.apache.log4j.xml.DOMConfigurator;
-
-/**
- * Initialize Log4J at application startup.
- * This class mimics the default Log4J initialization procedure, except
- * that it is controlled by context parameters rather than system properties.
- *
- * @author Mark H. Wood
- */
-public class ConfigureLog4jListener
- implements ServletContextListener {
- public void contextInitialized(ServletContextEvent sce) {
- ServletContext ctx = sce.getServletContext();
-
- String logConfig = ctx.getInitParameter("log4j.configuration");
- if (null == logConfig) {
- logConfig = "log4j.properties";
- }
-
- URL configURL;
- try {
- configURL = new File(logConfig).toURI().toURL();
- } catch (MalformedURLException e) {
- configURL = Loader.getResource(logConfig);
- }
-
- if (null == configURL) {
- ctx.log("Log4J configuration not found. Left unconfigured.");
- return;
- } else {
- ctx.log(" In context " + ctx.getContextPath() +
- ", configuring Log4J from " + configURL.toExternalForm());
-
- String configuratorName = ctx.getInitParameter("log4j.configuratorClass");
- if (null != configuratorName) {
- Configurator configurator;
- try {
- configurator = (Configurator) Class.forName(configuratorName).newInstance();
- } catch (Exception ex) {
- ctx.log("Unable to load custom Log4J configuration class '"
- + configuratorName + "': " + ex.getMessage());
- return;
- }
-
- configurator.doConfigure(configURL, new Hierarchy(new RootLogger(Level.OFF)));
- } else if (configURL.getFile().endsWith(".xml")) {
- DOMConfigurator.configure(configURL);
- } else {
- PropertyConfigurator.configure(configURL);
- }
- }
- }
-
- public void contextDestroyed(ServletContextEvent sce) {
- // Nothing to be done
- }
-}
diff --git a/dspace-solr/src/main/webapp/WEB-INF/web.xml b/dspace-solr/src/main/webapp/WEB-INF/web.xml
index 67350c4dcc..fd5846a4b4 100644
--- a/dspace-solr/src/main/webapp/WEB-INF/web.xml
+++ b/dspace-solr/src/main/webapp/WEB-INF/web.xml
@@ -1,6 +1,4 @@
-
-
+
-
-
+ Solr home: configuration, cores etc.solr/home${dspace.dir}/solrjava.lang.String
-
+
- log4j.configuration
- ${dspace.dir}/config/log4j-solr.properties
- URL locating a Log4J configuration file (properties or XML).
+
+ URL locating a Log4J configuration file (properties or XML).
+
+ log4jConfiguration
+ ${dspace.dir}/config/log4j-solr.xml
+
+ org.apache.logging.log4j.web.Log4jServletContextListener
+
+
+
+ Activate logging
+ log4jServletFilter
+ org.apache.logging.log4j.web.Log4jServletFilter
+
+
LocalHostRestrictionFilter
@@ -83,6 +88,14 @@
-->
+
+ log4jServletFilter
+ /*
+ REQUEST
+ FORWARD
+ INCLUDE
+ ERROR
+ LocalHostRestrictionFilter
@@ -106,10 +119,6 @@
-
- org.dspace.solr.filters.ConfigureLog4jListener
-
-
Zookeeperorg.apache.solr.servlet.ZookeeperInfoServlet
diff --git a/dspace-spring-rest/pom.xml b/dspace-spring-rest/pom.xml
index 2bcda527d7..3ea878747b 100644
--- a/dspace-spring-rest/pom.xml
+++ b/dspace-spring-rest/pom.xml
@@ -181,25 +181,6 @@
org.springframework.bootspring-boot-starter-web${spring-boot.version}
-
-
-
- org.slf4j
- log4j-over-slf4j
-
-
- org.slf4j
- jul-to-slf4j
-
-
- ch.qos.logback
- logback-classic
-
- org.springframework.boot
@@ -245,16 +226,17 @@
test
-
-
- org.springframework.data
- spring-data-rest-hal-browser
- 2.5.7.RELEASE
-
-
-
+
+
+ org.springframework.data
+ spring-data-rest-hal-browser
+ 2.5.7.RELEASE
+
+
+
@@ -263,11 +245,14 @@
${spring-boot.version}
-
-
-
+
+ org.springframework.bootspring-boot-starter
+ ${spring-boot.version}org.springframework.boot
@@ -277,8 +262,9 @@
org.springframework.boot
- spring-boot-starter-log4j
- -->
+ spring-boot-starter-log4j2
+ ${spring-boot.version}
+
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java
index e60007d8ab..b387951f09 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/BitstreamContentRestController.java
@@ -17,7 +17,7 @@ import javax.ws.rs.core.Response;
import org.apache.catalina.connector.ClientAbortException;
import org.apache.commons.lang3.tuple.Pair;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.BitstreamRest;
import org.dspace.app.rest.utils.ContextUtil;
import org.dspace.app.rest.utils.MultipartFileSender;
@@ -57,7 +57,8 @@ import org.springframework.web.bind.annotation.RestController;
+ "/{uuid:[0-9a-fxA-FX]{8}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{4}-[0-9a-fxA-FX]{12}}/content")
public class BitstreamContentRestController {
- private static final Logger log = Logger.getLogger(BitstreamContentRestController.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager
+ .getLogger(BitstreamContentRestController.class);
//Most file systems are configured to use block sizes of 4096 or 8192 and our buffer should be a multiple of that.
private static final int BUFFER_SIZE = 4096 * 10;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java
index 85c7a1e098..6c29dc5283 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/DiscoveryRestController.java
@@ -11,8 +11,8 @@ import java.util.Arrays;
import java.util.List;
import java.util.Objects;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.link.HalLinkService;
import org.dspace.app.rest.model.FacetConfigurationRest;
import org.dspace.app.rest.model.FacetResultsRest;
@@ -47,7 +47,7 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/api/" + SearchResultsRest.CATEGORY)
public class DiscoveryRestController implements InitializingBean {
- private static final Logger log = Logger.getLogger(ScopeResolver.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class);
@Autowired
protected Utils utils;
@@ -142,7 +142,8 @@ public class DiscoveryRestController implements InitializingBean {
}
//Get the Search results in JSON format
- SearchResultsRest searchResultsRest = discoveryRestRepository
+ SearchResultsRest searchResultsRest = null;
+ searchResultsRest = discoveryRestRepository
.getSearchObjects(query, dsoType, dsoScope, configurationName, searchFilters, page);
//Convert the Search JSON results to paginated HAL resources
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
index 808a7fdc30..a4b8f64e91 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RestResourceController.java
@@ -10,21 +10,25 @@ package org.dspace.app.rest;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.atteo.evo.inflector.English;
import org.dspace.app.rest.converter.JsonPatchConverter;
import org.dspace.app.rest.exception.PaginationException;
@@ -46,6 +50,7 @@ import org.dspace.app.rest.repository.DSpaceRestRepository;
import org.dspace.app.rest.repository.LinkRestRepository;
import org.dspace.app.rest.utils.RestRepositoryUtils;
import org.dspace.app.rest.utils.Utils;
+import org.dspace.authorize.AuthorizeException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
@@ -60,6 +65,7 @@ import org.springframework.hateoas.Link;
import org.springframework.hateoas.PagedResources;
import org.springframework.hateoas.Resource;
import org.springframework.hateoas.ResourceSupport;
+import org.springframework.hateoas.Resources;
import org.springframework.hateoas.UriTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
@@ -105,7 +111,7 @@ public class RestResourceController implements InitializingBean {
*/
private static final String REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT = "/{id:\\d+}";
- private static final Logger log = Logger.getLogger(RestResourceController.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RestResourceController.class);
@Autowired
DiscoverableEndpointsService discoverableEndpointsService;
@@ -426,17 +432,21 @@ public class RestResourceController implements InitializingBean {
}
/**
- * Called in POST, multipart, upload a resource passed into "file" request parameter
+ * Called in POST, multipart, upload to a specific rest resource the file passed as "file" request parameter
*
* Note that the regular expression in the request mapping accept a number as identifier;
*
* @param request
+ * the http request
* @param apiCategory
+ * the api category
* @param model
+ * the rest model that identify the REST resource collection
* @param id
- * @param extraField
+ * the id of the specific rest resource
* @param uploadfile
- * @return
+ * the file to upload
+ * @return the created resource
* @throws HttpRequestMethodNotSupportedException
*/
@RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_DIGIT, headers =
@@ -445,26 +455,28 @@ public class RestResourceController implements InitializingBean {
@PathVariable String apiCategory,
@PathVariable String model,
@PathVariable Integer id,
- @RequestParam(required = false, value =
- "extraField") String extraField,
@RequestParam("file") MultipartFile
uploadfile)
throws HttpRequestMethodNotSupportedException {
- return uploadInternal(request, apiCategory, model, id, extraField, uploadfile);
+ return uploadInternal(request, apiCategory, model, id, uploadfile);
}
/**
- * Called in POST, multipart, upload a resource passed into "file" request parameter
+ * Called in POST, multipart, upload to a specific rest resource the file passed as "file" request parameter
*
* Note that the regular expression in the request mapping accept a UUID as identifier;
*
* @param request
+ * the http request
* @param apiCategory
+ * the api category
* @param model
+ * the rest model that identify the REST resource collection
* @param id
- * @param extraField
+ * the id of the specific rest resource
* @param uploadfile
- * @return
+ * the file to upload
+ * @return the created resource
* @throws HttpRequestMethodNotSupportedException
*/
@RequestMapping(method = RequestMethod.POST, value = REGEX_REQUESTMAPPING_IDENTIFIER_AS_UUID, headers =
@@ -473,12 +485,10 @@ public class RestResourceController implements InitializingBean {
@PathVariable String apiCategory,
@PathVariable String model,
@PathVariable UUID id,
- @RequestParam(required = false, value =
- "extraField") String extraField,
@RequestParam("file") MultipartFile
uploadfile)
throws HttpRequestMethodNotSupportedException {
- return uploadInternal(request, apiCategory, model, id, extraField, uploadfile);
+ return uploadInternal(request, apiCategory, model, id, uploadfile);
}
/**
@@ -488,21 +498,19 @@ public class RestResourceController implements InitializingBean {
* @param apiCategory
* @param model
* @param id
- * @param extraField
* @param uploadfile
* @return
*/
private ResponseEntity uploadInternal(HttpServletRequest request,
String apiCategory, String model,
ID id,
- String extraField,
MultipartFile uploadfile) {
checkModelPluralForm(apiCategory, model);
DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model);
RestAddressableModel modelObject = null;
try {
- modelObject = repository.upload(request, apiCategory, model, id, extraField, uploadfile);
+ modelObject = repository.upload(request, apiCategory, model, id, uploadfile);
} catch (Exception e) {
log.error(e.getMessage(), e);
return ControllerUtils.toEmptyResponse(HttpStatus.INTERNAL_SERVER_ERROR);
@@ -512,6 +520,46 @@ public class RestResourceController implements InitializingBean {
return ControllerUtils.toResponseEntity(HttpStatus.CREATED, null, result);
}
+ /**
+ * Upload a file against the collection resource endpoint. This is typically used for bulk creation of resources
+ * such for instance multiple workspaceitems from a CSV or bibliographic file
+ *
+ * @param request
+ * the http request
+ * @param apiCategory
+ * the api category
+ * @param model
+ * the rest model that identify the REST resource collection
+ * @param uploadfile
+ * the bulk file
+ * @return the list of generated resources
+ * @throws SQLException
+ * @throws FileNotFoundException
+ * @throws IOException
+ * @throws AuthorizeException
+ */
+ @RequestMapping(method = { RequestMethod.POST }, headers = "content-type=multipart/form-data")
+ public ResponseEntity upload(HttpServletRequest request,
+ @PathVariable String apiCategory,
+ @PathVariable String model,
+ @RequestParam("file") MultipartFile
+ uploadfile)
+ throws SQLException, FileNotFoundException, IOException, AuthorizeException {
+
+ checkModelPluralForm(apiCategory, model);
+ DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model);
+
+ Iterable content = repository.upload(request, uploadfile);
+
+ List resources = new ArrayList<>();
+ for (T modelObject : content) {
+ DSpaceResource result = repository.wrapResource(modelObject);
+ linkService.addLinks(result);
+ resources.add(result);
+ }
+ return ControllerUtils.toResponseEntity(HttpStatus.OK, null, Resources.wrap(resources));
+ }
+
/**
* PATCH method, using operation on the resources following (JSON) Patch notation (https://tools.ietf
* .org/html/rfc6902)
@@ -573,7 +621,6 @@ public class RestResourceController implements InitializingBean {
String model, ID id,
JsonNode jsonNode)
throws HttpRequestMethodNotSupportedException {
-
checkModelPluralForm(apiCategory, model);
DSpaceRestRepository repository = utils.getResourceRepository(apiCategory, model);
RestAddressableModel modelObject = null;
@@ -744,8 +791,9 @@ public class RestResourceController implements InitializingBean {
EmbeddedPage ep = (EmbeddedPage) resource.getEmbeddedResources().get(rel);
List extends RestAddressableModel> fullList = ep.getFullList();
if (fullList == null || fullList.size() == 0) {
- response.setStatus(HttpServletResponse.SC_NO_CONTENT);
- return null;
+ PageImpl pageResult = new PageImpl(fullList, page, 0);
+ result = assembler.toResource(pageResult);
+ return result;
}
int start = page.getOffset();
int end = (start + page.getPageSize()) > fullList.size() ? fullList.size() : (start + page.getPageSize());
@@ -767,7 +815,6 @@ public class RestResourceController implements InitializingBean {
if (resource.getEmbeddedResources().get(rel) == null) {
response.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
-
return (ResourceSupport) resource.getEmbeddedResources().get(rel);
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java
index 0ba085fab1..18f41310b3 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/RootRestResourceController.java
@@ -42,17 +42,11 @@ public class RootRestResourceController {
@RequestMapping(method = RequestMethod.GET)
public RootResource listDefinedEndpoint(HttpServletRequest request) {
- String restUrl = getRestURL(request);
-
- RootRest rootRest = rootRestRepository.getRoot(restUrl);
+ RootRest rootRest = rootRestRepository.getRoot();
RootResource rootResource = new RootResource(rootRest);
halLinkService.addLinks(rootResource);
return rootResource;
}
- private String getRestURL(HttpServletRequest request) {
- String url = request.getRequestURL().toString();
- return url.substring(0, url.length() - request.getRequestURI().length()) + request.getContextPath();
- }
}
\ No newline at end of file
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java
index 2e4031338a..a278ae313d 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/AuthorityEntryRestConverter.java
@@ -7,7 +7,7 @@
*/
package org.dspace.app.rest.converter;
-import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.lang3.NotImplementedException;
import org.dspace.app.rest.model.AuthorityEntryRest;
import org.dspace.app.rest.utils.AuthorityUtils;
import org.dspace.content.authority.Choice;
@@ -36,6 +36,6 @@ public class AuthorityEntryRestConverter extends DSpaceConverter {
- private static final Logger log = Logger.getLogger(BrowseEntryConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BrowseEntryConverter.class);
@Override
public BrowseEntryRest convert(String[] source) {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java
index c432064b86..a4c368d2b4 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/CollectionConverter.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.CollectionRest;
import org.dspace.app.rest.model.ResourcePolicyRest;
import org.dspace.app.rest.utils.ContextUtil;
@@ -38,7 +38,7 @@ import org.springframework.stereotype.Component;
public class CollectionConverter
extends DSpaceObjectConverter {
- private static final Logger log = Logger.getLogger(CollectionConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionConverter.class);
@Autowired
private BitstreamConverter bitstreamConverter;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java
index d33be1ff46..79e3234855 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.converter;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.dspace.app.rest.model.SearchFacetEntryRest;
import org.dspace.app.rest.model.SearchFacetValueRest;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java
index 05632370f2..0e39d3a7fb 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/EPersonConverter.java
@@ -11,7 +11,7 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.EPersonRest;
import org.dspace.app.rest.model.GroupRest;
import org.dspace.core.Context;
@@ -36,7 +36,7 @@ public class EPersonConverter extends DSpaceObjectConverter {
- private static final Logger log = Logger.getLogger(GroupConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupConverter.class);
@Override
public GroupRest fromModel(Group obj) {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java
index 51fb456d72..8c9743457c 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/ItemConverter.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.converter;
import java.util.ArrayList;
import java.util.List;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.BitstreamRest;
import org.dspace.app.rest.model.ItemRest;
import org.dspace.content.Bitstream;
@@ -33,7 +33,7 @@ public class ItemConverter extends DSpaceObjectConverter {
- private static final Logger log = Logger.getLogger(SubmissionDefinitionConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager
+ .getLogger(SubmissionDefinitionConverter.class);
@Autowired
private SubmissionSectionConverter panelConverter;
@@ -79,6 +80,6 @@ public class SubmissionDefinitionConverter extends DSpaceConverter fields = getPage(step);
- sd.setFields(fields);
+ DCInput[][] step = obj.getFields();
+ List rows = getPage(step, obj.getFormName());
+ sd.setRows(rows);
return sd;
}
- private List getPage(DCInput[] page) {
- List fields = new LinkedList();
- for (DCInput dcinput : page) {
- fields.add(getField(dcinput));
+ private List getPage(DCInput[][] page, String formName) {
+ List rows = new LinkedList();
+
+ for (DCInput[] row : page) {
+ List fields = new LinkedList();
+ SubmissionFormRowRest rowRest = new SubmissionFormRowRest();
+ rowRest.setFields(fields);
+ rows.add(rowRest);
+ for (DCInput dcinput : row) {
+ fields.add(getField(dcinput, formName));
+ }
}
- return fields;
+ return rows;
}
- private SubmissionFormFieldRest getField(DCInput dcinput) {
+ private SubmissionFormFieldRest getField(DCInput dcinput, String formName) {
SubmissionFormFieldRest inputField = new SubmissionFormFieldRest();
List selectableMetadata = new ArrayList();
inputField.setLabel(dcinput.getLabel());
inputField.setHints(dcinput.getHints());
+ inputField.setStyle(dcinput.getStyle());
inputField.setMandatoryMessage(dcinput.getWarning());
inputField.setMandatory(dcinput.isRequired());
inputField.setScope(ScopeEnum.fromString(dcinput.getScope()));
@@ -99,17 +112,16 @@ public class SubmissionFormConverter extends DSpaceConverter {
- private static final Logger log = Logger.getLogger(SubmissionSectionConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionSectionConverter.class);
private SubmissionConfigReader submissionConfigReader;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java
index 65420b79d5..22cee05541 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkspaceItemConverter.java
@@ -10,8 +10,8 @@ package org.dspace.app.rest.converter;
import java.sql.SQLException;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.ErrorRest;
import org.dspace.app.rest.model.SubmissionDefinitionRest;
import org.dspace.app.rest.model.SubmissionSectionRest;
@@ -24,7 +24,6 @@ import org.dspace.app.util.SubmissionStepConfig;
import org.dspace.content.Collection;
import org.dspace.content.Item;
import org.dspace.eperson.EPerson;
-import org.dspace.submit.AbstractProcessingStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -38,7 +37,7 @@ import org.springframework.stereotype.Component;
public class WorkspaceItemConverter
extends DSpaceConverter {
- private static final Logger log = Logger.getLogger(WorkspaceItemConverter.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemConverter.class);
@Autowired
private EPersonConverter epersonConverter;
@@ -86,6 +85,10 @@ public class WorkspaceItemConverter
// info
if (collection != null) {
+ // we set the status to true as we will discover validation error later in this block
+ // we could eventually leave the status to empty if we don't have collection information, this could be
+ // eventually the case when projection support will be included
+ witem.setStatus(true);
SubmissionDefinitionRest def = submissionDefinitionConverter
.convert(submissionConfigReader.getSubmissionConfigByCollection(collection.getHandle()));
witem.setSubmissionDefinition(def);
@@ -103,22 +106,21 @@ public class WorkspaceItemConverter
Object stepInstance = stepClass.newInstance();
- if (stepInstance instanceof AbstractProcessingStep) {
+ if (stepInstance instanceof AbstractRestProcessingStep) {
// load the interface for this step
- AbstractRestProcessingStep stepProcessing = (AbstractRestProcessingStep) stepClass
- .newInstance();
+ AbstractRestProcessingStep stepProcessing =
+ (AbstractRestProcessingStep) stepClass.newInstance();
for (ErrorRest error : stepProcessing.validate(submissionService, obj, stepConfig)) {
addError(witem.getErrors(), error);
+ witem.setStatus(false);
}
witem.getSections()
- .put(sections.getId(), stepProcessing.getData(submissionService, obj, stepConfig));
+ .put(sections.getId(), stepProcessing.getData(submissionService, obj, stepConfig));
} else {
- throw new Exception("The submission step class specified by '"
- + stepConfig.getProcessingClassName()
- + "' does not extend the class org.dspace.app.rest.submit" +
- ".AbstractRestProcessingStep!"
- + " Therefore it cannot be used by the Configurable Submission as the" +
- " !");
+ log.warn("The submission step class specified by '" + stepConfig.getProcessingClassName() +
+ "' does not extend the class org.dspace.app.rest.submit.AbstractRestProcessingStep!" +
+ " Therefore it cannot be used by the Configurable Submission as the " +
+ "!");
}
} catch (Exception e) {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java
index 5aff3adafd..4ea5e6f9df 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/query/SearchQueryConverter.java
@@ -11,7 +11,7 @@ import java.util.LinkedList;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.model.query.RestSearchOperator;
import org.dspace.app.rest.parameter.SearchFilter;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java
index 161c0cf403..ac68d0ffdb 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/exception/DSpaceApiExceptionControllerAdvice.java
@@ -38,6 +38,7 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExcep
*/
@ControllerAdvice
public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionHandler {
+
@Autowired
private RestAuthenticationService restAuthenticationService;
@@ -51,6 +52,12 @@ public class DSpaceApiExceptionControllerAdvice extends ResponseEntityExceptionH
}
}
+ @ExceptionHandler(IllegalArgumentException.class)
+ protected void handleIllegalArgumentException(HttpServletRequest request, HttpServletResponse response,
+ Exception ex) throws IOException {
+ sendErrorResponse(request, response, ex, ex.getMessage(), HttpServletResponse.SC_BAD_REQUEST);
+ }
+
@ExceptionHandler(SQLException.class)
protected void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex)
throws IOException {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java
index 799623b7ff..2529d275ab 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/link/HalLinkService.java
@@ -16,7 +16,7 @@ import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.hateoas.EmbeddedPage;
import org.dspace.app.rest.model.hateoas.HALResource;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
@ComponentScan
public class HalLinkService {
- private static final Logger log = Logger.getLogger(HalLinkService.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HalLinkService.class);
@Autowired
private List halLinkFactories;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java
index 0d82fffd54..1fe4174973 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/BaseObjectRest.java
@@ -28,6 +28,13 @@ public abstract class BaseObjectRest implements Identifi
@JsonInclude(Include.NON_EMPTY)
private List errors;
+ private Boolean status;
+
+ @JsonInclude(Include.NON_NULL)
+ public Boolean isStatus() {
+ return status;
+ }
+
@Override
public T getId() {
return id;
@@ -48,4 +55,7 @@ public abstract class BaseObjectRest implements Identifi
this.errors = errors;
}
+ public void setStatus(Boolean status) {
+ this.status = status;
+ }
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java
index 2235e51fee..19d3decaee 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/CommunityRest.java
@@ -10,6 +10,7 @@ package org.dspace.app.rest.model;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
/**
* The Community REST Resource
@@ -61,6 +62,7 @@ public class CommunityRest extends DSpaceObjectRest {
}
@Override
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
public String getType() {
return NAME;
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java
index 054ea022dd..59bf9176dd 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ErrorRest.java
@@ -21,6 +21,11 @@ public class ErrorRest {
private List paths;
+ /**
+ * The error message as i18key
+ *
+ * @return The message as i18key
+ */
public String getMessage() {
return message;
}
@@ -29,6 +34,13 @@ public class ErrorRest {
this.message = message;
}
+ /**
+ * The json paths where the error message apply. They can be as detailed as a specific value in a multivalues
+ * attributes (i.e. sections.traditionalpageone['dc.contributor.author'][1] to identify the second author - 0 based)
+ * or generic to apply to a whole section (sections.license)
+ *
+ * @return
+ */
public List getPaths() {
if (this.paths == null) {
this.paths = new ArrayList();
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java
index b8aad5260e..421ecc5587 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/GroupRest.java
@@ -10,6 +10,7 @@ package org.dspace.app.rest.model;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.dspace.app.rest.RestResourceController;
/**
@@ -17,6 +18,7 @@ import org.dspace.app.rest.RestResourceController;
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
+@JsonIgnoreProperties(ignoreUnknown = true)
public class GroupRest extends DSpaceObjectRest {
public static final String NAME = "group";
@@ -69,4 +71,4 @@ public class GroupRest extends DSpaceObjectRest {
public Class getController() {
return RestResourceController.class;
}
-}
\ No newline at end of file
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java
index 79fcea3d80..8f729f39a3 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/ScopeEnum.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.model;
/**
* The possible restriction options for the scope attributes in the
- * SubmissionPanel resource and InputFormPage resource
+ * SubmissionPanel resource and SubmissionForm's fields
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java
index dcf25c5873..a07ce52f71 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormFieldRest.java
@@ -17,74 +17,194 @@ import org.dspace.submit.model.LanguageFormField;
import org.dspace.submit.model.SelectableMetadata;
/**
- * The InputFormField REST Resource. It is not addressable directly, only used
+ * The SubmissionFormField REST Resource. It is not addressable directly, only used
* as inline object in the InputForm resource
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
@JsonInclude(value = Include.NON_NULL)
public class SubmissionFormFieldRest {
-
+ /**
+ * The SubmissionFormInputType for this field
+ */
private SubmissionFormInputTypeRest input;
+
+ /**
+ * The main scope of the field
+ */
private ScopeEnum scope;
+
+ /**
+ * The visibility restriction for the field
+ */
private SubmissionVisibilityRest visibility;
+
+ /**
+ * The label of the field
+ */
private String label;
+
+ /**
+ * true if the field is required
+ */
private boolean mandatory;
+
+ /**
+ * true if the field allows multiple value
+ */
private boolean repeatable;
+
+ /**
+ * The message to return if the information is missing
+ */
private String mandatoryMessage;
+
+ /**
+ * A text to help field input
+ */
private String hints;
+ /**
+ * Extra information to be used by the UI to customize the presentation of the field. The format is dependent from
+ * the UI implementation, the default Angular UI expects whitespace separated CSS class to add to the field
+ */
+ private String style;
+
+ /**
+ * The list of metadata, often a single element, to offer for the storage of the information. This map the DSpace <
+ * 7 concepts of qualdrop
+ */
private List selectableMetadata;
+
+ /**
+ * The list of language that can be used to fill the field
+ */
private List languageCodes;
+ /**
+ * Getter for {@link #selectableMetadata}
+ *
+ * @return {@link #selectableMetadata}
+ */
public List getSelectableMetadata() {
return selectableMetadata;
}
+ /**
+ * Setter for {@link #selectableMetadata}
+ *
+ */
public void setSelectableMetadata(List selectableMetadata) {
this.selectableMetadata = selectableMetadata;
}
+ /**
+ * Getter for {@link #label}
+ *
+ * @return {@link #label}
+ */
public String getLabel() {
return label;
}
+ /**
+ * Setter for {@link #label}
+ *
+ */
public void setLabel(String label) {
this.label = label;
}
+ /**
+ * Getter for {@link #mandatory}
+ *
+ * @return {@link #mandatory}
+ */
public boolean isMandatory() {
return mandatory;
}
+ /**
+ * Setter for {@link #mandatory}
+ *
+ */
public void setMandatory(boolean mandatory) {
this.mandatory = mandatory;
}
+ /**
+ * Getter for {@link #repeatable}
+ *
+ * @return {@link #repeatable}
+ */
public boolean isRepeatable() {
return repeatable;
}
+ /**
+ * Setter for {@link #repeatable}
+ *
+ */
public void setRepeatable(boolean repeatable) {
this.repeatable = repeatable;
}
+ /**
+ * Getter for {@link #mandatoryMessage}
+ *
+ * @return {@link #mandatoryMessage}
+ */
public String getMandatoryMessage() {
return mandatoryMessage;
}
+ /**
+ * Setter for {@link #mandatoryMessage}
+ *
+ */
public void setMandatoryMessage(String mandatoryMessage) {
this.mandatoryMessage = mandatoryMessage;
}
+ /**
+ * Getter for {@link #hints}
+ *
+ * @return {@link #hints}
+ */
public String getHints() {
return hints;
}
+ /**
+ * Setter for {@link #hints}
+ *
+ */
public void setHints(String hints) {
this.hints = hints;
}
+ /**
+ * Getter for {@link #style}
+ *
+ * @return {@link #style}
+ */
+ public String getStyle() {
+ return style;
+ }
+
+ /**
+ * Setter for {@link #style}
+ *
+ */
+ public void setStyle(String style) {
+ this.style = style;
+ }
+
+ /**
+ * Getter for {@link #languageCodes}
+ *
+ * @return {@link #languageCodes}
+ */
public List getLanguageCodes() {
if (languageCodes == null) {
languageCodes = new ArrayList();
@@ -92,22 +212,44 @@ public class SubmissionFormFieldRest {
return languageCodes;
}
+ /**
+ * Setter for {@link #languageCodes}
+ *
+ */
public void setLanguageCodes(List languageCodes) {
this.languageCodes = languageCodes;
}
+ /**
+ * Getter for {@link #input}
+ *
+ * @return {@link #input}
+ */
public SubmissionFormInputTypeRest getInput() {
return input;
}
+ /**
+ * Setter for {@link #input}
+ *
+ */
public void setInput(SubmissionFormInputTypeRest input) {
this.input = input;
}
+ /**
+ * Getter for {@link #scope}
+ *
+ * @return {@link #selectableMetadata}
+ */
public ScopeEnum getScope() {
return scope;
}
+ /**
+ * Setter for {@link #scope}
+ *
+ */
public void setScope(ScopeEnum scope) {
this.scope = scope;
}
@@ -121,4 +263,5 @@ public class SubmissionFormFieldRest {
this.visibility = visibility;
}
}
+
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java
index 07c20da2eb..594d715b22 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormInputTypeRest.java
@@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
/**
- * The InputFormField REST Resource. It is not addressable directly, only used
+ * The SubmissionFormInputType REST Resource. It is not addressable directly, only used
* as inline object in the InputForm resource
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java
index 79dc8abc63..8dededdabb 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRest.java
@@ -12,7 +12,7 @@ import java.util.List;
import org.dspace.app.rest.RestResourceController;
/**
- * The Input Form REST Resource
+ * The Submission Form REST Resource
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
@@ -21,19 +21,37 @@ public class SubmissionFormRest extends BaseObjectRest {
public static final String NAME_LINK_ON_PANEL = RestAddressableModel.CONFIGURATION;
public static final String CATEGORY = RestAddressableModel.CONFIGURATION;
+ /**
+ * An unique name identifying the submission form
+ */
private String name;
- private List fields;
+ /**
+ * The list of row in the submission form
+ */
+ private List rows;
@Override
+ /**
+ * The id of the submission form is its name
+ */
public String getId() {
return name;
}
+ /**
+ * Setter for {@link #name}
+ *
+ */
public void setName(String name) {
this.name = name;
}
+ /**
+ * Getter for {@link #name}
+ *
+ * @return {@link #name}
+ */
public String getName() {
return name;
}
@@ -53,11 +71,20 @@ public class SubmissionFormRest extends BaseObjectRest {
return CATEGORY;
}
- public List getFields() {
- return fields;
+ /**
+ * Getter for {@link #rows}
+ *
+ * @return {@link #rows}
+ */
+ public List getRows() {
+ return rows;
}
- public void setFields(List fields) {
- this.fields = fields;
+ /**
+ * Setter for {@link #rows}
+ *
+ */
+ public void setRows(List rows) {
+ this.rows = rows;
}
-}
\ No newline at end of file
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java
new file mode 100644
index 0000000000..250b282e6b
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionFormRowRest.java
@@ -0,0 +1,42 @@
+/**
+ * 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.rest.model;
+
+import java.util.List;
+
+/**
+ * The InputFormRow REST Resource. It is not addressable directly, only used
+ * as inline object in the InputForm resource
+ *
+ * @author Andrea Bollini (andrea.bollini at 4science.it)
+ */
+public class SubmissionFormRowRest {
+ /**
+ * The list of fields in the row
+ */
+ private List fields;
+
+ /**
+ * Getter for {@link #fields}
+ *
+ * @return {@link #fields}
+ */
+ public List getFields() {
+ return fields;
+ }
+
+ /**
+ * Setter for {@link #fields}
+ *
+ */
+ public void setFields(List fields) {
+ this.fields = fields;
+ }
+}
+
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java
index 8cb45975a7..40f71a97f4 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/SubmissionVisibilityRest.java
@@ -12,13 +12,19 @@ import java.util.Objects;
/**
* The SubmissionVisibility REST Resource. It is not addressable directly, only
- * used as inline object in the SubmissionPanel resource and InputFormPage
- * resource
+ * used as inline object in the SubmissionPanel resource and SubmissionForm's fields
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
public class SubmissionVisibilityRest {
+ /**
+ * The visibility to apply within the main scope
+ */
private VisibilityEnum main;
+
+ /**
+ * The visibility to apply outside the main scope
+ */
private VisibilityEnum other;
public SubmissionVisibilityRest(VisibilityEnum main, VisibilityEnum other) {
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java
index c8d5bcf3f4..fbad9069a3 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/VisibilityEnum.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.model;
/**
* The possible restriction options for the visibility attributes in the
- * SubmissionPanel resource and InputFormPage resource
+ * SubmissionPanel resource and SubmissionForm's fields
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java
index 87635c548c..dda7e76922 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/model/hateoas/DSpaceResource.java
@@ -129,7 +129,9 @@ public abstract class DSpaceResource extends HAL
page.map(resourceRepository::wrapResource),
linkedRMList, name);
} else {
- wrapObject = null;
+ PageImpl page = new PageImpl(linkedRMList);
+ wrapObject = new EmbeddedPage(linkToSubResource.getHref(), page,
+ linkedRMList, name);
}
}
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java
index e2a352668d..7ebd5a6135 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/SearchFilter.java
@@ -7,7 +7,7 @@
*/
package org.dspace.app.rest.parameter;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
/**
* Custom request parameter used in the Discovery search REST endpoint.
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java
index 20b30750f8..7607e7c19c 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/parameter/resolver/SearchFilterResolver.java
@@ -12,7 +12,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.parameter.SearchFilter;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java
index 9003c67b1d..e7f3f2f017 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/AuthorityEntryLinkRepository.java
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.model.AuthorityEntryRest;
import org.dspace.app.rest.model.AuthorityRest;
import org.dspace.app.rest.model.hateoas.AuthorityEntryResource;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java
index 16c4796af4..dc20cd945f 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/CommunityRestRepository.java
@@ -7,16 +7,24 @@
*/
package org.dspace.app.rest.repository;
+import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.dspace.app.rest.Parameter;
import org.dspace.app.rest.SearchRestMethod;
import org.dspace.app.rest.converter.CommunityConverter;
+import org.dspace.app.rest.exception.UnprocessableEntityException;
import org.dspace.app.rest.model.CommunityRest;
+import org.dspace.app.rest.model.MetadataEntryRest;
import org.dspace.app.rest.model.hateoas.CommunityResource;
+import org.dspace.authorize.AuthorizeException;
import org.dspace.content.Community;
import org.dspace.content.service.CommunityService;
import org.dspace.core.Context;
@@ -29,7 +37,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
/**
- * This is the repository responsible to manage Item Rest object
+ * This is the repository responsible to manage Community Rest object
*
* @author Andrea Bollini (andrea.bollini at 4science.it)
*/
@@ -47,6 +55,38 @@ public class CommunityRestRepository extends DSpaceRestRepository {
- private static final Logger log = Logger.getLogger(DSpaceRestRepository.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceRestRepository.class);
//Trick to make inner-calls to ourselves that are checked by Spring security
//See:
@@ -66,48 +68,94 @@ public abstract class DSpaceRestRepository S save(Context context, S entity) throws AuthorizeException,
RepositoryMethodNotImplementedException {
throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", "");
}
@Override
+ /**
+ * Method to implement to support bulk update of a REST objects via a PUT request
+ */
public Iterable save(Iterable entities) {
// TODO Auto-generated method stub
return null;
}
@Override
+ /**
+ * Return a specific REST object
+ *
+ * @return the REST object identified by its ID
+ */
public T findOne(ID id) {
Context context = obtainContext();
return thisRepository.findOne(context, id);
}
+ /**
+ * Method to implement to support retrieval of a specific REST object instance
+ *
+ * @param context
+ * the dspace context
+ * @param id
+ * the rest object id
+ * @return the REST object identified by its ID
+ */
public abstract T findOne(Context context, ID id);
@Override
+ /**
+ * Return true if an object exist for the specified ID. The default implementation is inefficient as it retrieves
+ * the actual object to state that it exists. This could lead to retrieve and inizialize lot of linked objects
+ */
public boolean exists(ID id) {
- // TODO Auto-generated method stub
- return false;
+ return findOne(id) != null;
}
@Override
- public Iterable findAll() {
+ /**
+ * This method cannot be implemented we required all the find method to be paginated
+ */
+ public final Iterable findAll() {
throw new RuntimeException("findAll MUST be paginated");
}
@Override
+ /**
+ * This method could be implemented to support bulk retrieval of specific object by their IDs. Unfortunately, this
+ * method doesn't allow pagination and it could be misused to retrieve thousand objects at once
+ */
public Iterable findAll(Iterable ids) {
throw new RuntimeException("findAll MUST be paginated");
}
@Override
+ /**
+ * This method return the number of object instances of the type managed by the repository class available in the
+ * system
+ */
public long count() {
- // TODO Auto-generated method stub
+ // FIXME DS-4038
return 0;
}
@Override
+ /**
+ * Delete the object identified by its ID
+ */
public void delete(ID id) {
Context context = obtainContext();
try {
@@ -120,44 +168,96 @@ public abstract class DSpaceRestRepository entities) {
// TODO Auto-generated method stub
}
@Override
+ /**
+ * Method to implement to support bulk delete of ALL entity instances
+ */
public void deleteAll() {
// TODO Auto-generated method stub
}
@Override
- public Iterable findAll(Sort sort) {
+ /**
+ * This method cannot be implemented we required all the find method to be paginated
+ */
+ public final Iterable findAll(Sort sort) {
throw new RuntimeException("findAll MUST be paginated");
}
@Override
+ /**
+ * Provide access to the manage entity instances in a paginated way
+ */
public Page findAll(Pageable pageable) {
Context context = obtainContext();
return thisRepository.findAll(context, pageable);
}
+ /**
+ * Method to implement to support scroll of entity instances from the collection resource endpoin
+ *
+ * @param context
+ * the dspace context
+ * @param pageable
+ * object embedding the requested pagination info
+ * @return
+ */
public abstract Page findAll(Context context, Pageable pageable);
+ /**
+ * The REST model supported by the repository
+ */
public abstract Class getDomainClass();
+ /**
+ * Wrap the REST model in a REST HAL Resource
+ *
+ * @param model
+ * the rest model instance
+ * @param rels
+ * the HAL links
+ * @return the REST Resource
+ */
public abstract DSpaceResource wrapResource(T model, String... rels);
+ /**
+ * Create and return a new instance. Data are usually retrieved from the thread bound http request
+ *
+ * @return the created REST object
+ */
public T createAndReturn() {
Context context = null;
try {
@@ -172,15 +272,58 @@ public abstract class DSpaceRestRepository U upload(HttpServletRequest request, String apiCategory, String model,
- ID id, String extraField, MultipartFile file) throws Exception {
+ /**
+ * Method to implement to attach/upload a file to a specific REST object
+ *
+ * @param request
+ * the http request
+ * @param apiCategory
+ * @param model
+ * @param id
+ * the ID of the target REST object
+ * @param file
+ * the uploaded file
+ * @return the new state of the REST object
+ * @throws Exception
+ */
+ public T upload(HttpServletRequest request, String apiCategory, String model,
+ ID id, MultipartFile file) throws Exception {
throw new RuntimeException("No implementation found; Method not allowed!");
}
+ /**
+ * Apply a partial update to the REST object via JSON Patch
+ *
+ * @param request
+ * the http request
+ * @param apiCategory
+ * @param model
+ * @param id
+ * the ID of the target REST object
+ * @param patch
+ * the JSON Patch (https://tools.ietf.org/html/rfc6902) operation
+ * @return
+ * @throws HttpRequestMethodNotSupportedException
+ * @throws UnprocessableEntityException
+ * @throws PatchBadRequestException
+ */
public T patch(HttpServletRequest request, String apiCategory, String model, ID id, Patch patch)
throws HttpRequestMethodNotSupportedException, UnprocessableEntityException, PatchBadRequestException {
Context context = obtainContext();
@@ -195,10 +338,73 @@ public abstract class DSpaceRestRepository upload(HttpServletRequest request, MultipartFile uploadfile)
+ throws SQLException, FileNotFoundException, IOException, AuthorizeException {
+ Context context = obtainContext();
+ Iterable entity = upload(context, request, uploadfile);
+ context.commit();
+ return entity;
+ }
+
+ /**
+ * Method to implement to support bulk creation of objects from a file
+ *
+ * @param request
+ * the http request
+ * @param uploadfile
+ * the file to process
+ * @return the created objects
+ * @throws SQLException
+ * @throws FileNotFoundException
+ * @throws IOException
+ * @throws AuthorizeException
+ * @throws RepositoryMethodNotImplementedException
+ */
+ protected Iterable upload(Context context, HttpServletRequest request,
+ MultipartFile uploadfile)
+ throws SQLException, FileNotFoundException, IOException, AuthorizeException {
+ throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", "");
+ }
+
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java
index 4ccfc51ae6..ea2f70c469 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java
@@ -9,7 +9,9 @@ package org.dspace.app.rest.repository;
import java.util.List;
-import org.apache.log4j.Logger;
+import javax.ws.rs.BadRequestException;
+
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.converter.DiscoverConfigurationConverter;
import org.dspace.app.rest.converter.DiscoverFacetConfigurationConverter;
import org.dspace.app.rest.converter.DiscoverFacetResultsConverter;
@@ -46,7 +48,7 @@ import org.springframework.stereotype.Component;
@Component(SearchResultsRest.CATEGORY + "." + SearchResultsRest.NAME)
public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
- private static final Logger log = Logger.getLogger(ScopeResolver.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class);
@Autowired
private DiscoveryConfigurationService searchConfigurationService;
@@ -91,7 +93,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
public SearchResultsRest getSearchObjects(final String query, final String dsoType, final String dsoScope,
final String configurationName,
final List searchFilters, final Pageable page)
- throws InvalidRequestException {
+ throws InvalidRequestException, BadRequestException {
Context context = obtainContext();
DSpaceObject scopeObject = scopeResolver.resolveScope(context, dsoScope);
@@ -108,6 +110,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository {
} catch (SearchServiceException e) {
log.error("Error while searching with Discovery", e);
+ throw new IllegalArgumentException("Error while searching with Discovery: " + e.getMessage());
}
return discoverResultConverter
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java
index 325965458b..721e4c6313 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/EPersonRestRepository.java
@@ -10,20 +10,25 @@ package org.dspace.app.rest.repository;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
+import java.util.Objects;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.Parameter;
import org.dspace.app.rest.SearchRestMethod;
import org.dspace.app.rest.converter.EPersonConverter;
+import org.dspace.app.rest.exception.PatchBadRequestException;
import org.dspace.app.rest.exception.RESTAuthorizationException;
import org.dspace.app.rest.exception.UnprocessableEntityException;
import org.dspace.app.rest.model.EPersonRest;
import org.dspace.app.rest.model.MetadataEntryRest;
import org.dspace.app.rest.model.hateoas.EPersonResource;
+import org.dspace.app.rest.model.patch.Operation;
+import org.dspace.app.rest.model.patch.Patch;
+import org.dspace.app.rest.repository.patch.EPersonPatch;
import org.dspace.authorize.AuthorizeException;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.core.Context;
@@ -34,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
+import org.springframework.data.rest.webmvc.ResourceNotFoundException;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
@@ -54,6 +60,9 @@ public class EPersonRestRepository extends DSpaceRestRepository operations = patch.getOperations();
+ EPersonRest ePersonRest = findOne(context, uuid);
+ EPersonRest patchedModel = (EPersonRest) epersonPatch.patch(ePersonRest, operations);
+ updatePatchedValues(context, patchedModel, eperson);
+
+ } catch (SQLException e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Applies changes in the rest model.
+ * @param context
+ * @param ePersonRest the updated eperson rest
+ * @param ePerson the eperson content object
+ * @throws SQLException
+ * @throws AuthorizeException
+ */
+ private void updatePatchedValues(Context context, EPersonRest ePersonRest, EPerson ePerson)
+ throws SQLException, AuthorizeException {
+
+ if (ePersonRest.getPassword() != null) {
+ es.setPassword(ePerson, ePersonRest.getPassword());
+ }
+ if (ePersonRest.isRequireCertificate() != ePerson.getRequireCertificate()) {
+ ePerson.setRequireCertificate(ePersonRest.isRequireCertificate());
+ }
+ if (ePersonRest.isCanLogIn() != ePerson.canLogIn()) {
+ ePerson.setCanLogIn(ePersonRest.isCanLogIn());
+ }
+ if (!Objects.equals(ePersonRest.getNetid(), ePerson.getNetid())) {
+ ePerson.setNetid(ePersonRest.getNetid());
+ }
+
+ es.update(context, ePerson);
+
+ }
+
@Override
protected void delete(Context context, UUID id) throws AuthorizeException {
EPerson eperson = null;
@@ -210,4 +269,4 @@ public class EPersonRestRepository extends DSpaceRestRepository {
- GroupService gs = EPersonServiceFactory.getInstance().getGroupService();
+ @Autowired
+ GroupService gs;
@Autowired
GroupConverter converter;
+ @Override
+ @PreAuthorize("hasAuthority('ADMIN')")
+ protected GroupRest createAndReturn(Context context)
+ throws AuthorizeException, RepositoryMethodNotImplementedException {
+ HttpServletRequest req = getRequestService().getCurrentRequest().getHttpServletRequest();
+ ObjectMapper mapper = new ObjectMapper();
+ GroupRest groupRest = null;
+
+ try {
+ groupRest = mapper.readValue(req.getInputStream(), GroupRest.class);
+ } catch (IOException excIO) {
+ throw new UnprocessableEntityException("error parsing the body ..." + excIO.getMessage());
+ }
+
+ Group group = null;
+ try {
+ group = gs.create(context);
+ gs.setName(group, groupRest.getName());
+ gs.update(context, group);
+
+ if (groupRest.getMetadata() != null) {
+ for (MetadataEntryRest mer: groupRest.getMetadata()) {
+ String[] metadatakey = mer.getKey().split("\\.");
+ gs.addMetadata(context, group, metadatakey[0], metadatakey[1],
+ metadatakey.length == 3 ? metadatakey[2] : null, mer.getLanguage(), mer.getValue());
+ }
+ }
+ } catch (SQLException excSQL) {
+ throw new RuntimeException(excSQL.getMessage(), excSQL);
+ }
+
+ return converter.convert(group);
+ }
+
@Override
@PreAuthorize("hasPermission(#id, 'GROUP', 'READ')")
public GroupRest findOne(Context context, UUID id) {
@@ -78,4 +120,4 @@ public class GroupRestRepository extends DSpaceRestRepository {
return new GroupResource(eperson, utils, rels);
}
-}
\ No newline at end of file
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java
index 05af4a4289..f8d19a6ce6 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/ItemRestRepository.java
@@ -21,6 +21,7 @@ import org.dspace.app.rest.exception.PatchBadRequestException;
import org.dspace.app.rest.exception.UnprocessableEntityException;
import org.dspace.app.rest.model.ItemRest;
import org.dspace.app.rest.model.hateoas.ItemResource;
+import org.dspace.app.rest.model.patch.Operation;
import org.dspace.app.rest.model.patch.Patch;
import org.dspace.app.rest.repository.patch.ItemPatch;
import org.dspace.authorize.AuthorizeException;
@@ -52,9 +53,6 @@ public class ItemRestRepository extends DSpaceRestRepository {
@Autowired
ItemConverter converter;
- /**
- * Proposed helper class for Item patches.
- */
@Autowired
ItemPatch itemPatch;
@@ -99,16 +97,51 @@ public class ItemRestRepository extends DSpaceRestRepository {
}
@Override
- public void patch(Context context, HttpServletRequest request, String apiCategory, String model, UUID uuid, Patch
- patch)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException,
- ResourceNotFoundException {
+ public void patch(Context context, HttpServletRequest request, String apiCategory, String model, UUID uuid,
+ Patch patch)
+ throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException,
+ ResourceNotFoundException {
- ItemRest restModel = findOne(context, uuid);
- if (restModel == null) {
+ Item item = is.find(context, uuid);
+
+ if (item == null) {
throw new ResourceNotFoundException(apiCategory + "." + model + " with id: " + uuid + " not found");
}
- itemPatch.patch(restModel, context, patch);
+
+ List operations = patch.getOperations();
+ ItemRest itemRest = findOne(uuid);
+
+ ItemRest patchedModel = (ItemRest) itemPatch.patch(itemRest, operations);
+ updatePatchedValues(context, patchedModel, item);
+ }
+
+ /**
+ * Persists changes to the rest model.
+ * @param context
+ * @param itemRest the updated item rest resource
+ * @param item the item content object
+ * @throws SQLException
+ * @throws AuthorizeException
+ */
+ private void updatePatchedValues(Context context, ItemRest itemRest, Item item)
+ throws SQLException, AuthorizeException {
+
+ try {
+ if (itemRest.getWithdrawn() != item.isWithdrawn()) {
+ if (itemRest.getWithdrawn()) {
+ is.withdraw(context, item);
+ } else {
+ is.reinstate(context, item);
+ }
+ }
+ if (itemRest.getDiscoverable() != item.isDiscoverable()) {
+ item.setDiscoverable(itemRest.getDiscoverable());
+ is.update(context, item);
+ }
+ } catch (SQLException | AuthorizeException e) {
+ e.printStackTrace();
+ throw e;
+ }
}
@Override
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/LicenseRestLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/LicenseRestLinkRepository.java
index 0ce1494c7d..7ec1700361 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/LicenseRestLinkRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/LicenseRestLinkRepository.java
@@ -10,7 +10,7 @@ package org.dspace.app.rest.repository;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.model.CollectionRest;
import org.dspace.app.rest.model.LicenseRest;
import org.dspace.app.rest.model.hateoas.HALResource;
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java
index e81a530b5e..54c678c18e 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/RootRestRepository.java
@@ -21,7 +21,7 @@ public class RootRestRepository {
@Autowired
RootConverter rootConverter;
- public RootRest getRoot(String restUrl) {
- return rootConverter.convert(restUrl);
+ public RootRest getRoot() {
+ return rootConverter.convert();
}
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java
index 0478cd7974..69fb7a64fc 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/SubmissionUploadRestRepository.java
@@ -11,7 +11,7 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
-import org.apache.log4j.Logger;
+import org.apache.logging.log4j.Logger;
import org.dspace.app.rest.model.AccessConditionOptionRest;
import org.dspace.app.rest.model.SubmissionUploadRest;
import org.dspace.app.rest.model.hateoas.SubmissionUploadResource;
@@ -43,7 +43,8 @@ import org.springframework.stereotype.Component;
public class SubmissionUploadRestRepository extends DSpaceRestRepository
implements LinkRestRepository {
- private static final Logger log = Logger.getLogger(SubmissionUploadRestRepository.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager
+ .getLogger(SubmissionUploadRestRepository.class);
private SubmissionConfigReader submissionConfigReader;
@@ -141,4 +142,4 @@ public class SubmissionUploadRestRepository extends DSpaceRestRepository {
public static final String OPERATION_PATH_SECTIONS = "sections";
- private static final Logger log = Logger.getLogger(WorkspaceItemRestRepository.class);
+ private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemRestRepository.class);
@Autowired
WorkspaceItemService wis;
@@ -87,6 +100,12 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository bundles = itemService.getBundles(item, Constants.CONTENT_BUNDLE_NAME);
+ WorkspaceItemRest wsi = findOne(id);
+ WorkspaceItem source = wis.find(context, id);
+ List errors = new ArrayList();
+ SubmissionConfig submissionConfig =
+ submissionConfigReader.getSubmissionConfigByName(wsi.getSubmissionDefinition().getName());
+ for (int i = 0; i < submissionConfig.getNumberOfSteps(); i++) {
+ SubmissionStepConfig stepConfig = submissionConfig.getStep(i);
- try {
- InputStream inputStream = new BufferedInputStream(file.getInputStream());
- if (bundles.size() < 1) {
- // set bundle's name to ORIGINAL
- source = itemService.createSingleBitstream(context, inputStream, item, Constants.CONTENT_BUNDLE_NAME);
- } else {
- // we have a bundle already, just add bitstream
- source = bitstreamService.create(context, bundles.get(0), inputStream);
+ /*
+ * First, load the step processing class (using the current
+ * class loader)
+ */
+ ClassLoader loader = this.getClass().getClassLoader();
+ Class stepClass;
+ try {
+ stepClass = loader.loadClass(stepConfig.getProcessingClassName());
+
+ Object stepInstance = stepClass.newInstance();
+ if (UploadableStep.class.isAssignableFrom(stepClass)) {
+ UploadableStep uploadableStep = (UploadableStep) stepInstance;
+ uploadableStep.doPreProcessing(context, source);
+ ErrorRest err =
+ uploadableStep.upload(context, submissionService, stepConfig, source, file);
+ uploadableStep.doPostProcessing(context, source);
+ if (err != null) {
+ errors.add(err);
+ }
+ }
+
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
}
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- result = new UploadBitstreamRest();
- result.setMessage(e.getMessage());
- result.setStatus(false);
- return result;
+
+ }
+ wsi = converter.convert(source);
+
+ if (errors.isEmpty()) {
+ wsi.setStatus(true);
+ } else {
+ wsi.setStatus(false);
+ wsi.getErrors().addAll(errors);
}
- source.setName(context, file.getOriginalFilename());
- // TODO how retrieve this information?
- source.setSource(context, extraField);
-
- // Identify the format
- bf = bitstreamFormatService.guessFormat(context, source);
- source.setFormat(context, bf);
-
- // Update to DB
- bitstreamService.update(context, source);
- itemService.update(context, item);
context.commit();
-
- result = submissionService.buildUploadBitstream(configurationService, source);
- result.setStatus(true);
- return result;
+ return wsi;
}
//TODO @PreAuthorize("hasPermission(#id, 'WORKSPACEITEM', 'WRITE')")
@@ -290,20 +312,21 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository!");
+ throw new PatchBadRequestException(
+ "The submission step class specified by '" + stepConfig.getProcessingClassName() +
+ "' does not extend the class org.dspace.submit.AbstractProcessingStep!" +
+ " Therefore it cannot be used by the Configurable Submission as the !");
}
} catch (Exception e) {
log.error(e.getMessage(), e);
+ throw new PatchException("Error processing the patch request", e);
}
}
}
@@ -316,8 +339,161 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository upload(Context context, HttpServletRequest request,
+ MultipartFile uploadfile)
+ throws SQLException, FileNotFoundException, IOException, AuthorizeException {
+ File file = Utils.getFile(uploadfile, "upload-loader", "filedataloader");
+ List results = new ArrayList<>();
+
+ try {
+ String uuid = request.getParameter("collection");
+ if (StringUtils.isBlank(uuid)) {
+ uuid = configurationService.getProperty("submission.default.collection");
+ }
+
+ Collection collection = null;
+ if (StringUtils.isNotBlank(uuid)) {
+ collection = collectionService.find(context, UUID.fromString(uuid));
+ } else {
+ collection = collectionService.findAuthorizedOptimized(context, Constants.ADD).get(0);
+ }
+
+ SubmissionConfig submissionConfig =
+ submissionConfigReader.getSubmissionConfigByCollection(collection.getHandle());
+
+
+ List tmpResult = new ArrayList();
+
+ TransformationEngine transformationEngine1 = submissionLookupService.getPhase1TransformationEngine();
+ TransformationSpec spec = new TransformationSpec();
+ // FIXME this is mostly due to the need to test. The BTE framework has an assert statement that check if the
+ // number of found record is less than the requested and treat 0 as is, instead, the implementation assume
+ // 0=unlimited this lead to test failure.
+ // It is unclear if BTE really respect values other than 0/MAX allowing us to put a protection against heavy
+ // load
+ spec.setNumberOfRecords(Integer.MAX_VALUE);
+ if (transformationEngine1 != null) {
+ MultipleSubmissionLookupDataLoader dataLoader =
+ (MultipleSubmissionLookupDataLoader) transformationEngine1.getDataLoader();
+
+ List fileDataLoaders = submissionLookupService.getFileProviders();
+ for (String fileDataLoader : fileDataLoaders) {
+ dataLoader.setFile(file.getAbsolutePath(), fileDataLoader);
+
+ try {
+ SubmissionLookupOutputGenerator outputGenerator =
+ (SubmissionLookupOutputGenerator) transformationEngine1.getOutputGenerator();
+ outputGenerator.setDtoList(new ArrayList());
+ log.debug("BTE transformation is about to start!");
+ transformationEngine1.transform(spec);
+ log.debug("BTE transformation finished!");
+ tmpResult.addAll(outputGenerator.getDtoList());
+ if (!tmpResult.isEmpty()) {
+ //exit with the results founded on the first data provided
+ break;
+ }
+ } catch (BadTransformationSpec e1) {
+ log.error(e1.getMessage(), e1);
+ } catch (MalformedSourceException e1) {
+ log.error(e1.getMessage(), e1);
+ }
+ }
+ }
+
+ List result = null;
+
+ //try to ingest workspaceitems
+ if (!tmpResult.isEmpty()) {
+ TransformationEngine transformationEngine2 = submissionLookupService.getPhase2TransformationEngine();
+ if (transformationEngine2 != null) {
+ SubmissionItemDataLoader dataLoader =
+ (SubmissionItemDataLoader) transformationEngine2.getDataLoader();
+ dataLoader.setDtoList(tmpResult);
+ // dataLoader.setProviders()
+
+ DSpaceWorkspaceItemOutputGenerator outputGenerator =
+ (DSpaceWorkspaceItemOutputGenerator) transformationEngine2.getOutputGenerator();
+ outputGenerator.setCollection(collection);
+ outputGenerator.setContext(context);
+ outputGenerator.setFormName(submissionConfig.getSubmissionName());
+ outputGenerator.setDto(tmpResult.get(0));
+
+ try {
+ transformationEngine2.transform(spec);
+ result = outputGenerator.getWitems();
+ } catch (BadTransformationSpec e1) {
+ e1.printStackTrace();
+ } catch (MalformedSourceException e1) {
+ e1.printStackTrace();
+ }
+ }
+ }
+
+ //we have to create the workspaceitem to push the file also if nothing found before
+ if (result == null) {
+ WorkspaceItem source =
+ submissionService.createWorkspaceItem(context, getRequestService().getCurrentRequest());
+ result = new ArrayList<>();
+ result.add(source);
+ }
+
+ //perform upload of bitstream if there is exact one result and convert workspaceitem to entity rest
+ if (result != null && !result.isEmpty()) {
+ for (WorkspaceItem wi : result) {
+
+ List errors = new ArrayList();
+
+ //load bitstream into bundle ORIGINAL only if there is one result (approximately this is the
+ // right behaviour for pdf file but not for other bibliographic format e.g. bibtex)
+ if (result.size() == 1) {
+
+ for (int i = 0; i < submissionConfig.getNumberOfSteps(); i++) {
+ SubmissionStepConfig stepConfig = submissionConfig.getStep(i);
+
+ ClassLoader loader = this.getClass().getClassLoader();
+ Class stepClass;
+ try {
+ stepClass = loader.loadClass(stepConfig.getProcessingClassName());
+
+ Object stepInstance = stepClass.newInstance();
+ if (UploadableStep.class.isAssignableFrom(stepClass)) {
+ UploadableStep uploadableStep = (UploadableStep) stepInstance;
+ ErrorRest err = uploadableStep.upload(context, submissionService, stepConfig, wi,
+ uploadfile);
+ if (err != null) {
+ errors.add(err);
+ }
+ }
+
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ }
+ }
+ WorkspaceItemRest wsi = converter.convert(wi);
+ if (result.size() == 1) {
+ if (errors.isEmpty()) {
+ wsi.setStatus(true);
+ } else {
+ wsi.setStatus(false);
+ wsi.getErrors().addAll(errors);
+ }
+ }
+ results.add(wsi);
+ }
+ }
+ } finally {
+ file.delete();
+ }
+ return results;
+ }
+
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java
index 2ad759d611..4033718941 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/AbstractResourcePatch.java
@@ -7,16 +7,12 @@
*/
package org.dspace.app.rest.repository.patch;
-import java.sql.SQLException;
import java.util.List;
import org.dspace.app.rest.exception.PatchBadRequestException;
import org.dspace.app.rest.exception.UnprocessableEntityException;
import org.dspace.app.rest.model.RestModel;
import org.dspace.app.rest.model.patch.Operation;
-import org.dspace.app.rest.model.patch.Patch;
-import org.dspace.authorize.AuthorizeException;
-import org.dspace.core.Context;
/**
* The base class for resource PATCH operations.
@@ -26,85 +22,80 @@ import org.dspace.core.Context;
public abstract class AbstractResourcePatch {
/**
- * Handles the patch operations, delegating actions to sub-class implementations. If no sub-class method
- * is provided, the default method throws a UnprocessableEntityException.
+ * Handles the patch operations. Patch implementations are provided by subclasses.
+ * The default methods throw an UnprocessableEntityException.
*
- * @param restModel the REST resource to patch
- * @param context
- * @param patch
+ * @param restModel the rest resource to patch
+ * @param operations list of patch operations
* @throws UnprocessableEntityException
* @throws PatchBadRequestException
- * @throws SQLException
- * @throws AuthorizeException
*/
- public void patch(R restModel, Context context, Patch patch)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
-
- List operations = patch.getOperations();
+ public RestModel patch(R restModel, List operations) {
// Note: the list of possible operations is taken from JsonPatchConverter class. Does not implement
// test https://tools.ietf.org/html/rfc6902#section-4.6
ops: for (Operation op : operations) {
switch (op.getOp()) {
case "add":
- add(restModel, context, op);
+ restModel = add(restModel, op);
continue ops;
case "replace":
- replace(restModel, context, op);
+ restModel = replace(restModel, op);
continue ops;
case "remove":
- remove(restModel, context, op);
+ restModel = remove(restModel, op);
continue ops;
case "copy":
- copy(restModel, context, op);
+ restModel = copy(restModel, op);
continue ops;
case "move":
- move(restModel, context, op);
+ restModel = move(restModel, op);
continue ops;
default:
// JsonPatchConverter should have thrown error before this point.
throw new PatchBadRequestException("Missing or illegal patch operation: " + op.getOp());
}
}
+
+ return restModel;
+
}
// The default patch methods throw an error when no sub-class implementation is provided.
- protected void add(R restModel, Context context, Operation operation)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
+ protected R add(R restModel, Operation operation)
+ throws UnprocessableEntityException, PatchBadRequestException {
throw new UnprocessableEntityException(
- "The add operation is not supported."
+ "The add operation is not supported."
);
}
- protected void replace(R restModel, Context context, Operation operation)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
- // The replace operation is functionally identical to a "remove" operation for
- // a value, followed immediately by an "add" operation at the same
- // location with the replacement value. https://tools.ietf.org/html/rfc6902#section-4.3
- remove(restModel, context, operation);
- add(restModel, context, operation);
- }
-
- protected void remove(R restModel, Context context, Operation operation)
-
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
+ protected R replace(R restModel, Operation operation)
+ throws UnprocessableEntityException, PatchBadRequestException {
throw new UnprocessableEntityException(
- "The remove operation is not supported."
+ "The replace operation is not supported."
);
}
- protected void copy(R restModel, Context context, Operation operation)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
+ protected R remove(R restModel, Operation operation)
+
+ throws UnprocessableEntityException, PatchBadRequestException {
throw new UnprocessableEntityException(
- "The copy operation is not supported."
+ "The remove operation is not supported."
);
}
- protected void move(R restModel, Context context, Operation operation)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
+ protected R copy(R restModel, Operation operation)
+ throws UnprocessableEntityException, PatchBadRequestException {
throw new UnprocessableEntityException(
- "The move operation is not supported."
+ "The copy operation is not supported."
);
}
-}
+ protected R move(R restModel, Operation operation)
+ throws UnprocessableEntityException, PatchBadRequestException {
+ throw new UnprocessableEntityException(
+ "The move operation is not supported."
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java
new file mode 100644
index 0000000000..2204c98cc8
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/EPersonPatch.java
@@ -0,0 +1,43 @@
+/**
+ * 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.rest.repository.patch;
+
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.exception.UnprocessableEntityException;
+import org.dspace.app.rest.model.EPersonRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.dspace.app.rest.repository.patch.factories.EPersonOperationFactory;
+import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Provides patch operations for eperson updates.
+ */
+@Component
+public class EPersonPatch extends AbstractResourcePatch {
+
+ @Autowired
+ EPersonOperationFactory patchFactory;
+
+ /**
+ * Performs the replace operation.
+ * @param eperson the eperson rest representation
+ * @param operation the replace operation
+ * @throws UnprocessableEntityException
+ * @throws PatchBadRequestException
+ */
+ protected EPersonRest replace(EPersonRest eperson, Operation operation) {
+
+ ResourcePatchOperation patchOperation =
+ patchFactory.getReplaceOperationForPath(operation.getPath());
+
+ return patchOperation.perform(eperson, operation);
+
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java
index 51a4d3a924..d68edbf444 100644
--- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/ItemPatch.java
@@ -7,137 +7,37 @@
*/
package org.dspace.app.rest.repository.patch;
-import java.sql.SQLException;
-import java.util.UUID;
-
-import org.apache.log4j.Logger;
import org.dspace.app.rest.exception.PatchBadRequestException;
import org.dspace.app.rest.exception.UnprocessableEntityException;
import org.dspace.app.rest.model.ItemRest;
import org.dspace.app.rest.model.patch.Operation;
-import org.dspace.authorize.AuthorizeException;
-import org.dspace.content.Item;
-import org.dspace.content.service.ItemService;
-import org.dspace.core.Context;
+import org.dspace.app.rest.repository.patch.factories.ItemOperationFactory;
+import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
- * This is the implementation for Item resource patches.
- *
- * @author Michael Spalti
+ * Provides PATCH operations for item updates.
*/
@Component
public class ItemPatch extends AbstractResourcePatch {
- private static final String OPERATION_PATH_WITHDRAW = "/withdrawn";
-
- private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable";
-
- private static final Logger log = Logger.getLogger(ItemPatch.class);
-
@Autowired
- ItemService is;
+ ItemOperationFactory patchFactory;
/**
- * Implementation of the PATCH replace operation.
- *
- * @param restModel
- * @param context
- * @param operation
+ * Peforms the replace operation.
+ * @param item the rest representation of the item
+ * @param operation the replace operation
* @throws UnprocessableEntityException
* @throws PatchBadRequestException
- * @throws SQLException
- * @throws AuthorizeException
*/
- @Override
- protected void replace(ItemRest restModel, Context context, Operation operation)
- throws UnprocessableEntityException, PatchBadRequestException, SQLException, AuthorizeException {
+ protected ItemRest replace(ItemRest item, Operation operation) {
- switch (operation.getPath()) {
- case OPERATION_PATH_WITHDRAW:
- withdraw(restModel, context, (Boolean) operation.getValue());
- break;
- case OPERATION_PATH_DISCOVERABLE:
- discoverable(restModel, context, (Boolean) operation.getValue());
- break;
- default:
- throw new UnprocessableEntityException(
- "Unrecognized patch operation path: " + operation.getPath()
- );
- }
- }
+ ResourcePatchOperation patchOperation =
+ patchFactory.getReplaceOperationForPath(operation.getPath());
- /**
- * Withdraws or reinstates the item based on boolean value provided in the patch request.
- *
- * @param restModel
- * @param context
- * @param withdrawItem
- * @throws PatchBadRequestException
- * @throws SQLException
- * @throws AuthorizeException
- */
- private void withdraw(ItemRest restModel, Context context, Boolean withdrawItem)
- throws PatchBadRequestException, SQLException, AuthorizeException {
-
- try {
- if (withdrawItem == null) {
- throw new PatchBadRequestException("Boolean value not provided for withdrawal operation.");
- }
- if (withdrawItem) {
- // Item is not withdrawn but is also NOT archived. Is this a possible situation?
- if (!restModel.getWithdrawn() && !restModel.getInArchive()) {
- throw new UnprocessableEntityException("Cannot withdraw item because it is not archived.");
- }
- // Item is already withdrawn. No-op, 200 response.
- // (The operation is not idempotent since it results in a provenance note in the record.)
- if (restModel.getWithdrawn()) {
- return;
- }
- Item item = is.find(context, UUID.fromString(restModel.getUuid()));
- is.withdraw(context, item);
- } else {
- // No need to reinstate item if it has not previously been not withdrawn.
- // No-op, 200 response. (The operation is not idempotent since it results
- // in a provenance note in the record.)
- if (!restModel.getWithdrawn()) {
- return;
- }
- Item item = is.find(context, UUID.fromString(restModel.getUuid()));
- is.reinstate(context, item);
- }
-
- } catch (SQLException | AuthorizeException e) {
- log.error(e.getMessage(), e);
- throw e;
- }
- }
-
- /**
- * Sets discoverable field on the item.
- *
- * @param restModel
- * @param context
- * @param isDiscoverable
- * @throws SQLException
- * @throws AuthorizeException
- */
- private void discoverable(ItemRest restModel, Context context, Boolean isDiscoverable)
- throws SQLException, AuthorizeException {
-
- if (isDiscoverable == null) {
- throw new PatchBadRequestException("Boolean value not provided for discoverable operation.");
- }
- try {
- Item item = is.find(context, UUID.fromString(restModel.getUuid()));
- item.setDiscoverable(isDiscoverable);
- is.update(context, item);
- } catch (SQLException | AuthorizeException e) {
- log.error(e.getMessage(), e);
- throw e;
- }
+ return patchOperation.perform(item, operation);
}
-
}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java
new file mode 100644
index 0000000000..27cee32ee4
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/EPersonOperationFactory.java
@@ -0,0 +1,68 @@
+/**
+ * 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.rest.repository.patch.factories;
+
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.model.EPersonRest;
+import org.dspace.app.rest.repository.patch.factories.impl.EPersonCertificateReplaceOperation;
+import org.dspace.app.rest.repository.patch.factories.impl.EPersonLoginReplaceOperation;
+import org.dspace.app.rest.repository.patch.factories.impl.EPersonNetidReplaceOperation;
+import org.dspace.app.rest.repository.patch.factories.impl.EPersonPasswordReplaceOperation;
+import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Provides factory methods for obtaining instances of eperson patch operations.
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class EPersonOperationFactory {
+
+ @Autowired
+ EPersonPasswordReplaceOperation passwordReplaceOperation;
+
+ @Autowired
+ EPersonLoginReplaceOperation loginReplaceOperation;
+
+ @Autowired
+ EPersonCertificateReplaceOperation certificateReplaceOperation;
+
+ @Autowired
+ EPersonNetidReplaceOperation netidReplaceOperation;
+
+ private static final String OPERATION_PASSWORD_CHANGE = "/password";
+ private static final String OPERATION_CAN_LOGIN = "/canLogin";
+ private static final String OPERATION_REQUIRE_CERTIFICATE = "/certificate";
+ private static final String OPERATION_SET_NETID = "/netid";
+
+ /**
+ * Returns the patch instance for the replace operation (based on the operation path).
+ *
+ * @param path the operation path
+ * @return the patch operation implementation
+ * @throws PatchBadRequestException
+ */
+ public ResourcePatchOperation getReplaceOperationForPath(String path) {
+
+ switch (path) {
+ case OPERATION_PASSWORD_CHANGE:
+ return passwordReplaceOperation;
+ case OPERATION_CAN_LOGIN:
+ return loginReplaceOperation;
+ case OPERATION_REQUIRE_CERTIFICATE:
+ return certificateReplaceOperation;
+ case OPERATION_SET_NETID:
+ return netidReplaceOperation;
+ default:
+ throw new PatchBadRequestException("Missing patch operation for: " + path);
+ }
+ }
+
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java
new file mode 100644
index 0000000000..3360e85036
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/ItemOperationFactory.java
@@ -0,0 +1,53 @@
+/**
+ * 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.rest.repository.patch.factories;
+
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.model.ItemRest;
+import org.dspace.app.rest.repository.patch.factories.impl.ItemDiscoverableReplaceOperation;
+import org.dspace.app.rest.repository.patch.factories.impl.ItemWithdrawReplaceOperation;
+import org.dspace.app.rest.repository.patch.factories.impl.ResourcePatchOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Provides factory methods for obtaining instances of item patch operations.
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class ItemOperationFactory {
+
+ @Autowired
+ ItemDiscoverableReplaceOperation itemDiscoverableReplaceOperation;
+
+ @Autowired
+ ItemWithdrawReplaceOperation itemWithdrawReplaceOperation;
+
+ private static final String OPERATION_PATH_WITHDRAW = "/withdrawn";
+ private static final String OPERATION_PATH_DISCOVERABLE = "/discoverable";
+
+ /**
+ * Returns the patch instance for the replace operation (based on the operation path).
+ *
+ * @param path the operation path
+ * @return the patch operation implementation
+ * @throws PatchBadRequestException
+ */
+ public ResourcePatchOperation getReplaceOperationForPath(String path) {
+
+ switch (path) {
+ case OPERATION_PATH_DISCOVERABLE:
+ return itemDiscoverableReplaceOperation;
+ case OPERATION_PATH_WITHDRAW:
+ return itemWithdrawReplaceOperation;
+ default:
+ throw new PatchBadRequestException("Missing patch operation for: " + path);
+ }
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java
new file mode 100644
index 0000000000..8f75a1fd8c
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonCertificateReplaceOperation.java
@@ -0,0 +1,58 @@
+/**
+ * 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.rest.repository.patch.factories.impl;
+
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.model.EPersonRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.springframework.stereotype.Component;
+
+/**
+ * Implementation for EPerson requires certificate patches.
+ *
+ * Example:
+ * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H "
+ * Content-Type: application/json" -d '[{ "op": "replace", "path": "
+ * /certificate", "value": true|false]'
+ *
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class EPersonCertificateReplaceOperation extends ReplacePatchOperation
+ implements ResourcePatchOperation {
+
+ @Override
+ public EPersonRest replace(EPersonRest eperson, Operation operation) {
+
+ Boolean requireCert = getBooleanOperationValue(operation.getValue());
+ eperson.setRequireCertificate(requireCert);
+ return eperson;
+
+ }
+
+ @Override
+ void checkModelForExistingValue(EPersonRest resource) {
+ // TODO: many (all?) boolean values on the rest model should never be null.
+ // So perhaps the error to throw in this case is different...IllegalStateException?
+ // Or perhaps do nothing (no check is required).
+ if ((Object) resource.isRequireCertificate() == null) {
+ throw new PatchBadRequestException("Attempting to replace a non-existent value.");
+ }
+ }
+
+ @Override
+ protected Class getArrayClassForEvaluation() {
+ return Boolean[].class;
+ }
+
+ @Override
+ protected Class getClassForEvaluation() {
+ return Boolean.class;
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java
new file mode 100644
index 0000000000..d8e5e90c02
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonLoginReplaceOperation.java
@@ -0,0 +1,54 @@
+/**
+ * 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.rest.repository.patch.factories.impl;
+
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.model.EPersonRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.springframework.stereotype.Component;
+
+/**
+ * Implementation for EPerson canLogin patches.
+ *
+ * Example:
+ * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H "
+ * Content-Type: application/json" -d '[{ "op": "replace", "path": "
+ * /canLogin", "value": true|false]'
+ *
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class EPersonLoginReplaceOperation extends ReplacePatchOperation
+ implements ResourcePatchOperation {
+
+ @Override
+ public EPersonRest replace(EPersonRest eperson, Operation operation) {
+
+ Boolean canLogin = getBooleanOperationValue(operation.getValue());
+ eperson.setCanLogIn(canLogin);
+ return eperson;
+ }
+
+ @Override
+ void checkModelForExistingValue(EPersonRest resource) {
+ if ((Object) resource.isCanLogIn() == null) {
+ throw new PatchBadRequestException("Attempting to replace a non-existent value.");
+ }
+ }
+
+ @Override
+ protected Class getArrayClassForEvaluation() {
+ return Boolean[].class;
+ }
+
+ @Override
+ protected Class getClassForEvaluation() {
+ return Boolean.class;
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java
new file mode 100644
index 0000000000..fcfc6e7b7e
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonNetidReplaceOperation.java
@@ -0,0 +1,54 @@
+/**
+ * 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.rest.repository.patch.factories.impl;
+
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.model.EPersonRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.springframework.stereotype.Component;
+
+/**
+ * Implementation for EPerson netid patches.
+ *
+ * Example:
+ * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H "
+ * Content-Type: application/json" -d '[{ "op": "replace", "path": "
+ * /netid", "value": "newNetId"]'
+ *
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class EPersonNetidReplaceOperation extends ReplacePatchOperation
+ implements ResourcePatchOperation {
+
+ @Override
+ EPersonRest replace(EPersonRest eperson, Operation operation) {
+
+ eperson.setNetid((String) operation.getValue());
+ return eperson;
+ }
+
+
+ @Override
+ void checkModelForExistingValue(EPersonRest resource) {
+ if (resource.getNetid() == null) {
+ throw new PatchBadRequestException("Attempting to replace a non-existent value.");
+ }
+ }
+
+ @Override
+ protected Class getArrayClassForEvaluation() {
+ return String[].class;
+ }
+
+ @Override
+ protected Class getClassForEvaluation() {
+ return String.class;
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java
new file mode 100644
index 0000000000..5be3d5e8a4
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/EPersonPasswordReplaceOperation.java
@@ -0,0 +1,55 @@
+/**
+ * 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.rest.repository.patch.factories.impl;
+
+import org.dspace.app.rest.model.EPersonRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.springframework.stereotype.Component;
+
+/**
+ * Implementation for EPerson password patches.
+ *
+ * Example:
+ * curl -X PATCH http://${dspace.url}/api/epersons/eperson/<:id-eperson> -H "
+ * Content-Type: application/json" -d '[{ "op": "replace", "path": "
+ * /password", "value": "newpassword"]'
+ *
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class EPersonPasswordReplaceOperation extends ReplacePatchOperation {
+
+ @Override
+ EPersonRest replace(EPersonRest eperson, Operation operation) {
+
+ eperson.setPassword((String) operation.getValue());
+ return eperson;
+ }
+
+ @Override
+ void checkModelForExistingValue(EPersonRest resource) {
+ /*
+ * FIXME: the password field in eperson rest model is always null because
+ * the value is not set in the rest converter.
+ * We would normally throw an exception here since replace
+ * operations are not allowed on non-existent values, but that
+ * would prevent the password update from ever taking place.
+ */
+ }
+
+ @Override
+ protected Class getArrayClassForEvaluation() {
+ return String[].class;
+ }
+
+ @Override
+ protected Class getClassForEvaluation() {
+ return String.class;
+ }
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java
new file mode 100644
index 0000000000..fca3f31b36
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemDiscoverableReplaceOperation.java
@@ -0,0 +1,57 @@
+/**
+ * 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.rest.repository.patch.factories.impl;
+
+import org.apache.log4j.Logger;
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.model.ItemRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.springframework.stereotype.Component;
+
+/**
+ * This is the implementation for Item resource patches.
+ *
+ * Example:
+ * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H "
+ * Content-Type: application/json" -d '[{ "op": "replace", "path": "
+ * /discoverable", "value": true|false]'
+ *
+ *
+ * @author Michael Spalti
+ */
+@Component
+public class ItemDiscoverableReplaceOperation extends ReplacePatchOperation {
+
+ private static final Logger log = Logger.getLogger(ItemDiscoverableReplaceOperation.class);
+
+
+ @Override
+ public ItemRest replace(ItemRest item, Operation operation) {
+
+ Boolean discoverable = getBooleanOperationValue(operation.getValue());
+ item.setDiscoverable(discoverable);
+ return item;
+
+ }
+
+ @Override
+ void checkModelForExistingValue(ItemRest resource) {
+ if ((Object) resource.getDiscoverable() == null) {
+ throw new PatchBadRequestException("Attempting to replace a non-existent value.");
+ }
+ }
+
+ protected Class getArrayClassForEvaluation() {
+ return Boolean[].class;
+ }
+
+ protected Class getClassForEvaluation() {
+ return Boolean.class;
+ }
+
+}
diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java
new file mode 100644
index 0000000000..9f0b081a89
--- /dev/null
+++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ItemWithdrawReplaceOperation.java
@@ -0,0 +1,81 @@
+/**
+ * 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.rest.repository.patch.factories.impl;
+
+import org.apache.log4j.Logger;
+import org.dspace.app.rest.exception.PatchBadRequestException;
+import org.dspace.app.rest.exception.UnprocessableEntityException;
+import org.dspace.app.rest.model.ItemRest;
+import org.dspace.app.rest.model.patch.Operation;
+import org.springframework.stereotype.Component;
+
+/**
+ * This is the implementation for Item resource patches.
+ *