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/LICENSES_THIRD_PARTY b/LICENSES_THIRD_PARTY index b23938748d..69aa0f74bd 100644 --- a/LICENSES_THIRD_PARTY +++ b/LICENSES_THIRD_PARTY @@ -366,7 +366,6 @@ https://wiki.duraspace.org/display/DSPACE/Code+Contribution+Guidelines * FindBugs-Annotations (com.google.code.findbugs:annotations:3.0.1u2 - http://findbugs.sourceforge.net/) * MaxMind GeoIP Legacy API (com.maxmind.geoip:geoip-api:1.3.0 - https://github.com/maxmind/geoip-api-java) * JHighlight (com.uwyn:jhighlight:1.0 - https://jhighlight.dev.java.net/) - * DSpace TM-Extractors Dependency (org.dspace.dependencies:dspace-tm-extractors:1.0.1 - http://projects.dspace.org/dspace-pom/dspace-tm-extractors) * A Hibernate O/RM Module (org.hibernate:hibernate-core:4.2.21.Final - http://hibernate.org) * A Hibernate O/RM Module (org.hibernate:hibernate-ehcache:4.2.21.Final - http://hibernate.org) * Hibernate Commons Annotations (org.hibernate.common:hibernate-commons-annotations:4.0.2.Final - http://hibernate.org) 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 11cf2a3a5b..16c6e4336b 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -51,6 +51,10 @@ true true + + org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + + @@ -308,6 +312,10 @@ org.hibernate hibernate-ehcache + + org.hibernate + hibernate-jpamodelgen + org.hibernate hibernate-validator-cdi @@ -335,14 +343,28 @@ org.dspace mets - - org.dspace.dependencies - dspace-tm-extractors - org.apache.jena apache-jena-libs pom + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + commons-cli @@ -356,10 +378,6 @@ org.apache.commons commons-collections4 - - org.apache.commons - commons-collections4 - org.apache.commons commons-dbcp2 @@ -374,8 +392,8 @@ commons-io - commons-lang - commons-lang + org.apache.commons + commons-lang3 org.apache.commons @@ -391,7 +409,7 @@ javax.servlet - servlet-api + javax.servlet-api provided @@ -409,8 +427,16 @@ jdom - log4j - log4j + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-1.2-api + + + org.apache.logging.log4j + log4j-core oro @@ -522,6 +548,10 @@ org.mockito mockito-core + + + log4j + log4j @@ -539,6 +569,10 @@ org.mockito mockito-core + + + log4j + log4j @@ -567,8 +601,8 @@ - commons-configuration - commons-configuration + org.apache.commons + commons-configuration2 com.maxmind.geoip2 @@ -607,7 +641,6 @@ com.google.guava guava - 19.0 diff --git a/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java b/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java index 261e623130..d82c8aacac 100644 --- a/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java +++ b/dspace-api/src/main/java/org/dspace/administer/CommunityFiliator.java @@ -180,13 +180,9 @@ public class CommunityFiliator { // second test - circularity: parent's parents can't include proposed // child List parentDads = parent.getParentCommunities(); - - for (int i = 0; i < parentDads.size(); i++) { - if (parentDads.get(i).getID().equals(child.getID())) { - System.out - .println("Error, circular parentage - child is parent of parent"); - System.exit(1); - } + if (parentDads.contains(child)) { + System.out.println("Error, circular parentage - child is parent of parent"); + System.exit(1); } // everthing's OK @@ -210,26 +206,15 @@ public class CommunityFiliator { throws SQLException, AuthorizeException, IOException { // verify that child is indeed a child of parent List parentKids = parent.getSubcommunities(); - boolean isChild = false; - - for (int i = 0; i < parentKids.size(); i++) { - if (parentKids.get(i).getID().equals(child.getID())) { - isChild = true; - - break; - } - } - - if (!isChild) { - System.out - .println("Error, child community not a child of parent community"); + if (!parentKids.contains(child)) { + System.out.println("Error, child community not a child of parent community"); System.exit(1); } // OK remove the mappings - but leave the community, which will become // top-level - child.getParentCommunities().remove(parent); - parent.getSubcommunities().remove(child); + child.removeParentCommunity(parent); + parent.removeSubCommunity(child); communityService.update(c, child); communityService.update(c, parent); 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/ImageMagickThumbnailFilter.java b/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java index 58bae2e22b..27413544b9 100644 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java +++ b/dspace-api/src/main/java/org/dspace/app/mediafilter/ImageMagickThumbnailFilter.java @@ -143,7 +143,7 @@ public abstract class ImageMagickThumbnailFilter extends MediaFilter { // PDFs using the CMYK color system can be handled specially if // profiles are defined if (cmyk_profile != null && srgb_profile != null) { - Info imageInfo = new Info(f.getAbsolutePath(), true); + Info imageInfo = new Info(f.getAbsolutePath() + s, true); String imageClass = imageInfo.getImageClass(); if (imageClass.contains("CMYK")) { op.profile(cmyk_profile); 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 deleted file mode 100644 index 5051c01fd4..0000000000 --- a/dspace-api/src/main/java/org/dspace/app/mediafilter/WordFilter.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.app.mediafilter; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; - -import org.apache.log4j.Logger; -import org.dspace.content.Item; -import org.textmining.extraction.TextExtractor; -import org.textmining.extraction.word.WordTextExtractorFactory; - -/* - * - * to do: helpful error messages - can't find mediafilter.cfg - can't - * instantiate filter - bitstream format doesn't exist. - * - */ -public class WordFilter extends MediaFilter { - - private static Logger log = Logger.getLogger(WordFilter.class); - - @Override - public String getFilteredName(String oldFilename) { - return oldFilename + ".txt"; - } - - /** - * @return String bundle name - */ - @Override - public String getBundleName() { - return "TEXT"; - } - - /** - * @return String bitstreamformat - */ - @Override - public String getFormatString() { - return "Text"; - } - - /** - * @return String description - */ - @Override - public String getDescription() { - return "Extracted text"; - } - - /** - * @param currentItem item - * @param source source input stream - * @param verbose verbose mode - * @return InputStream the resulting input stream - * @throws Exception if error - */ - @Override - public InputStream getDestinationStream(Item currentItem, InputStream source, boolean verbose) - throws Exception { - // get input stream from bitstream - // pass to filter, get string back - try { - WordTextExtractorFactory factory = new WordTextExtractorFactory(); - TextExtractor e = factory.textExtractor(source); - String extractedText = e.getText(); - - // if verbose flag is set, print out extracted text - // to STDOUT - if (verbose) { - System.out.println(extractedText); - } - - // generate an input stream with the extracted text - byte[] textBytes = extractedText.getBytes(); - ByteArrayInputStream bais = new ByteArrayInputStream(textBytes); - - return bais; // will this work? or will the byte array be out of scope? - } catch (IOException ioe) { - System.out.println("Invalid Word Format"); - log.error("Error detected - Word File format not recognized: " - + ioe.getMessage(), ioe); - throw ioe; - } - } -} 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/requestitem/dao/impl/RequestItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java index 5d9cb1f666..351f40ae13 100644 --- a/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/requestitem/dao/impl/RequestItemDAOImpl.java @@ -8,13 +8,15 @@ package org.dspace.app.requestitem.dao.impl; import java.sql.SQLException; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.app.requestitem.RequestItem; +import org.dspace.app.requestitem.RequestItem_; import org.dspace.app.requestitem.dao.RequestItemDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the RequestItem object. @@ -30,9 +32,12 @@ public class RequestItemDAOImpl extends AbstractHibernateDAO implem @Override public RequestItem findByToken(Context context, String token) throws SQLException { - Criteria criteria = createCriteria(context, RequestItem.class); - criteria.add(Restrictions.eq("token", token)); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RequestItem.class); + Root requestItemRoot = criteriaQuery.from(RequestItem.class); + criteriaQuery.select(requestItemRoot); + criteriaQuery.where(criteriaBuilder.equal(requestItemRoot.get(RequestItem_.token), token)); + return uniqueResult(context, criteriaQuery, false, RequestItem.class, -1, -1); } 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> fields, Map> listMap) { + public DCInputSet(String formName, List>> rows, Map> listMap) { this.formName = formName; - this.inputs = new DCInput[fields.size()]; + this.inputs = new DCInput[rows.size()][]; for (int i = 0; i < inputs.length; i++) { - Map field = fields.get(i); - inputs[i] = new DCInput(field, listMap); - + List> fields = rows.get(i); + inputs[i] = new DCInput[fields.size()]; + for (int j = 0; j < inputs[i].length; j++) { + Map field = rows.get(i).get(j); + inputs[i][j] = new DCInput(field, listMap); + } } } @@ -71,7 +72,7 @@ public class DCInputSet { * @return an array containing the fields */ - public DCInput[] getFields() { + public DCInput[][] getFields() { return inputs; } @@ -104,10 +105,12 @@ public class DCInputSet { */ public boolean isFieldPresent(String fieldName) { for (int i = 0; i < inputs.length; i++) { - DCInput field = inputs[i]; - String fullName = field.getFieldName(); - if (fullName.equals(fieldName)) { - return true; + for (int j = 0; j < inputs[i].length; j++) { + DCInput field = inputs[i][j]; + String fullName = field.getFieldName(); + if (fullName.equals(fieldName)) { + return true; + } } } return false; @@ -127,11 +130,13 @@ public class DCInputSet { documentType = ""; } for (int i = 0; i < inputs.length; i++) { - DCInput field = inputs[i]; - String fullName = field.getFieldName(); - if (fullName.equals(fieldName)) { - if (field.isAllowedFor(documentType)) { - return true; + for (int j = 0; j < inputs[i].length; j++) { + DCInput field = inputs[i][j]; + String fullName = field.getFieldName(); + if (fullName.equals(fieldName)) { + if (field.isAllowedFor(documentType)) { + return true; + } } } } diff --git a/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java b/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java index f88ec61d50..b473e602b8 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java @@ -74,7 +74,7 @@ public class DCInputsReader { * Reference to the forms definitions map, computed from the forms * definition file */ - private Map>> formDefns = null; + private Map>>> formDefns = null; /** * Reference to the value-pairs map, computed from the forms definition file @@ -115,7 +115,7 @@ public class DCInputsReader { private void buildInputs(String fileName) throws DCInputsReaderException { - formDefns = new HashMap>>(); + formDefns = new HashMap>>>(); valuePairs = new HashMap>(); String uri = "file:" + new File(fileName).getAbsolutePath(); @@ -212,7 +212,7 @@ public class DCInputsReader { return lastInputSet; } // cache miss - construct new DCInputSet - List> pages = formDefns.get(formName); + List>> pages = formDefns.get(formName); if (pages == null) { throw new DCInputsReaderException("Missing the " + formName + " form"); } @@ -292,8 +292,8 @@ public class DCInputsReader { /** * Process the form-definitions section of the XML file. Each element is - * formed thusly:
...pages...
Each pages - * subsection is formed: ...fields... Each field + * formed thusly:
...row...
Each rows + * subsection is formed: ...fields... Each field * is formed from: dc-element, dc-qualifier, label, hint, input-type name, * required text, and repeatable flag. */ @@ -311,26 +311,24 @@ public class DCInputsReader { if (formName == null) { throw new SAXException("form element has no name attribute"); } - List> fields = new ArrayList>(); // the form contains fields - formDefns.put(formName, fields); + List>> rows = new ArrayList>>(); // the form + // contains rows of fields + formDefns.put(formName, rows); NodeList pl = nd.getChildNodes(); int lenpg = pl.getLength(); for (int j = 0; j < lenpg; j++) { Node npg = pl.item(j); - - if (npg.getNodeName().equals("field")) { - // process each field definition - Map field = new HashMap(); - processField(formName, npg, field); - fields.add(field); - // we omit the duplicate validation, allowing multiple - // fields definition for - // the same metadata and different visibility/type-bind + if (npg.getNodeName().equals("row")) { + List> fields = new ArrayList>(); // the fields in the + // row + // process each row definition + processRow(formName, j, npg, fields); + rows.add(fields); } } // sanity check number of fields - if (fields.size() < 1) { - throw new DCInputsReaderException("Form " + formName + " has no fields"); + if (rows.size() < 1) { + throw new DCInputsReaderException("Form " + formName + " has no rows"); } } } @@ -339,6 +337,48 @@ public class DCInputsReader { } } + /** + * Process parts of a row + */ + private void processRow(String formName, int rowIdx, Node n, List> fields) + throws SAXException, DCInputsReaderException { + + NodeList pl = n.getChildNodes(); + int lenpg = pl.getLength(); + for (int j = 0; j < lenpg; j++) { + Node npg = pl.item(j); + + if (npg.getNodeName().equals("field")) { + // process each field definition + Map field = new HashMap(); + processField(formName, npg, field); + fields.add(field); + String key = field.get(PAIR_TYPE_NAME); + if (StringUtils + .isNotBlank(key)) { + String schema = field.get("dc-schema"); + String element = field.get("dc-element"); + String qualifier = field + .get("dc-qualifier"); + String metadataField = schema + "." + + element; + if (StringUtils.isNotBlank(qualifier)) { + metadataField += "." + qualifier; + } + } + + // we omit the duplicate validation, allowing multiple + // fields definition for + // the same metadata and different visibility/type-bind + } + } + // sanity check number of fields + if (fields.size() < 1) { + throw new DCInputsReaderException("Form " + formName + "row " + rowIdx + " has no fields"); + } + } + + /** * Process parts of a field * At the end, make sure that input-types 'qualdrop_value' and @@ -537,26 +577,29 @@ public class DCInputsReader { Iterator ki = formDefns.keySet().iterator(); while (ki.hasNext()) { String idName = ki.next(); - List> fields = formDefns.get(idName); - for (int i = 0; i < fields.size(); i++) { - Map fld = fields.get(i); - // verify reference in certain input types - String type = fld.get("input-type"); - if (type.equals("dropdown") - || type.equals("qualdrop_value") - || type.equals("list")) { - String pairsName = fld.get(PAIR_TYPE_NAME); - List v = valuePairs.get(pairsName); - if (v == null) { - String errString = "Cannot find value pairs for " + pairsName; - throw new DCInputsReaderException(errString); + List>> rows = formDefns.get(idName); + for (int j = 0; j < rows.size(); j++) { + List> fields = rows.get(j); + for (int i = 0; i < fields.size(); i++) { + Map fld = fields.get(i); + // verify reference in certain input types + String type = fld.get("input-type"); + if (type.equals("dropdown") + || type.equals("qualdrop_value") + || type.equals("list")) { + String pairsName = fld.get(PAIR_TYPE_NAME); + List v = valuePairs.get(pairsName); + if (v == null) { + String errString = "Cannot find value pairs for " + pairsName; + throw new DCInputsReaderException(errString); + } } - } - // we omit the "required" and "visibility" validation, provided this must be checked in the - // processing class - // only when it makes sense (if the field isn't visible means that it is not applicable, therefore it - // can't be required) + // we omit the "required" and "visibility" validation, provided this must be checked in the + // processing class + // only when it makes sense (if the field isn't visible means that it is not applicable, + // therefore it can't be required) + } } } } @@ -639,4 +682,5 @@ public class DCInputsReader { } throw new DCInputsReaderException("No field configuration found!"); } + } diff --git a/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java b/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java index f2dcd593dc..b0289ec4a4 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java +++ b/dspace-api/src/main/java/org/dspace/app/util/DSpaceContextListener.java @@ -16,14 +16,14 @@ import java.util.Enumeration; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Class to initialize / cleanup resources used by DSpace when the web application * is started or stopped. */ public class DSpaceContextListener implements ServletContextListener { - private static Logger log = Logger.getLogger(DSpaceContextListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceContextListener.class); /** * Initialize any resources required by the application. diff --git a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java b/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java deleted file mode 100644 index db83bf19c4..0000000000 --- a/dspace-api/src/main/java/org/dspace/app/util/DailyFileAppender.java +++ /dev/null @@ -1,299 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.app.util; - -import java.io.File; -import java.io.IOException; -import java.net.UnknownHostException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - -import org.apache.commons.lang.time.DateUtils; -import org.apache.log4j.FileAppender; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.spi.LoggingEvent; - -/** - * Special log appender for log4j. Adds the current date (ie. year-mon) to - * the end of the file name, so that rolling on to the next log is simply - * a case of starting a new one - no renaming of old logs. - * - * This is advisable if you are using Windows, and have multiple applications - * (ie. dspace, dspace-oai, dspace-sword) that all want to write to the same log file, - * as each would otherwise try to rename the old files during rollover. - * - * An example log4j.properties (one log per month, retains three months of logs) - * - * log4j.rootCategory=INFO, A1 - * log4j.appender.A1=org.dspace.app.util.DailyFileAppender - * log4j.appender.A1.File=@@log.dir@@/dspace.log - * log4j.appender.A1.DatePattern=yyyy-MM - * log4j.appender.A1.MaxLogs=3 - * log4j.appender.A1.layout=org.apache.log4j.PatternLayout - * log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n - */ -public class DailyFileAppender extends FileAppender { - /** - * The fixed date pattern to be used if one is not specified. - */ - private static final String DATE_PATTERN = "yyyy-MM-dd"; - - /** - * The folder under which daily folders are created. This can be a absolute path - * or relative path also. - * e.g. JavaLogs/CPRILog or F:/LogFiles/CPRILog - */ - private String mstrFileName; - - /** - * Used internally and contains the name of the date derived from current system date. - */ - private Date mstrDate = new Date(System.currentTimeMillis()); - - /** - * Holds the user specified DatePattern, - */ - private String mstrDatePattern = DATE_PATTERN; - - private boolean mMonthOnly = false; - - /** - * The date formatter object used for parsing the user specified DatePattern. - */ - private SimpleDateFormat mobjSDF; - - private boolean mWithHostName = false; - - private int mMaxLogs = 0; - - /** - * Default constructor. This is required as the appender class is dynamically - * loaded. - */ - public DailyFileAppender() { - super(); - } - - /* (non-Javadoc) - * @see org.apache.log4j.FileAppender#activateOptions() - */ - @Override - public void activateOptions() { - setFileName(); - cleanupOldFiles(); - super.activateOptions(); - } - - /*------------------------------------------------------------------------------ - * Getters - *----------------------------------------------------------------------------*/ - public String getDatePattern() { - return this.mstrDatePattern; - } - - @Override - public String getFile() { - return this.mstrFileName; - } - - public boolean getWithHost() { - return mWithHostName; - } - - public int getMaxLogs() { - return mMaxLogs; - } - - /*------------------------------------------------------------------------------ - * Setters - *----------------------------------------------------------------------------*/ - public void setDatePattern(String pstrPattern) { - this.mstrDatePattern = checkPattern(pstrPattern); - if (mstrDatePattern.contains("dd") || mstrDatePattern.contains("DD")) { - mMonthOnly = false; - } else { - mMonthOnly = true; - } - } - - @Override - public void setFile(String file) { - // Trim spaces from both ends. The users probably does not want - // trailing spaces in file names. - String val = file.trim(); - mstrFileName = val; - } - - public void setWithHost(boolean wh) { - mWithHostName = wh; - } - - public void setMaxLogs(int ml) { - mMaxLogs = ml; - } - - /*------------------------------------------------------------------------------ - * Methods - *----------------------------------------------------------------------------*/ - /* (non-Javadoc) - * @see org.apache.log4j.WriterAppender#subAppend(org.apache.log4j.spi.LoggingEvent) - */ - @Override - protected void subAppend(LoggingEvent pobjEvent) { - Date dtNow = new Date(System.currentTimeMillis()); - - boolean rollover = false; - - if (mMonthOnly) { - Calendar now = Calendar.getInstance(); - Calendar cur = Calendar.getInstance(); - now.setTime(dtNow); - cur.setTime(mstrDate); - rollover = !(now.get(Calendar.YEAR) == cur.get(Calendar.YEAR) && now.get(Calendar.MONTH) == cur - .get(Calendar.MONTH)); - } else { - rollover = !(DateUtils.isSameDay(dtNow, mstrDate)); - } - - if (rollover) { - try { - rollOver(dtNow); - } catch (IOException IOEx) { - LogLog.error("rollOver() failed!", IOEx); - } - } - - super.subAppend(pobjEvent); - } - - /*------------------------------------------------------------------------------ - * Helpers - *----------------------------------------------------------------------------*/ - - /** - * The helper function to validate the DatePattern. - * - * @param pstrPattern The DatePattern to be validated. - * @return The validated date pattern or defautlt DATE_PATTERN - */ - private String checkPattern(String pstrPattern) { - String strRet = null; - SimpleDateFormat objFmt = new SimpleDateFormat(DATE_PATTERN); - - try { - this.mobjSDF = new SimpleDateFormat(pstrPattern); - strRet = pstrPattern; - } catch (NullPointerException NPExIgnore) { - LogLog.error("Invalid DatePattern " + pstrPattern, NPExIgnore); - this.mobjSDF = objFmt; - strRet = DATE_PATTERN; - } catch (IllegalArgumentException IlArgExIgnore) { - LogLog.error("Invalid DatePattern " + pstrPattern, IlArgExIgnore); - this.mobjSDF = objFmt; - strRet = DATE_PATTERN; - } finally { - objFmt = null; - } - return strRet; - } - - /** - * This function is responsible for performing the actual file rollover. - * - * @param pstrName The name of the new folder based on current system date. - * @throws IOException if IO error - */ - private static boolean deletingFiles = false; - - private void cleanupOldFiles() { - // If we need to delete log files - if (mMaxLogs > 0 && !deletingFiles) { - deletingFiles = true; - - // Determine the final file extension with the hostname - String hostFileExt = null; - try { - hostFileExt = "." + java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - LogLog.error("Unable to retrieve host name"); - } - - try { - // Array to hold the logs we are going to keep - File[] logsToKeep = new File[mMaxLogs]; - - // Get a 'master' file handle, and the parent directory from it - File logMaster = new File(mstrFileName); - File logDir = logMaster.getParentFile(); - if (logDir.isDirectory()) { - // Iterate all the files in that directory - File[] logArr = logDir.listFiles(); - for (File curLog : logArr) { - LogLog.debug("Comparing '" + curLog.getAbsolutePath() + "' to '" + mstrFileName + "'"); - String name = curLog.getAbsolutePath(); - - // First, see if we are not using hostname, or the log file ends with this host - if (!mWithHostName || (hostFileExt != null && name.endsWith(hostFileExt))) { - // Check that the file is indeed one we want (contains the master file name) - if (name.contains(mstrFileName)) { - // Iterate through the array of logs we are keeping - for (int i = 0; curLog != null && i < logsToKeep.length; i++) { - // Have we exhausted the 'to keep' array? - if (logsToKeep[i] == null) { - // Empty space, retain this log file - logsToKeep[i] = curLog; - curLog = null; - } else if (logsToKeep[i].getName().compareTo(curLog.getName()) < 0) { - // If the 'kept' file is older than the current one - // Replace tested entry with current file - File temp = logsToKeep[i]; - logsToKeep[i] = curLog; - curLog = temp; - } - } - - // If we have a 'current' entry at this point, it's a log we don't want - if (curLog != null) { - LogLog.debug("Deleting log " + curLog.getName()); - if (!curLog.delete()) { - LogLog.error("Unable to delete log file"); - } - } - } - } - } - } - } catch (Exception e) { - // Don't worry about exceptions - } finally { - deletingFiles = false; - } - } - } - - private void rollOver(Date dtNow) throws IOException { - mstrDate = dtNow; - setFileName(); - this.setFile(fileName, true, bufferedIO, bufferSize); - - cleanupOldFiles(); - } - - private void setFileName() { - fileName = mstrFileName + "." + mobjSDF.format(mstrDate); - - if (mWithHostName) { - try { - fileName += "." + java.net.InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - LogLog.error("Unable to retrieve host name"); - } - } - } -} diff --git a/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java b/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java index 821fd2f3b5..add98af96f 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java +++ b/dspace-api/src/main/java/org/dspace/app/util/GoogleBitstreamComparator.java @@ -12,7 +12,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.factory.ContentServiceFactory; @@ -24,7 +24,7 @@ import org.dspace.core.Context; */ public class GoogleBitstreamComparator implements Comparator { - private final static Logger log = Logger.getLogger(GoogleBitstreamComparator.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleBitstreamComparator.class); HashMap priorityMap = new HashMap<>(); diff --git a/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java b/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java index f012395de4..c2bd6633f0 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java +++ b/dspace-api/src/main/java/org/dspace/app/util/GoogleMetadata.java @@ -26,7 +26,7 @@ import java.util.Properties; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -51,7 +51,7 @@ import org.jdom.Element; @SuppressWarnings("deprecation") public class GoogleMetadata { - private final static Logger log = Logger.getLogger(GoogleMetadata.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleMetadata.class); protected static final String GOOGLE_PREFIX = "google."; diff --git a/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java index 3c3eb8ab4f..681867371a 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/MetadataExposureServiceImpl.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.service.MetadataExposureService; import org.dspace.authorize.service.AuthorizeService; import org.dspace.core.Context; @@ -58,7 +58,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @version $Revision: 3734 $ */ public class MetadataExposureServiceImpl implements MetadataExposureService { - protected Logger log = Logger.getLogger(MetadataExposureServiceImpl.class); + protected Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataExposureServiceImpl.class); protected Map> hiddenElementSets = null; protected Map>> hiddenElementMaps = null; diff --git a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java index d0824923c7..b188f90e95 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/OpenSearchServiceImpl.java @@ -20,7 +20,7 @@ import com.sun.syndication.feed.module.opensearch.OpenSearchModule; import com.sun.syndication.feed.module.opensearch.entity.OSQuery; import com.sun.syndication.feed.module.opensearch.impl.OpenSearchModuleImpl; import com.sun.syndication.io.FeedException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.service.OpenSearchService; import org.dspace.content.DSpaceObject; import org.dspace.core.Constants; @@ -54,7 +54,7 @@ import org.w3c.dom.Document; * @author Richard Rodgers */ public class OpenSearchServiceImpl implements OpenSearchService, InitializingBean { - private static final Logger log = Logger.getLogger(OpenSearchServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(OpenSearchServiceImpl.class); // are open search queries enabled? protected boolean enabled = false; @@ -96,6 +96,11 @@ public class OpenSearchServiceImpl implements OpenSearchService, InitializingBea return formats; } + @Override + public boolean isEnabled() { + return enabled; + } + @Override public String getContentType(String format) { return "html".equals(format) ? "text/html" : diff --git a/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java b/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java index c717ac3014..1e018ff889 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.java +++ b/dspace-api/src/main/java/org/dspace/app/util/OptimizeSelectCollection.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.content.Collection; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -28,7 +28,7 @@ import org.springframework.util.StopWatch; * Invocation: dsrun org.dspace.app.util.OptimizeSelectCollection */ public class OptimizeSelectCollection { - private static final Logger log = Logger.getLogger(OptimizeSelectCollection.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(OptimizeSelectCollection.class); private static Context context; private static ArrayList brokenPeople; diff --git a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java index c231955ad4..94d61048bb 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfig.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Class representing a single Item Submission config definition, organized into @@ -44,7 +44,7 @@ public class SubmissionConfig implements Serializable { /** * log4j logger */ - private static Logger log = Logger.getLogger(SubmissionConfig.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionConfig.class); /** * Constructs a new Submission Configuration object, based on the XML diff --git a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java index 407d9c2bef..c65b7d1c90 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SubmissionConfigReader.java @@ -19,7 +19,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; @@ -71,7 +71,7 @@ public class SubmissionConfigReader { /** * log4j logger */ - private static Logger log = Logger.getLogger(SubmissionConfigReader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionConfigReader.class); /** * The fully qualified pathname of the directory containing the Item Submission Configuration file diff --git a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java index 5e79b69202..3e0caee543 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java +++ b/dspace-api/src/main/java/org/dspace/app/util/SyndicationFeed.java @@ -34,9 +34,9 @@ import com.sun.syndication.feed.synd.SyndPerson; import com.sun.syndication.feed.synd.SyndPersonImpl; import com.sun.syndication.io.FeedException; import com.sun.syndication.io.SyndFeedOutput; -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.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; @@ -69,7 +69,7 @@ import org.w3c.dom.Document; * @author Larry Stone */ public class SyndicationFeed { - protected final Logger log = Logger.getLogger(SyndicationFeed.class); + protected final Logger log = org.apache.logging.log4j.LogManager.getLogger(SyndicationFeed.class); /** diff --git a/dspace-api/src/main/java/org/dspace/app/util/Util.java b/dspace-api/src/main/java/org/dspace/app/util/Util.java index edfc782092..7d4a5e8182 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/Util.java +++ b/dspace-api/src/main/java/org/dspace/app/util/Util.java @@ -23,8 +23,8 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.commons.collections4.ListUtils; -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.Collection; import org.dspace.content.Item; import org.dspace.content.MetadataValue; @@ -44,7 +44,7 @@ public class Util { // cache for source version result private static String sourceVersion = null; - private static Logger log = Logger.getLogger(Util.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Util.class); /** * Default constructor. Must be protected as org.dspace.xmlworkflow.WorkflowUtils extends it @@ -418,11 +418,12 @@ public class Util { List inputSets = inputsReader.getInputsByCollectionHandle(col_handle); + // Replace the values of Metadatum[] with the correct ones in case + // of + // controlled vocabularies + String currentField = Utils.standardize(schema, element, qualifier, "."); + for (DCInputSet inputSet : inputSets) { - // Replace the values of Metadatum[] with the correct ones in case - // of - // controlled vocabularies - String currentField = Utils.standardize(schema, element, qualifier, "."); if (inputSet != null) { @@ -430,19 +431,20 @@ public class Util { for (int p = 0; p < fieldsNums; p++) { - DCInput[] inputs = inputSet.getFields(); + DCInput[][] inputs = inputSet.getFields(); if (inputs != null) { for (int i = 0; i < inputs.length; i++) { - String inputField = Utils.standardize(inputs[i].getSchema(), inputs[i].getElement(), - inputs[i].getQualifier(), "."); - if (currentField.equals(inputField)) { - - myInputs = inputs[i]; - myInputsFound = true; - break; - + for (int j = 0; j < inputs[i].length; j++) { + String inputField = Utils + .standardize(inputs[i][j].getSchema(), inputs[i][j].getElement(), + inputs[i][j].getQualifier(), "."); + if (currentField.equals(inputField)) { + myInputs = inputs[i][j]; + myInputsFound = true; + break; + } } } } @@ -480,13 +482,17 @@ public class Util { Set fromFieldName = new HashSet<>(); Set toFieldName = new HashSet<>(); for (DCInputSet ff : from) { - for (DCInput fdc : ff.getFields()) { - fromFieldName.add(fdc.getFieldName()); + for (DCInput[] fdcrow : ff.getFields()) { + for (DCInput fdc : fdcrow) { + fromFieldName.add(fdc.getFieldName()); + } } } for (DCInputSet tt : to) { - for (DCInput tdc : tt.getFields()) { - toFieldName.add(tdc.getFieldName()); + for (DCInput[] tdcrow : tt.getFields()) { + for (DCInput tdc : tdcrow) { + toFieldName.add(tdc.getFieldName()); + } } } diff --git a/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java b/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java index 84cc21e642..5709867f24 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/app/util/WebAppServiceImpl.java @@ -18,7 +18,7 @@ import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpHead; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.dao.WebAppDAO; import org.dspace.app.util.service.WebAppService; import org.dspace.core.Context; @@ -33,7 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class WebAppServiceImpl implements WebAppService { - private final Logger log = Logger.getLogger(WebAppServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(WebAppServiceImpl.class); @Autowired(required = true) protected WebAppDAO webAppDAO; diff --git a/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java b/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java index 7f1b72a565..884b2a6a92 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java +++ b/dspace-api/src/main/java/org/dspace/app/util/XMLUtils.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.w3c.dom.Element; import org.w3c.dom.NodeList; diff --git a/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java b/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java index 5b54bfcddd..45259de8c0 100644 --- a/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java +++ b/dspace-api/src/main/java/org/dspace/app/util/service/OpenSearchService.java @@ -41,6 +41,13 @@ public interface OpenSearchService { */ public List getFormats(); + /** + * Determine if the module is active + * + * @return boolean indicator if the OpenSearch module is enabled or not + */ + public boolean isEnabled(); + /** * Returns a mime-type associated with passed format * diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java index 9a8dcf7d55..e18c4eddd7 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPAuthentication.java @@ -17,14 +17,15 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; -import org.dspace.core.ConfigurationManager; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; +import org.dspace.core.factory.CoreServiceFactory; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.service.GroupService; +import org.dspace.service.ClientInfoService; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -49,7 +50,7 @@ public class IPAuthentication implements AuthenticationMethod { /** * Our logger */ - private static Logger log = Logger.getLogger(IPAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IPAuthentication.class); /** * Whether to look for x-forwarded headers for logging IP addresses @@ -67,6 +68,7 @@ public class IPAuthentication implements AuthenticationMethod { protected List ipNegativeMatchers; protected GroupService groupService; + protected ClientInfoService clientInfoService; /** @@ -91,6 +93,7 @@ public class IPAuthentication implements AuthenticationMethod { ipMatcherGroupIDs = new HashMap<>(); ipMatcherGroupNames = new HashMap<>(); groupService = EPersonServiceFactory.getInstance().getGroupService(); + clientInfoService = CoreServiceFactory.getInstance().getClientInfoService(); List propNames = DSpaceServicesFactory.getInstance().getConfigurationService() .getPropertyKeys("authentication-ip"); @@ -169,18 +172,7 @@ public class IPAuthentication implements AuthenticationMethod { List groups = new ArrayList(); // Get the user's IP address - String addr = request.getRemoteAddr(); - if (useProxies == null) { - useProxies = ConfigurationManager.getBooleanProperty("useProxies", false); - } - if (useProxies && request.getHeader("X-Forwarded-For") != null) { - /* This header is a comma delimited list */ - for (String xfip : request.getHeader("X-Forwarded-For").split(",")) { - if (!request.getHeader("X-Forwarded-For").contains(addr)) { - addr = xfip.trim(); - } - } - } + String addr = clientInfoService.getClientIp(request); for (IPMatcher ipm : ipMatchers) { try { diff --git a/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java b/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java index 02825589cb..955b6c86d3 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/IPMatcher.java @@ -10,7 +10,7 @@ package org.dspace.authenticate; import java.net.Inet6Address; import java.net.UnknownHostException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** *

@@ -38,7 +38,7 @@ import org.apache.log4j.Logger; * @version $Revision$ */ public class IPMatcher { - private static Logger log = Logger.getLogger(IPMatcher.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IPMatcher.class); /** * Network to match diff --git a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java index 13ba180c0f..ae793ec433 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/LDAPAuthentication.java @@ -28,8 +28,8 @@ import javax.naming.ldap.StartTlsResponse; 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.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; import org.dspace.authorize.AuthorizeException; @@ -61,7 +61,7 @@ public class LDAPAuthentication /** * log4j category */ - private static Logger log = Logger.getLogger(LDAPAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LDAPAuthentication.class); protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance() .getAuthenticationService(); diff --git a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java index a111be30ce..86cfb50c5f 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/PasswordAuthentication.java @@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.dspace.eperson.EPerson; @@ -49,7 +49,7 @@ public class PasswordAuthentication /** * log4j category */ - private static Logger log = Logger.getLogger(PasswordAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PasswordAuthentication.class); /** diff --git a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java index cdea32a183..2ff0e457a8 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/ShibAuthentication.java @@ -23,8 +23,8 @@ import java.util.UUID; 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.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authorize.AuthorizeException; import org.dspace.content.MetadataField; @@ -70,7 +70,7 @@ public class ShibAuthentication implements AuthenticationMethod { /** * log4j category */ - private static Logger log = Logger.getLogger(ShibAuthentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ShibAuthentication.class); /** * Additional metadata mappings diff --git a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java index da2097d0dd..df9e767116 100644 --- a/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java +++ b/dspace-api/src/main/java/org/dspace/authenticate/X509Authentication.java @@ -29,8 +29,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.dspace.authenticate.factory.AuthenticateServiceFactory; import org.dspace.authenticate.service.AuthenticationService; import org.dspace.authorize.AuthorizeException; @@ -105,7 +105,7 @@ public class X509Authentication implements AuthenticationMethod { /** * log4j category */ - private static Logger log = Logger.getLogger(X509Authentication.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(X509Authentication.class); /** * public key of CA to check client certs against. diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java index 56521ac950..2aeaa6e364 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthoritySolrServiceImpl.java @@ -12,7 +12,7 @@ import java.net.MalformedURLException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; @@ -30,7 +30,7 @@ import org.dspace.core.ConfigurationManager; */ public class AuthoritySolrServiceImpl implements AuthorityIndexingService, AuthoritySearchService { - private static final Logger log = Logger.getLogger(AuthoritySolrServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthoritySolrServiceImpl.class); protected AuthoritySolrServiceImpl() { diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java index 22f2f495cf..3ed16e9ce1 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityTypes.java @@ -12,7 +12,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * This class contains a list of active authority types. @@ -32,7 +32,7 @@ public class AuthorityTypes { /** * log4j logger */ - private static Logger log = Logger.getLogger(AuthorityTypes.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityTypes.class); protected List types = new ArrayList(); diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java index 80d9e16289..acb5bd754d 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityValue.java @@ -14,8 +14,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -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.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; import org.dspace.authorize.AuthorizeException; @@ -234,7 +234,7 @@ public class AuthorityValue { /** * log4j logger */ - private static Logger log = Logger.getLogger(AuthorityValue.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityValue.class); @Override public String toString() { diff --git a/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java b/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java index 7780c79232..194da3eba5 100644 --- a/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authority/AuthorityValueServiceImpl.java @@ -13,8 +13,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; -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.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; @@ -34,7 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class AuthorityValueServiceImpl implements AuthorityValueService { - private final Logger log = Logger.getLogger(AuthorityValueServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityValueServiceImpl.class); @Autowired(required = true) protected AuthorityTypes authorityTypes; diff --git a/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java index 179e06fc79..f937b5f7ed 100644 --- a/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/PersonAuthorityValue.java @@ -12,8 +12,8 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; diff --git a/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java b/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java index 44fd0a9241..db008c9db6 100644 --- a/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java +++ b/dspace-api/src/main/java/org/dspace/authority/UpdateAuthorities.java @@ -19,7 +19,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityValueService; import org.dspace.content.Item; @@ -40,7 +40,7 @@ public class UpdateAuthorities { /** * log4j logger */ - private static Logger log = Logger.getLogger(UpdateAuthorities.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(UpdateAuthorities.class); protected PrintWriter print = null; diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java index c5029db53a..2105aa9488 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityConsumer.java @@ -12,7 +12,7 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityService; import org.dspace.content.DSpaceObject; @@ -33,7 +33,7 @@ import org.dspace.event.Event; */ public class AuthorityConsumer implements Consumer { - private final Logger log = Logger.getLogger(AuthorityConsumer.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityConsumer.class); /** * A set of all item IDs installed which need their authority updated diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java index 2b933a3bff..f2a4dcf6c4 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/AuthorityIndexClient.java @@ -12,7 +12,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.factory.AuthorityServiceFactory; import org.dspace.authority.service.AuthorityService; @@ -29,7 +29,7 @@ import org.dspace.core.Context; */ public class AuthorityIndexClient { - private static Logger log = Logger.getLogger(AuthorityIndexClient.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AuthorityIndexClient.class); protected static final AuthorityService authorityService = AuthorityServiceFactory.getInstance().getAuthorityService(); diff --git a/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java b/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java index 3b8cc1daf8..20baef8f9c 100644 --- a/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java +++ b/dspace-api/src/main/java/org/dspace/authority/indexer/DSpaceAuthorityIndexer.java @@ -13,8 +13,8 @@ import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; -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.service.AuthorityValueService; import org.dspace.authorize.AuthorizeException; @@ -45,7 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class DSpaceAuthorityIndexer implements AuthorityIndexerInterface, InitializingBean { - private static final Logger log = Logger.getLogger(DSpaceAuthorityIndexer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAuthorityIndexer.class); /** * The list of metadata fields which are to be indexed * @@ -124,7 +124,7 @@ public class DSpaceAuthorityIndexer implements AuthorityIndexerInterface, Initia * This method looks at the authority of a metadata value. * If the authority can be found in solr, that value is reused. * Otherwise a new authority value will be generated that will be indexed in solr. - * + * * If the authority starts with AuthorityValueGenerator.GENERATE, a specific type of AuthorityValue will be * generated. * Depending on the type this may involve querying an external REST service diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java index cf97bbe442..a545c6cf9e 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2.java @@ -15,12 +15,13 @@ import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.authority.AuthorityValue; import org.dspace.authority.SolrAuthorityInterface; import org.dspace.authority.orcid.xml.XMLtoBio; @@ -35,7 +36,7 @@ import org.orcid.jaxb.model.record_v2.Person; */ public class Orcidv2 implements SolrAuthorityInterface { - private static Logger log = Logger.getLogger(Orcidv2.class); + private static Logger log = LogManager.getLogger(Orcidv2.class); public RESTConnector restConnector; private String OAUTHUrl; @@ -46,7 +47,9 @@ public class Orcidv2 implements SolrAuthorityInterface { private String accessToken; /** - * Initialize the accessToken that is required for all subsequent calls to ORCID + * Initialize the accessToken that is required for all subsequent calls to ORCID. + * + * @throws java.io.IOException passed through from HTTPclient. */ public void init() throws IOException { if (StringUtils.isNotBlank(accessToken) && StringUtils.isNotBlank(clientSecret)) { diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java index 0aa0d292e7..456ccacd4d 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/Orcidv2AuthorityValue.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrInputDocument; import org.dspace.authority.AuthorityValue; diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java index 784a3fdf24..d55f9d4eee 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/Converter.java @@ -14,10 +14,9 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.xml.sax.SAXException; - /** * @param type * @author Antoine Snyers (antoine at atmire.com) @@ -30,7 +29,7 @@ public abstract class Converter { /** * log4j logger */ - private static Logger log = Logger.getLogger(Converter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Converter.class); public abstract T convert(InputStream document); diff --git a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java index 9fb4a50d5f..d7fdb4dc81 100644 --- a/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java +++ b/dspace-api/src/main/java/org/dspace/authority/orcid/xml/XMLtoBio.java @@ -12,7 +12,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authority.orcid.Orcidv2; import org.dspace.utils.DSpace; import org.orcid.jaxb.model.common_v2.OrcidId; @@ -21,8 +21,6 @@ import org.orcid.jaxb.model.search_v2.Result; import org.orcid.jaxb.model.search_v2.Search; import org.xml.sax.SAXException; - - /** * @author Antoine Snyers (antoine at atmire.com) * @author Kevin Van de Velde (kevin at atmire dot com) @@ -34,7 +32,7 @@ public class XMLtoBio extends Converter { /** * log4j logger */ - private static Logger log = Logger.getLogger(XMLtoBio.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XMLtoBio.class); @Override public List convert(InputStream xml) { diff --git a/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java b/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java index cfa21a66cb..df88985d3a 100644 --- a/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java +++ b/dspace-api/src/main/java/org/dspace/authority/rest/RESTConnector.java @@ -15,7 +15,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Antoine Snyers (antoine at atmire.com) @@ -28,7 +28,7 @@ public class RESTConnector { /** * log4j logger */ - private static Logger log = Logger.getLogger(RESTConnector.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RESTConnector.class); private String url; diff --git a/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java b/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java index 72dc41d6b9..43239ea459 100644 --- a/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java +++ b/dspace-api/src/main/java/org/dspace/authority/util/EnumUtils.java @@ -7,8 +7,8 @@ */ package org.dspace.authority.util; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.Logger; /** * @author Antoine Snyers (antoine at atmire.com) @@ -21,7 +21,7 @@ public class EnumUtils { /** * log4j logger */ - private static Logger log = Logger.getLogger(EnumUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(EnumUtils.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java b/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java index 5249f599e3..77568205af 100644 --- a/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java +++ b/dspace-api/src/main/java/org/dspace/authority/util/XMLUtils.java @@ -17,7 +17,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.xpath.XPathExpressionException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -36,7 +36,7 @@ public class XMLUtils { /** * log4j logger */ - private static Logger log = Logger.getLogger(XMLUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XMLUtils.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java index 8eca4ccf52..936a7d6492 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/AuthorizeServiceImpl.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; import org.dspace.content.Bitstream; diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java index 68d7ecd4f5..f4208e5835 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java +++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicy.java @@ -23,7 +23,7 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; diff --git a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java index 2609c6d165..4693599c31 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/ResourcePolicyServiceImpl.java @@ -15,8 +15,8 @@ import java.util.List; import java.util.Set; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ObjectUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.dao.ResourcePolicyDAO; import org.dspace.authorize.service.ResourcePolicyService; import org.dspace.content.DSpaceObject; @@ -38,7 +38,7 @@ public class ResourcePolicyServiceImpl implements ResourcePolicyService { /** * log4j logger */ - private static Logger log = Logger.getLogger(ResourcePolicyServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ResourcePolicyServiceImpl.class); @Autowired(required = true) protected ContentServiceFactory contentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java index 22095fa0b1..a0f69dc526 100644 --- a/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/authorize/dao/impl/ResourcePolicyDAOImpl.java @@ -9,17 +9,19 @@ package org.dspace.authorize.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; import org.dspace.authorize.dao.ResourcePolicyDAO; import org.dspace.content.DSpaceObject; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the ResourcePolicy object. @@ -36,79 +38,104 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO @Override public List findByDso(Context context, DSpaceObject dso) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso) - )); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso)); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override public List findByDsoAndType(Context context, DSpaceObject dso, String type) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("rptype", type) - )); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.rptype), type) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override public List findByGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.eq("epersonGroup", group)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group)); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override public List findByDSoAndAction(Context context, DSpaceObject dso, int actionId) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("actionId", actionId) - )); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), actionId) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, -1, -1); } @Override public List findByTypeGroupAction(Context context, DSpaceObject dso, Group group, int action) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("epersonGroup", group), - Restrictions.eq("actionId", action) - )); - criteria.setMaxResults(1); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder + .equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); } @Override public List findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, int action, int notPolicyID) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - Restrictions.eq("epersonGroup", group), - Restrictions.eq("actionId", action) - )); - criteria.add(Restrictions.and(Restrictions.not(Restrictions.eq("id", notPolicyID)))); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.dSpaceObject), dso), + criteriaBuilder + .equal(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup), group), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), + criteriaBuilder.notEqual(resourcePolicyRoot.get(ResourcePolicy_.id), notPolicyID) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); } public List findByEPersonGroupTypeIdAction(Context context, EPerson e, List groups, int action, int type_id) throws SQLException { - Criteria criteria = createCriteria(context, ResourcePolicy.class); - criteria.add(Restrictions.and( - Restrictions.eq("resourceTypeId", type_id), - Restrictions.eq("actionId", action), - (Restrictions.or( - Restrictions.eq("eperson", e), - Restrictions.in("epersonGroup", groups) - )) - )); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ResourcePolicy.class); + Root resourcePolicyRoot = criteriaQuery.from(ResourcePolicy.class); + criteriaQuery.select(resourcePolicyRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.resourceTypeId), type_id), + criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.actionId), action), + criteriaBuilder + .or(criteriaBuilder.equal(resourcePolicyRoot.get(ResourcePolicy_.eperson), e), + criteriaBuilder + .in(resourcePolicyRoot.get(ResourcePolicy_.epersonGroup).in(groups))) + ) + ); + return list(context, criteriaQuery, false, ResourcePolicy.class, 1, -1); } @Override @@ -124,7 +151,7 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO String queryString = "delete from ResourcePolicy where dSpaceObject= :dSpaceObject AND actionId= :actionId"; Query query = createQuery(context, queryString); query.setParameter("dSpaceObject", dso); - query.setInteger("actionId", actionId); + query.setParameter("actionId", actionId); query.executeUpdate(); } @@ -133,7 +160,7 @@ public class ResourcePolicyDAOImpl extends AbstractHibernateDAO String queryString = "delete from ResourcePolicy where dSpaceObject.id = :dsoId AND rptype = :rptype"; Query query = createQuery(context, queryString); query.setParameter("dsoId", dso.getID()); - query.setString("rptype", type); + query.setParameter("rptype", type); query.executeUpdate(); } diff --git a/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java b/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java index f7fb0b21ee..302d46eb0d 100644 --- a/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java +++ b/dspace-api/src/main/java/org/dspace/browse/BrowseEngine.java @@ -12,7 +12,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.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -34,7 +34,7 @@ public class BrowseEngine { /** * the logger for this class */ - private static final Logger log = Logger.getLogger(BrowseEngine.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BrowseEngine.class); /** * the browse scope which is the basis for our browse diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java index e39a584684..4b741847a8 100644 --- a/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java +++ b/dspace-api/src/main/java/org/dspace/browse/ItemCountDAOSolr.java @@ -11,7 +11,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -36,7 +36,7 @@ public class ItemCountDAOSolr implements ItemCountDAO { /** * Log4j logger */ - private static Logger log = Logger.getLogger(ItemCountDAOSolr.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemCountDAOSolr.class); /** * DSpace context diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java b/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java index 9b91f7afb9..c9c140fb0b 100644 --- a/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java +++ b/dspace-api/src/main/java/org/dspace/browse/ItemCounter.java @@ -9,7 +9,7 @@ package org.dspace.browse; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -37,7 +37,7 @@ public class ItemCounter { /** * Log4j logger */ - private static Logger log = Logger.getLogger(ItemCounter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemCounter.class); /** * DAO to use to store and retrieve data diff --git a/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java b/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java index 58e3d83a0c..9cbbe8f194 100644 --- a/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java +++ b/dspace-api/src/main/java/org/dspace/browse/ItemListConfig.java @@ -12,7 +12,7 @@ import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; diff --git a/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java b/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java index 40f889233a..c2a2bd9804 100644 --- a/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java +++ b/dspace-api/src/main/java/org/dspace/browse/LocaleOrderingFilter.java @@ -12,7 +12,7 @@ import java.util.Locale; import com.ibm.icu.text.CollationElementIterator; import com.ibm.icu.text.Collator; import com.ibm.icu.text.RuleBasedCollator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.text.filter.TextFilter; @@ -32,7 +32,7 @@ import org.dspace.text.filter.TextFilter; * @author Graham Triggs */ public class LocaleOrderingFilter implements TextFilter { - private static Logger log = Logger.getLogger(LocaleOrderingFilter.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LocaleOrderingFilter.class); /** * Uses a Locale dependent Collator to generate a sort string diff --git a/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java b/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java index 3e5415f7d4..98d5b8bbcb 100644 --- a/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java +++ b/dspace-api/src/main/java/org/dspace/browse/SolrBrowseDAO.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.UUID; import org.apache.commons.lang3.StringUtils; -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.DSpaceObject; @@ -68,7 +68,7 @@ public class SolrBrowseDAO implements BrowseDAO { /** * Log4j log */ - private static final Logger log = Logger.getLogger(SolrBrowseDAO.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrBrowseDAO.class); /** * The DSpace context diff --git a/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java b/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java index 2ae27e5ec6..6b16d51bfe 100644 --- a/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java +++ b/dspace-api/src/main/java/org/dspace/checker/CheckerCommand.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.Map; import org.apache.commons.collections4.MapUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.checker.service.ChecksumResultService; @@ -42,7 +42,7 @@ public final class CheckerCommand { /** * Usual Log4J logger. */ - private static final Logger LOG = Logger.getLogger(CheckerCommand.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(CheckerCommand.class); private Context context; diff --git a/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java b/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java index f4266a7a79..4601e3867f 100644 --- a/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java +++ b/dspace-api/src/main/java/org/dspace/checker/CheckerConsumer.java @@ -7,7 +7,7 @@ */ package org.dspace.checker; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.content.Bitstream; @@ -26,7 +26,7 @@ public class CheckerConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(CheckerConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CheckerConsumer.class); protected ChecksumHistoryService checksumHistoryService = CheckerServiceFactory.getInstance() .getChecksumHistoryService(); diff --git a/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java b/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java index 0b54ede0c5..56dabb0460 100644 --- a/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java +++ b/dspace-api/src/main/java/org/dspace/checker/DailyReportEmailer.java @@ -21,7 +21,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.SimpleReporterService; import org.dspace.core.ConfigurationManager; @@ -43,7 +43,7 @@ public class DailyReportEmailer { /** * log4j logger. */ - private static Logger log = Logger.getLogger(DailyReportEmailer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DailyReportEmailer.class); /** * Default constructor. diff --git a/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java b/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java index cec2d8f566..e68b37e180 100644 --- a/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java +++ b/dspace-api/src/main/java/org/dspace/checker/HandleDispatcher.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; @@ -35,7 +35,7 @@ public class HandleDispatcher implements BitstreamDispatcher { /** * Log 4j logger. */ - private static final Logger LOG = Logger.getLogger(HandleDispatcher.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(HandleDispatcher.class); protected Context context; diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java index f6af3d171b..5962d19f68 100644 --- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java +++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksum.java @@ -19,8 +19,8 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.dspace.content.Bitstream; /** diff --git a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java index 82a8ace677..d267171aa0 100644 --- a/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/MostRecentChecksumServiceImpl.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.dao.MostRecentChecksumDAO; import org.dspace.checker.service.ChecksumResultService; import org.dspace.checker.service.MostRecentChecksumService; @@ -28,7 +28,8 @@ import org.springframework.beans.factory.annotation.Autowired; * @author kevinvandevelde at atmire.com */ public class MostRecentChecksumServiceImpl implements MostRecentChecksumService { - private static final Logger log = Logger.getLogger(MostRecentChecksumServiceImpl.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(MostRecentChecksumServiceImpl.class); @Autowired(required = true) protected MostRecentChecksumDAO mostRecentChecksumDAO; diff --git a/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java b/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java index e0cf489d8c..358d0c4018 100644 --- a/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java +++ b/dspace-api/src/main/java/org/dspace/checker/ResultsLogger.java @@ -12,7 +12,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.core.Context; import org.dspace.core.I18nUtil; @@ -30,7 +30,7 @@ public class ResultsLogger implements ChecksumResultsCollector { /** * Usual Log4J logger. */ - private static final Logger LOG = Logger.getLogger(ResultsLogger.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(ResultsLogger.class); /** * Utility date format. diff --git a/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java b/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java index 2d595a19f8..d3c0b130da 100644 --- a/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java +++ b/dspace-api/src/main/java/org/dspace/checker/ResultsPruner.java @@ -19,7 +19,7 @@ import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.checker.factory.CheckerServiceFactory; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.core.ConfigurationManager; @@ -40,7 +40,7 @@ public final class ResultsPruner { /** * Default logger. */ - private static final Logger LOG = Logger.getLogger(ResultsPruner.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(ResultsPruner.class); /** * Factory method for the default results pruner configuration using diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java index 753bb6267d..328d4a717e 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImpl.java @@ -9,6 +9,8 @@ package org.dspace.checker.dao.impl; import java.sql.SQLException; import java.util.Date; +import javax.persistence.Query; +import javax.persistence.TemporalType; import org.dspace.checker.ChecksumHistory; import org.dspace.checker.ChecksumResultCode; @@ -16,7 +18,6 @@ import org.dspace.checker.dao.ChecksumHistoryDAO; import org.dspace.content.Bitstream; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Query; /** *

@@ -29,6 +30,8 @@ import org.hibernate.Query; * @author Grace Carpenter * @author Nathan Sarr * @author kevinvandevelde at atmire.com + * + * */ public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO implements ChecksumHistoryDAO { @@ -42,7 +45,7 @@ public class ChecksumHistoryDAOImpl extends AbstractHibernateDAO @Override public ChecksumResult findByCode(Context context, ChecksumResultCode code) throws SQLException { - Criteria criteria = createCriteria(context, ChecksumResult.class); - criteria.add(Restrictions.eq("resultCode", code)); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ChecksumResult.class); + Root checksumResultRoot = criteriaQuery.from(ChecksumResult.class); + criteriaQuery.select(checksumResultRoot); + criteriaQuery.where(criteriaBuilder.equal(checksumResultRoot.get(ChecksumResult_.resultCode), code)); + return uniqueResult(context, criteriaQuery, false, ChecksumResult.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java index 9ed89c40e9..66ce666b9d 100644 --- a/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/checker/dao/impl/MostRecentChecksumDAOImpl.java @@ -9,22 +9,27 @@ package org.dspace.checker.dao.impl; import java.sql.SQLException; import java.util.Date; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Subquery; import org.dspace.checker.ChecksumHistory; +import org.dspace.checker.ChecksumHistory_; +import org.dspace.checker.ChecksumResult; import org.dspace.checker.ChecksumResultCode; +import org.dspace.checker.ChecksumResult_; import org.dspace.checker.MostRecentChecksum; +import org.dspace.checker.MostRecentChecksum_; import org.dspace.checker.dao.MostRecentChecksumDAO; import org.dspace.content.Bitstream; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.DetachedCriteria; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Projections; -import org.hibernate.criterion.Property; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the MostRecentChecksum object. @@ -43,58 +48,58 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO findByNotProcessedInDateRange(Context context, Date startDate, Date endDate) throws SQLException { -// + "most_recent_checksum.last_process_start_date, most_recent_checksum.last_process_end_date, " -// + "most_recent_checksum.expected_checksum, most_recent_checksum.current_checksum, " -// + "result_description " -// + "from checksum_results, most_recent_checksum " -// + "where most_recent_checksum.to_be_processed = false " -// + "and most_recent_checksum.result = checksum_results.result_code " -// + "and most_recent_checksum.last_process_start_date >= ? " -// + "and most_recent_checksum.last_process_start_date < ? " -// + "order by most_recent_checksum.bitstream_id - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - criteria.add( - Restrictions.and( - Restrictions.eq("toBeProcessed", false), - Restrictions.le("processStartDate", startDate), - Restrictions.gt("processStartDate", endDate) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), false), + criteriaBuilder + .lessThanOrEqualTo(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) + ) ); - criteria.addOrder(Order.asc("bitstream.id")); - return list(criteria); + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); + criteriaQuery.orderBy(orderList); + return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } @Override public MostRecentChecksum findByBitstream(Context context, Bitstream bitstream) throws SQLException { - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - criteria.add(Restrictions.eq("bitstream", bitstream)); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery + .where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream), bitstream)); + return singleResult(context, criteriaQuery); } @Override public List findByResultTypeInDateRange(Context context, Date startDate, Date endDate, ChecksumResultCode resultCode) throws SQLException { -// "select bitstream_id, last_process_start_date, last_process_end_date, " -// + "expected_checksum, current_checksum, result_description " -// + "from most_recent_checksum, checksum_results " -// + "where most_recent_checksum.result = checksum_results.result_code " -// + "and most_recent_checksum.result= ? " -// + "and most_recent_checksum.last_process_start_date >= ? " -// + "and most_recent_checksum.last_process_start_date < ? " -// + "order by bitstream_id"; - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - criteria.add( - Restrictions.and( - Restrictions.eq("checksumResult.resultCode", resultCode), - Restrictions.le("processStartDate", startDate), - Restrictions.gt("processStartDate", endDate) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + Join mostRecentResult = + mostRecentChecksumRoot.join(MostRecentChecksum_.checksumResult); + + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(mostRecentResult.get(ChecksumResult_.resultCode), resultCode), + criteriaBuilder.lessThanOrEqualTo( + mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), startDate), + criteriaBuilder.greaterThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), endDate) + ) ); - criteria.addOrder(Order.asc("bitstream.id")); - return list(criteria); + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); + criteriaQuery.orderBy(orderList); + return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } @@ -108,42 +113,52 @@ public class MostRecentChecksumDAOImpl extends AbstractHibernateDAO criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true)); + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); + criteriaQuery.orderBy(orderList); + return singleResult(context, criteriaQuery); } @Override public MostRecentChecksum getOldestRecord(Context context, Date lessThanDate) throws SQLException { -// "select bitstream_id " -// + "from most_recent_checksum " -// + "where to_be_processed = true " -// + "and last_process_start_date < ? " -// + "order by date_trunc('milliseconds', last_process_end_date), " -// + "bitstream_id " + "ASC LIMIT 1"; - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - criteria.add( - Restrictions.and( - Restrictions.eq("toBeProcessed", true), - Restrictions.lt("processStartDate", lessThanDate) - )); - criteria.addOrder(Order.asc("processEndDate")).addOrder(Order.asc("bitstream.id")); - criteria.setMaxResults(1); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root mostRecentChecksumRoot = criteriaQuery.from(MostRecentChecksum.class); + criteriaQuery.select(mostRecentChecksumRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(mostRecentChecksumRoot.get(MostRecentChecksum_.toBeProcessed), true), + criteriaBuilder.lessThan(mostRecentChecksumRoot.get(MostRecentChecksum_.processStartDate), lessThanDate) + ) + ); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.processEndDate))); + orderList.add(criteriaBuilder.asc(mostRecentChecksumRoot.get(MostRecentChecksum_.bitstream))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } @Override public List findNotInHistory(Context context) throws SQLException { - Criteria criteria = createCriteria(context, MostRecentChecksum.class); - DetachedCriteria subCriteria = DetachedCriteria.forClass(ChecksumHistory.class); - subCriteria.setProjection(Projections.property("bitstream.id")); - criteria.add(Property.forName("bitstreamId").notIn(subCriteria)); - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MostRecentChecksum.class); + Root checksumRoot = criteriaQuery.from(MostRecentChecksum.class); + + Subquery subQuery = criteriaQuery.subquery(Bitstream.class); + Root historyRoot = subQuery.from(ChecksumHistory.class); + subQuery.select(historyRoot.get(ChecksumHistory_.bitstream)); + + criteriaQuery.where( + criteriaBuilder.not(checksumRoot.get(MostRecentChecksum_.bitstream).in(subQuery))); + + return list(context, criteriaQuery, false, MostRecentChecksum.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java index 978b3070fc..7239424d91 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamFormatServiceImpl.java @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.BitstreamFormatDAO; @@ -33,7 +33,7 @@ public class BitstreamFormatServiceImpl implements BitstreamFormatService { /** * log4j logger */ - private static Logger log = Logger.getLogger(BitstreamFormat.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormat.class); @Autowired(required = true) protected BitstreamFormatDAO bitstreamFormatDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java index dee0caf44f..34e4b88dc3 100644 --- a/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BitstreamServiceImpl.java @@ -15,8 +15,8 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -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.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.BitstreamDAO; @@ -43,7 +43,7 @@ public class BitstreamServiceImpl extends DSpaceObjectServiceImpl imp /** * log4j logger */ - private static Logger log = Logger.getLogger(BitstreamServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamServiceImpl.class); @Autowired(required = true) @@ -103,6 +103,8 @@ public class BitstreamServiceImpl extends DSpaceObjectServiceImpl imp clonedBitstream.setSizeBytes(bitstream.getSizeBytes()); clonedBitstream.setChecksum(bitstream.getChecksum()); clonedBitstream.setChecksumAlgorithm(bitstream.getChecksumAlgorithm()); + clonedBitstream.setFormat(bitstream.getBitstreamFormat()); + try { //Update our bitstream but turn off the authorization system since permissions //haven't been set at this point in time. diff --git a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java index d8ee51fadf..1e4f4daa07 100644 --- a/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/BundleServiceImpl.java @@ -16,8 +16,8 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -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.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; @@ -45,7 +45,7 @@ public class BundleServiceImpl extends DSpaceObjectServiceImpl implement /** * log4j logger */ - private static Logger log = Logger.getLogger(Bundle.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Bundle.class); @Autowired(required = true) protected BundleDAO bundleDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java index bd7034856f..d76c4798f1 100644 --- a/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CollectionServiceImpl.java @@ -20,8 +20,8 @@ import java.util.MissingResourceException; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -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.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; @@ -61,7 +61,7 @@ public class CollectionServiceImpl extends DSpaceObjectServiceImpl i /** * log4j category */ - private static final Logger log = Logger.getLogger(CollectionServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionServiceImpl.class); @Autowired(required = true) protected CollectionDAO collectionDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/Community.java b/dspace-api/src/main/java/org/dspace/content/Community.java index 4b22addd39..3c26f229b9 100644 --- a/dspace-api/src/main/java/org/dspace/content/Community.java +++ b/dspace-api/src/main/java/org/dspace/content/Community.java @@ -25,8 +25,8 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Transient; -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.logging.log4j.Logger; import org.dspace.browse.BrowsableDSpaceObject; import org.dspace.content.comparator.NameAscendingComparator; import org.dspace.content.factory.ContentServiceFactory; @@ -55,7 +55,7 @@ public class Community extends DSpaceObject implements DSpaceObjectLegacySupport /** * log4j category */ - private static final Logger log = Logger.getLogger(Community.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Community.class); @Column(name = "community_id", insertable = false, updatable = false) private Integer legacyId; @@ -110,7 +110,7 @@ public class Community extends DSpaceObject implements DSpaceObjectLegacySupport setModified(); } - void removeSubCommunity(Community subCommunity) { + public void removeSubCommunity(Community subCommunity) { subCommunities.remove(subCommunity); setModified(); } diff --git a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java index 667b0268b1..ac939434a5 100644 --- a/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/CommunityServiceImpl.java @@ -17,8 +17,8 @@ import java.util.MissingResourceException; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -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.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; @@ -51,7 +51,7 @@ public class CommunityServiceImpl extends DSpaceObjectServiceImpl imp /** * log4j category */ - private static Logger log = Logger.getLogger(CommunityServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunityServiceImpl.class); @Autowired(required = true) protected CommunityDAO communityDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/DCDate.java b/dspace-api/src/main/java/org/dspace/content/DCDate.java index 729b1d3753..4acccb2d84 100644 --- a/dspace-api/src/main/java/org/dspace/content/DCDate.java +++ b/dspace-api/src/main/java/org/dspace/content/DCDate.java @@ -18,7 +18,7 @@ import java.util.Locale; import java.util.Map; import java.util.TimeZone; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; // FIXME: Not very robust - assumes dates will always be valid @@ -45,7 +45,7 @@ public class DCDate { /** * Logger */ - private static Logger log = Logger.getLogger(DCDate.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DCDate.class); // UTC timezone private static final TimeZone utcZone = TimeZone.getTimeZone("UTC"); diff --git a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java index 165a120bb2..2756ca958b 100644 --- a/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/DSpaceObjectServiceImpl.java @@ -17,9 +17,9 @@ import java.util.Map; import java.util.StringTokenizer; import org.apache.commons.collections4.CollectionUtils; -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.authorize.AuthorizeException; import org.dspace.content.authority.Choices; import org.dspace.content.authority.service.ChoiceAuthorityService; @@ -48,7 +48,7 @@ public abstract class DSpaceObjectServiceImpl implements /** * log4j category */ - private static final Logger log = Logger.getLogger(DSpaceObjectServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceObjectServiceImpl.class); @Autowired(required = true) protected ChoiceAuthorityService choiceAuthorityService; diff --git a/dspace-api/src/main/java/org/dspace/content/ItemComparator.java b/dspace-api/src/main/java/org/dspace/content/ItemComparator.java index 27e869d40b..2daa61cf57 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemComparator.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemComparator.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; import org.dspace.sort.OrderFormat; diff --git a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java index 44c8079f5b..f4809f5ea1 100644 --- a/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/ItemServiceImpl.java @@ -17,8 +17,8 @@ import java.util.List; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -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.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeConfiguration; import org.dspace.authorize.AuthorizeException; @@ -65,7 +65,7 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It /** * log4j category */ - private static final Logger log = Logger.getLogger(Item.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Item.class); @Autowired(required = true) protected ItemDAO itemDAO; @@ -216,12 +216,6 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It return itemDAO.findBySubmitter(context, eperson); } - @Override - public List findBySubmitter(Context context, EPerson eperson, Integer limit, Integer offset) - throws SQLException { - return itemDAO.findBySubmitter(context, eperson, limit, offset); - } - @Override public Iterator findBySubmitterDateSorted(Context context, EPerson eperson, Integer limit) throws SQLException { @@ -308,11 +302,6 @@ public class ItemServiceImpl extends DSpaceObjectServiceImpl implements It return matchingBundles; } - @Override - public List getBundles(Context context, Item item, String name) throws SQLException { - return itemDAO.findBundlesByName(context, item, name); - } - @Override public void addBundle(Context context, Item item, Bundle bundle) throws SQLException, AuthorizeException { // Check authorisation diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java index c48ff015e4..e3ed9c8ae7 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataFieldServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.MetadataFieldDAO; @@ -33,7 +33,7 @@ public class MetadataFieldServiceImpl implements MetadataFieldService { /** * log4j logger */ - private static Logger log = Logger.getLogger(MetadataFieldServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldServiceImpl.class); @Autowired(required = true) protected MetadataFieldDAO metadataFieldDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java index f2b13fb8ea..185addfb01 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataSchemaServiceImpl.java @@ -10,7 +10,7 @@ package org.dspace.content; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.MetadataSchemaDAO; @@ -31,7 +31,7 @@ public class MetadataSchemaServiceImpl implements MetadataSchemaService { /** * log4j logger */ - private static Logger log = Logger.getLogger(MetadataSchemaServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java index 396265467b..e7b00ab85c 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataValueServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.MetadataValueDAO; @@ -33,7 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class MetadataValueServiceImpl implements MetadataValueService { - private static final Logger log = Logger.getLogger(MetadataValueServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataValueServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java b/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java index ce531be932..2ed10e5887 100644 --- a/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java +++ b/dspace-api/src/main/java/org/dspace/content/WorkspaceItem.java @@ -26,7 +26,7 @@ import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; import org.dspace.authorize.AuthorizeException; import org.dspace.browse.BrowsableDSpaceObject; import org.dspace.content.factory.ContentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java index fbe6bb0f2b..57a3c00695 100644 --- a/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/WorkspaceItemServiceImpl.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInputsReaderException; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; @@ -40,7 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class WorkspaceItemServiceImpl implements WorkspaceItemService { - private static final Logger log = Logger.getLogger(WorkspaceItemServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemServiceImpl.class); @Autowired(required = true) protected WorkspaceItemDAO workspaceItemDAO; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java index e90e93e864..c6fe528fdb 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/ChoiceAuthorityServiceImpl.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; @@ -49,7 +49,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @see ChoiceAuthority */ public final class ChoiceAuthorityServiceImpl implements ChoiceAuthorityService { - private Logger log = Logger.getLogger(ChoiceAuthorityServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(ChoiceAuthorityServiceImpl.class); // map of field key to authority plugin protected Map controller = new HashMap(); @@ -264,39 +264,42 @@ public final class ChoiceAuthorityServiceImpl implements ChoiceAuthorityService try { DCInputsReader dcInputsReader = new DCInputsReader(); for (DCInputSet dcinputSet : dcInputsReader.getAllInputs(Integer.MAX_VALUE, 0)) { - DCInput[] dcinputs = dcinputSet.getFields(); - for (DCInput dcinput : dcinputs) { - if (StringUtils.isNotBlank(dcinput.getPairsType()) - || StringUtils.isNotBlank(dcinput.getVocabulary())) { - String authorityName = dcinput.getPairsType(); - if (StringUtils.isBlank(authorityName)) { - authorityName = dcinput.getVocabulary(); - } - if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { - String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), - dcinput.getQualifier()); - ChoiceAuthority ca = controller.get(authorityName); - if (ca == null) { - InputFormSelfRegisterWrapperAuthority ifa = new InputFormSelfRegisterWrapperAuthority(); - if (controller.containsKey(fieldKey)) { - ifa = (InputFormSelfRegisterWrapperAuthority) controller.get(fieldKey); + DCInput[][] dcinputs = dcinputSet.getFields(); + for (DCInput[] dcrows : dcinputs) { + for (DCInput dcinput : dcrows) { + if (StringUtils.isNotBlank(dcinput.getPairsType()) + || StringUtils.isNotBlank(dcinput.getVocabulary())) { + String authorityName = dcinput.getPairsType(); + if (StringUtils.isBlank(authorityName)) { + authorityName = dcinput.getVocabulary(); + } + if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { + String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), + dcinput.getQualifier()); + ChoiceAuthority ca = controller.get(authorityName); + if (ca == null) { + InputFormSelfRegisterWrapperAuthority ifa = new + InputFormSelfRegisterWrapperAuthority(); + if (controller.containsKey(fieldKey)) { + ifa = (InputFormSelfRegisterWrapperAuthority) controller.get(fieldKey); + } + + ChoiceAuthority ma = (ChoiceAuthority) pluginService + .getNamedPlugin(ChoiceAuthority.class, authorityName); + if (ma == null) { + log.warn("Skipping invalid configuration for " + fieldKey + + " because named plugin not found: " + authorityName); + continue; + } + ifa.getDelegates().put(dcinputSet.getFormName(), ma); + controller.put(fieldKey, ifa); } - ChoiceAuthority ma = (ChoiceAuthority) pluginService - .getNamedPlugin(ChoiceAuthority.class, authorityName); - if (ma == null) { - log.warn("Skipping invalid configuration for " + fieldKey - + " because named plugin not found: " + authorityName); - continue; + if (!authorities.containsKey(authorityName)) { + authorities.put(authorityName, fieldKey); } - ifa.getDelegates().put(dcinputSet.getFormName(), ma); - controller.put(fieldKey, ifa); - } - if (!authorities.containsKey(authorityName)) { - authorities.put(authorityName, fieldKey); } - } } } diff --git a/dspace-api/src/main/java/org/dspace/content/authority/Choices.java b/dspace-api/src/main/java/org/dspace/content/authority/Choices.java index ab5fa162cd..534e3083da 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/Choices.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/Choices.java @@ -7,7 +7,7 @@ */ package org.dspace.content.authority; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; /** * Record class to hold a set of Choices returned by an authority in response diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java index bf01f37f02..a64ebdd971 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/DCInputAuthority.java @@ -12,8 +12,8 @@ import java.util.Arrays; import java.util.Iterator; import java.util.List; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.content.Collection; @@ -42,7 +42,7 @@ import org.dspace.core.SelfNamedPlugin; * fields. */ public class DCInputAuthority extends SelfNamedPlugin implements ChoiceAuthority { - private static Logger log = Logger.getLogger(DCInputAuthority.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DCInputAuthority.class); private String values[] = null; private String labels[] = null; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java index 70159c89dd..516b9a06ae 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/DSpaceControlledVocabulary.java @@ -16,9 +16,9 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; -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.core.SelfNamedPlugin; import org.dspace.services.ConfigurationService; @@ -56,7 +56,7 @@ import org.xml.sax.InputSource; public class DSpaceControlledVocabulary extends SelfNamedPlugin implements ChoiceAuthority { - private static Logger log = Logger.getLogger(DSpaceControlledVocabulary.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceControlledVocabulary.class); protected static String xpathTemplate = "//node[contains(translate(@label,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'," + "'abcdefghijklmnopqrstuvwxyz'),'%s')]"; protected static String idTemplate = "//node[@id = '%s']"; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java index acfe4292f6..60c3403728 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/InputFormSelfRegisterWrapperAuthority.java @@ -13,8 +13,8 @@ import java.util.HashSet; import java.util.Map; 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.util.DCInputsReader; import org.dspace.app.util.DCInputsReaderException; import org.dspace.content.Collection; @@ -32,7 +32,8 @@ import org.dspace.content.Collection; */ public class InputFormSelfRegisterWrapperAuthority implements ChoiceAuthority { - private static Logger log = Logger.getLogger(InputFormSelfRegisterWrapperAuthority.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(InputFormSelfRegisterWrapperAuthority.class); private Map delegates = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java index 77da8400ea..66bb7f1832 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/LCNameAuthority.java @@ -22,7 +22,7 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DCPersonName; import org.dspace.core.ConfigurationManager; @@ -57,7 +57,7 @@ import org.xml.sax.helpers.DefaultHandler; * @version $Revision $ */ public class LCNameAuthority implements ChoiceAuthority { - private static final Logger log = Logger.getLogger(LCNameAuthority.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LCNameAuthority.class); // get these from configuration protected static String url = null; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java index 5ad3e91a16..6a5b17a029 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/MetadataAuthorityServiceImpl.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; @@ -57,7 +57,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @see Choices */ public class MetadataAuthorityServiceImpl implements MetadataAuthorityService { - private static Logger log = Logger.getLogger(MetadataAuthorityServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataAuthorityServiceImpl.class); @Autowired(required = true) protected MetadataFieldService metadataFieldService; @@ -235,21 +235,23 @@ public class MetadataAuthorityServiceImpl implements MetadataAuthorityService { try { DCInputsReader dcInputsReader = new DCInputsReader(); for (DCInputSet dcinputSet : dcInputsReader.getAllInputs(Integer.MAX_VALUE, 0)) { - DCInput[] dcinputs = dcinputSet.getFields(); - for (DCInput dcinput : dcinputs) { - if (StringUtils.isNotBlank(dcinput.getPairsType()) - || StringUtils.isNotBlank(dcinput.getVocabulary())) { - String authorityName = dcinput.getPairsType(); - if (StringUtils.isBlank(authorityName)) { - authorityName = dcinput.getVocabulary(); - } - if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { - String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), - dcinput.getQualifier()); - boolean req = ConfigurationManager - .getBooleanProperty("authority.required." + fieldKey, false); - controlled.put(fieldKey, true); - isAuthorityRequired.put(fieldKey, req); + DCInput[][] dcinputs = dcinputSet.getFields(); + for (DCInput[] dcrows : dcinputs) { + for (DCInput dcinput : dcrows) { + if (StringUtils.isNotBlank(dcinput.getPairsType()) + || StringUtils.isNotBlank(dcinput.getVocabulary())) { + String authorityName = dcinput.getPairsType(); + if (StringUtils.isBlank(authorityName)) { + authorityName = dcinput.getVocabulary(); + } + if (!StringUtils.equals(dcinput.getInputType(), "qualdrop_value")) { + String fieldKey = makeFieldKey(dcinput.getSchema(), dcinput.getElement(), + dcinput.getQualifier()); + boolean req = ConfigurationManager + .getBooleanProperty("authority.required." + fieldKey, false); + controlled.put(fieldKey, true); + isAuthorityRequired.put(fieldKey, req); + } } } } diff --git a/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java b/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java index 5bc94bf06a..5f0af29760 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/SHERPARoMEOProtocol.java @@ -19,7 +19,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.core.ConfigurationManager; import org.xml.sax.Attributes; @@ -50,7 +50,7 @@ import org.xml.sax.helpers.DefaultHandler; * @see SHERPARoMEOJournalTitle */ public abstract class SHERPARoMEOProtocol implements ChoiceAuthority { - private static final Logger log = Logger.getLogger(SHERPARoMEOProtocol.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SHERPARoMEOProtocol.class); // contact URL from configuration private static String url = null; diff --git a/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java index e6dbe45cc0..159f2901d0 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/SolrAuthority.java @@ -12,8 +12,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -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.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; @@ -36,10 +36,12 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class SolrAuthority implements ChoiceAuthority { - private static final Logger log = Logger.getLogger(SolrAuthority.class); protected SolrAuthorityInterface source = DSpaceServicesFactory.getInstance().getServiceManager() .getServiceByName("AuthoritySource", SolrAuthorityInterface.class); + + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrAuthority.class); + protected boolean externalResults = false; protected final AuthorityValueService authorityValueService = AuthorityServiceFactory.getInstance() .getAuthorityValueService(); diff --git a/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java b/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java index 8c3c94e5f1..a017e8fe28 100644 --- a/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java +++ b/dspace-api/src/main/java/org/dspace/content/authority/TestAuthority.java @@ -10,7 +10,7 @@ package org.dspace.content.authority; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.Collection; /** diff --git a/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java b/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java index 980554228b..3240824169 100644 --- a/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java +++ b/dspace-api/src/main/java/org/dspace/content/comparator/NameAscendingComparator.java @@ -9,8 +9,8 @@ package org.dspace.content.comparator; import java.util.Comparator; -import org.apache.commons.lang.ObjectUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; public class NameAscendingComparator implements Comparator { diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java index 3f109d9a1e..d7ee2630e9 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/AIPTechMDCrosswalk.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -72,7 +72,7 @@ public class AIPTechMDCrosswalk implements IngestionCrosswalk, DisseminationCros /** * log4j category */ - private static Logger log = Logger.getLogger(AIPTechMDCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AIPTechMDCrosswalk.class); protected final BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() .getBitstreamFormatService(); protected final SiteService siteService = ContentServiceFactory.getInstance().getSiteService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java index d530f55905..9042a3a7f5 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamDisseminationCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; @@ -35,7 +35,8 @@ public class CreativeCommonsRDFStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(CreativeCommonsRDFStreamDisseminationCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamDisseminationCrosswalk.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java index d011202921..a5d503b6c2 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsRDFStreamIngestionCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -38,7 +38,8 @@ public class CreativeCommonsRDFStreamIngestionCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(CreativeCommonsRDFStreamIngestionCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsRDFStreamIngestionCrosswalk.class); protected CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java index bf6d97fbea..6d7becba42 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/CreativeCommonsTextStreamDisseminationCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; @@ -42,7 +42,8 @@ public class CreativeCommonsTextStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(CreativeCommonsTextStreamDisseminationCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsTextStreamDisseminationCrosswalk.class); @Override public boolean canDisseminate(Context context, DSpaceObject dso) { diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java index 05560f0b32..3f4d6bd44e 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/DIMDisseminationCrosswalk.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java index da10a212ec..75b884613d 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamDisseminationCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.io.OutputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.DSpaceObject; @@ -34,7 +34,8 @@ public class LicenseStreamDisseminationCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(LicenseStreamDisseminationCrosswalk.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(LicenseStreamDisseminationCrosswalk.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); @Override diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java index fb3653b4db..a7dcae944c 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/LicenseStreamIngestionCrosswalk.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -39,7 +39,7 @@ public class LicenseStreamIngestionCrosswalk /** * log4j logger */ - private static Logger log = Logger.getLogger(LicenseStreamIngestionCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseStreamIngestionCrosswalk.class); @Override public void ingest(Context context, DSpaceObject dso, InputStream in, String MIMEType) diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java index efe24b63d5..c3b20bccb1 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSDisseminationCrosswalk.java @@ -13,7 +13,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.packager.PackageDisseminator; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java index 4b76afd90b..559d463be2 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/METSRightsCrosswalk.java @@ -17,9 +17,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -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.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.factory.AuthorizeServiceFactory; @@ -61,7 +61,7 @@ public class METSRightsCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(METSRightsCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(METSRightsCrosswalk.class); private static final Namespace METSRights_NS = Namespace.getNamespace("rights", "http://cosimo.stanford.edu/sdr/metsrights/"); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java index 1258408493..ddf773dcec 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/MODSDisseminationCrosswalk.java @@ -20,8 +20,8 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -90,7 +90,7 @@ public class MODSDisseminationCrosswalk extends SelfNamedPlugin /** * log4j category */ - private static Logger log = Logger.getLogger(MODSDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(MODSDisseminationCrosswalk.class); private static final String CONFIG_PREFIX = "crosswalk.mods.properties."; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java index f5cffdba15..994e15601d 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/NullIngestionCrosswalk.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; @@ -43,7 +43,7 @@ public class NullIngestionCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(NullIngestionCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(NullIngestionCrosswalk.class); private static XMLOutputter outputPretty = new XMLOutputter(Format.getPrettyFormat()); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java index aad95da99a..af9c64b858 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREDisseminationCrosswalk.java @@ -16,7 +16,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java index 98a54ff624..6d7c716189 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/OREIngestionCrosswalk.java @@ -20,7 +20,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -54,7 +54,7 @@ public class OREIngestionCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(OREDisseminationCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(OREDisseminationCrosswalk.class); /* Namespaces */ public static final Namespace ATOM_NS = diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java index 0f3aa991cd..9f927244c9 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/PREMISCrosswalk.java @@ -13,9 +13,9 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -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.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -48,7 +48,7 @@ public class PREMISCrosswalk /** * log4j category */ - private static Logger log = Logger.getLogger(PREMISCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(PREMISCrosswalk.class); private static final Namespace PREMIS_NS = Namespace.getNamespace("premis", "http://www.loc.gov/standards/premis"); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java index a20699bf1a..630d1d45ef 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/QDCCrosswalk.java @@ -19,8 +19,8 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -97,7 +97,7 @@ public class QDCCrosswalk extends SelfNamedPlugin /** * log4j category */ - private static Logger log = Logger.getLogger(QDCCrosswalk.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(QDCCrosswalk.class); // map of qdc to JDOM Element private Map qdc2element = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java index 789fa9d6fb..c9a9ddd900 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/SimpleDCDisseminationCrosswalk.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java index c16a78f376..bc153e9426 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XHTMLHeadDisseminationCrosswalk.java @@ -19,7 +19,8 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -65,8 +66,7 @@ public class XHTMLHeadDisseminationCrosswalk extends SelfNamedPlugin implements /** * log4j logger */ - private static Logger log = Logger - .getLogger(XHTMLHeadDisseminationCrosswalk.class); + private static Logger log = LogManager.getLogger(XHTMLHeadDisseminationCrosswalk.class); /** * Location of config file diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java index 9e505ed87a..a64fd47623 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTDisseminationCrosswalk.java @@ -22,7 +22,7 @@ import java.util.Map; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java index de479a4647..3a5122b2de 100644 --- a/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java +++ b/dspace-api/src/main/java/org/dspace/content/crosswalk/XSLTIngestionCrosswalk.java @@ -15,8 +15,8 @@ import java.util.List; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -55,7 +55,7 @@ public class XSLTIngestionCrosswalk /** * log4j category */ - private static final Logger log = Logger.getLogger(XSLTIngestionCrosswalk.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(XSLTIngestionCrosswalk.class); private static final String DIRECTION = "submission"; diff --git a/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java b/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java index e5a0f5a4e1..8b1aa713e2 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/ItemDAO.java @@ -13,7 +13,6 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; -import org.dspace.content.Bundle; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -133,11 +132,6 @@ public interface ItemDAO extends DSpaceObjectLegacySupportDAO { */ int countItems(Context context, boolean includeArchived, boolean includeWithdrawn) throws SQLException; - public List findBundlesByName(Context context, Item item, String name) throws SQLException; - - public List findBySubmitter(Context context, EPerson eperson, Integer limit, Integer offset) - throws SQLException; - public int countItems(Context context, EPerson submitter, boolean includeArchived, boolean includeWithdrawn) throws SQLException; diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java index fff7c42206..02e3509c31 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamDAOImpl.java @@ -8,10 +8,17 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.Bitstream; +import org.dspace.content.Bitstream_; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -19,9 +26,6 @@ import org.dspace.content.dao.BitstreamDAO; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Constants; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Bitstream object. @@ -38,40 +42,35 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public List findDeletedBitstreams(Context context) throws SQLException { - Criteria criteria = createCriteria(context, Bitstream.class); - criteria.add(Restrictions.eq("deleted", true)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); + Root bitstreamRoot = criteriaQuery.from(Bitstream.class); + criteriaQuery.select(bitstreamRoot); + criteriaQuery.where(criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.deleted), true)); + return list(context, criteriaQuery, false, Bitstream.class, -1, -1); } @Override public List findDuplicateInternalIdentifier(Context context, Bitstream bitstream) throws SQLException { - Criteria criteria = createCriteria(context, Bitstream.class); - criteria.add(Restrictions.and( - Restrictions.eq("internalId", bitstream.getInternalId()), - Restrictions.not(Restrictions.eq("id", bitstream.getID())) - )); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Bitstream.class); + Root bitstreamRoot = criteriaQuery.from(Bitstream.class); + criteriaQuery.select(bitstreamRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.internalId), bitstream.getInternalId()), + criteriaBuilder.notEqual(bitstreamRoot.get(Bitstream_.id), bitstream.getID()) + ) + ); + return list(context, criteriaQuery, false, Bitstream.class, -1, -1); } @Override public List findBitstreamsWithNoRecentChecksum(Context context) throws SQLException { -// "select bitstream.deleted, bitstream.store_number, bitstream.size_bytes, " -// + "bitstreamformatregistry.short_description, bitstream.bitstream_id, " -// + "bitstream.user_format_description, bitstream.internal_id, " -// + "bitstream.source, bitstream.checksum_algorithm, bitstream.checksum, " -// + "bitstream.name, bitstream.description " -// + "from bitstream left outer join bitstreamformatregistry on " -// + "bitstream.bitstream_format_id = bitstreamformatregistry.bitstream_format_id " -// + "where not exists( select 'x' from most_recent_checksum " -// + "where most_recent_checksum.bitstream_id = bitstream.bitstream_id )" - Query query = createQuery(context, "select b from Bitstream b where b not in (select c.bitstream from " + "MostRecentChecksum c)"); - return query.list(); + return query.getResultList(); } @Override @@ -122,9 +121,14 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Long countByStoreNumber(Context context, Integer storeNumber) throws SQLException { - Criteria criteria = createCriteria(context, Bitstream.class); - criteria.add(Restrictions.eq("storeNumber", storeNumber)); - return countLong(criteria); + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root bitstreamRoot = criteriaQuery.from(Bitstream.class); + criteriaQuery.where(criteriaBuilder.equal(bitstreamRoot.get(Bitstream_.storeNumber), storeNumber)); + return countLong(context, criteriaQuery, criteriaBuilder, bitstreamRoot); } @Override @@ -158,9 +162,8 @@ public class BitstreamDAOImpl extends AbstractHibernateDSODAO impleme @Override public Iterator findAll(Context context, int limit, int offset) throws SQLException { - Query query = createQuery(context, "select b FROM Bitstream b"); - query.setFirstResult(offset); - query.setMaxResults(limit); - return iterate(query); + Map map = new HashMap<>(); + return findByX(context, Bitstream.class, map, true, limit, offset).iterator(); + } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java index 51b0af51de..0824c5c343 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/BitstreamFormatDAOImpl.java @@ -8,16 +8,18 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.BitstreamFormat; +import org.dspace.content.BitstreamFormat_; import org.dspace.content.dao.BitstreamFormatDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the BitstreamFormat object. @@ -37,11 +39,14 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAOnull if - * there's no bitstream format with the given MIMEtype. + * there's no bitstream format with the given MIMEtype. * @throws SQLException if database error */ @Override @@ -49,33 +54,39 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), includeInternal), + criteriaBuilder.like(bitstreamFormatRoot.get(BitstreamFormat_.mimetype), mimeType) + ) + ); + return singleResult(context, criteriaQuery); } /** * Find a bitstream format by its (unique) short description * - * @param context DSpace context object - * @param desc the short description + * @param context + * DSpace context object + * @param desc + * the short description + * * @return the corresponding bitstream format, or null if - * there's no bitstream format with the given short description + * there's no bitstream format with the given short description * @throws SQLException if database error */ @Override public BitstreamFormat findByShortDescription(Context context, String desc) throws SQLException { - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.add(Restrictions.and( - Restrictions.eq("shortDescription", desc) - )); - - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + criteriaQuery.where(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription), desc)); + return uniqueResult(context, criteriaQuery, false, BitstreamFormat.class, -1, -1); } @Override @@ -93,14 +104,28 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO findNonInternal(Context context) throws SQLException { - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.add(Restrictions.and( - Restrictions.eq("internal", false), - Restrictions.not(Restrictions.like("shortDescription", "Unknown")) - )); - criteria.addOrder(Order.desc("supportLevel")).addOrder(Order.asc("shortDescription")); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(bitstreamFormatRoot.get(BitstreamFormat_.internal), false), + criteriaBuilder.not( + criteriaBuilder + .like(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription), + "Unknown")) + ) + ); + + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(bitstreamFormatRoot.get(BitstreamFormat_.supportLevel))); + orderList.add(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.shortDescription))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, BitstreamFormat.class, -1, -1); } @@ -110,17 +135,22 @@ public class BitstreamFormatDAOImpl extends AbstractHibernateDAO findAll(Context context, Class clazz) throws SQLException { - Criteria criteria = createCriteria(context, BitstreamFormat.class); - criteria.addOrder(Order.asc("id")); - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BitstreamFormat.class); + Root bitstreamFormatRoot = criteriaQuery.from(BitstreamFormat.class); + criteriaQuery.select(bitstreamFormatRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(bitstreamFormatRoot.get(BitstreamFormat_.id))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, BitstreamFormat.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java index 14b1587315..9180fb3c09 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CollectionDAOImpl.java @@ -8,11 +8,22 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.AbstractMap; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; import org.dspace.content.Collection; +import org.dspace.content.Collection_; import org.dspace.content.Item; import org.dspace.content.MetadataField; import org.dspace.content.dao.CollectionDAO; @@ -21,11 +32,6 @@ import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; -import org.hibernate.transform.BasicTransformerAdapter; /** * Hibernate implementation of the Database Access Object interface class for the Collection object. @@ -43,8 +49,9 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple * Get all collections in the system. These are alphabetically sorted by * collection name. * - * @param context DSpace context object - * @param order order by MetadataField + * @param context + * DSpace context object + * @param order order by MetadataField * @return the collections in the system * @throws SQLException if database error */ @@ -75,77 +82,54 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple @Override public Collection findByTemplateItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, Collection.class); - criteria.add(Restrictions.eq("template_item", item)); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); + Root collectionRoot = criteriaQuery.from(Collection.class); + criteriaQuery.select(collectionRoot); + criteriaQuery.where(criteriaBuilder.equal(collectionRoot.get(Collection_.template), item)); + return uniqueResult(context, criteriaQuery, false, Collection.class, -1, -1); } @Override public Collection findByGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, Collection.class); - criteria.add( - Restrictions.or( - Restrictions.eq("workflowStep1", group), - Restrictions.eq("workflowStep2", group), - Restrictions.eq("workflowStep3", group), - Restrictions.eq("submitters", group), - Restrictions.eq("admins", group) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); + Root collectionRoot = criteriaQuery.from(Collection.class); + criteriaQuery.select(collectionRoot); + criteriaQuery + .where(criteriaBuilder.or(criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep1), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep2), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.workflowStep3), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.submitters), group), + criteriaBuilder.equal(collectionRoot.get(Collection_.admins), group) + ) ); - return singleResult(criteria); + return singleResult(context, criteriaQuery); } @Override public List findAuthorized(Context context, EPerson ePerson, List actions) throws SQLException { - // TableRowIterator tri = DatabaseManager.query(context, -// "SELECT * FROM collection, resourcepolicy, eperson " + -// "WHERE resourcepolicy.resource_id = collection.collection_id AND " + -// "eperson.eperson_id = resourcepolicy.eperson_id AND "+ -// "resourcepolicy.resource_type_id = 3 AND "+ -// "( resourcepolicy.action_id = 3 OR resourcepolicy.action_id = 11 ) AND "+ -// "eperson.eperson_id = ?", context.getCurrentUser().getID()); - - Criteria criteria = createCriteria(context, Collection.class); - criteria.createAlias("resourcePolicies", "resourcePolicy"); - - Disjunction actionQuery = Restrictions.or(); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Collection.class); + Root collectionRoot = criteriaQuery.from(Collection.class); + Join join = collectionRoot.join("resourcePolicies"); + List orPredicates = new LinkedList(); for (Integer action : actions) { - actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); + orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - criteria.add(Restrictions.and( - Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COLLECTION), - Restrictions.eq("resourcePolicy.eperson", ePerson), - actionQuery - )); - criteria.setCacheable(true); - - return list(criteria); + Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); + criteriaQuery.select(collectionRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COLLECTION), + criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), + orPredicate)); + return list(context, criteriaQuery, true, Collection.class, -1, -1); } @Override public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) throws SQLException { - // TableRowIterator tri = DatabaseManager.query(context, - // "SELECT \n" + - // " * \n" + - // "FROM \n" + - // " public.eperson, \n" + - // " public.epersongroup2eperson, \n" + - // " public.epersongroup, \n" + - // " public.group2group, \n" + - // " public.resourcepolicy rp_parent, \n" + - // " public.collection\n" + - // "WHERE \n" + - // " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + - // " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + - // " group2group.child_id = epersongroup.eperson_group_id AND\n" + - // " rp_parent.epersongroup_id = group2group.parent_id AND\n" + - // " collection.collection_id = rp_parent.resource_id AND\n" + - // " eperson.eperson_id = ? AND \n" + - // " (rp_parent.action_id = 3 OR \n" + - // " rp_parent.action_id = 11 \n" + - // " ) AND rp_parent.resource_type_id = 3;", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Collection c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { @@ -159,11 +143,11 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple query.append( " AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in " + "elements(epeople))"); - Query hibernateQuery = createQuery(context, query.toString()); - hibernateQuery.setParameter("eperson_id", ePerson.getID()); - hibernateQuery.setCacheable(true); + Query persistenceQuery = createQuery(context, query.toString()); + persistenceQuery.setParameter("eperson_id", ePerson.getID()); + persistenceQuery.setHint("org.hibernate.cacheable", Boolean.TRUE); - return list(hibernateQuery); + return list(persistenceQuery); } @@ -185,12 +169,12 @@ public class CollectionDAOImpl extends AbstractHibernateDSODAO imple String q = "select col as collection, sum(bit.sizeBytes) as totalBytes from Item i join i.collections col " + "join i.bundles bun join bun.bitstreams bit group by col"; Query query = createQuery(context, q); - query.setResultTransformer(new BasicTransformerAdapter() { - @Override - public Object transformTuple(Object[] tuple, String[] aliases) { - return new java.util.AbstractMap.SimpleImmutableEntry<>((Collection) tuple[0], (Long) tuple[1]); - } - }); - return ((List>) query.list()); + + List list = query.getResultList(); + List> returnList = new LinkedList<>(); + for (Object[] o : list) { + returnList.add(new AbstractMap.SimpleEntry<>((Collection) o[0], (Long) o[1])); + } + return returnList; } -} +} \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java index 36d2888e01..67bbd18d91 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/CommunityDAOImpl.java @@ -10,9 +10,19 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; import java.util.Arrays; import java.util.Collections; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import org.dspace.authorize.ResourcePolicy; +import org.dspace.authorize.ResourcePolicy_; import org.dspace.content.Community; +import org.dspace.content.Community_; import org.dspace.content.MetadataField; import org.dspace.content.dao.CommunityDAO; import org.dspace.core.AbstractHibernateDSODAO; @@ -20,10 +30,6 @@ import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Community object. @@ -41,8 +47,9 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme * Get a list of all communities in the system. These are alphabetically * sorted by community name. * - * @param context DSpace context object + * @param context DSpace context object * @param sortField sort field + * * @return the communities in the system * @throws SQLException if database error */ @@ -73,9 +80,12 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme @Override public Community findByAdminGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, Community.class); - criteria.add(Restrictions.eq("admins", group)); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Community.class); + Root communityRoot = criteriaQuery.from(Community.class); + criteriaQuery.select(communityRoot); + criteriaQuery.where(criteriaBuilder.equal(communityRoot.get(Community_.admins), group)); + return singleResult(context, criteriaQuery); } @Override @@ -88,7 +98,8 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme Query query = createQuery(context, queryBuilder.toString()); query.setParameter(sortField.toString(), sortField.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); + return findMany(context, query); } @@ -115,42 +126,29 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser() .getID()); */ - Criteria criteria = createCriteria(context, Community.class); - criteria.createAlias("resourcePolicies", "resourcePolicy"); - Disjunction actionQuery = Restrictions.or(); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Community.class); + Root communityRoot = criteriaQuery.from(Community.class); + Join join = communityRoot.join("resourcePolicies"); + List orPredicates = new LinkedList(); for (Integer action : actions) { - actionQuery.add(Restrictions.eq("resourcePolicy.actionId", action)); + orPredicates.add(criteriaBuilder.equal(join.get(ResourcePolicy_.actionId), action)); } - criteria.add(Restrictions.and( - Restrictions.eq("resourcePolicy.resourceTypeId", Constants.COMMUNITY), - Restrictions.eq("resourcePolicy.eperson", ePerson), - actionQuery - )); - criteria.setCacheable(true); - - return list(criteria); + Predicate orPredicate = criteriaBuilder.or(orPredicates.toArray(new Predicate[] {})); + criteriaQuery.select(communityRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(join.get(ResourcePolicy_.resourceTypeId), Constants.COMMUNITY), + criteriaBuilder.equal(join.get(ResourcePolicy_.eperson), ePerson), + orPredicate + ) + ); + return list(context, criteriaQuery, true, Community.class, -1, -1); } @Override public List findAuthorizedByGroup(Context context, EPerson ePerson, List actions) throws SQLException { -// "SELECT \n" + -// " * \n" + -// "FROM \n" + -// " public.eperson, \n" + -// " public.epersongroup2eperson, \n" + -// " public.epersongroup, \n" + -// " public.community, \n" + -// " public.resourcepolicy\n" + -// "WHERE \n" + -// " epersongroup2eperson.eperson_id = eperson.eperson_id AND\n" + -// " epersongroup.eperson_group_id = epersongroup2eperson.eperson_group_id AND\n" + -// " resourcepolicy.epersongroup_id = epersongroup.eperson_group_id AND\n" + -// " resourcepolicy.resource_id = community.community_id AND\n" + -// " ( resourcepolicy.action_id = 3 OR \n" + -// " resourcepolicy.action_id = 11) AND \n" + -// " resourcepolicy.resource_type_id = 4 AND eperson.eperson_id = ?", context.getCurrentUser().getID()); StringBuilder query = new StringBuilder(); query.append("select c from Community c join c.resourcePolicies rp join rp.epersonGroup rpGroup WHERE "); for (int i = 0; i < actions.size(); i++) { @@ -164,11 +162,12 @@ public class CommunityDAOImpl extends AbstractHibernateDSODAO impleme query.append( " AND rp.epersonGroup.id IN (select g.id from Group g where (from EPerson e where e.id = :eperson_id) in " + "elements(epeople))"); - Query hibernateQuery = createQuery(context, query.toString()); - hibernateQuery.setParameter("eperson_id", ePerson.getID()); - hibernateQuery.setCacheable(true); + Query persistenceQuery = createQuery(context, query.toString()); + persistenceQuery.setParameter("eperson_id", ePerson.getID()); - return list(hibernateQuery); + persistenceQuery.setHint("org.hibernate.cacheable", Boolean.TRUE); + + return list(persistenceQuery); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java index 1877b52f15..d02fd77a15 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/ItemDAOImpl.java @@ -13,10 +13,10 @@ import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.UUID; +import javax.persistence.Query; +import javax.persistence.TemporalType; -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; -import org.dspace.content.Bundle; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.MetadataField; @@ -26,9 +26,8 @@ import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.hibernate.Criteria; -import org.hibernate.Query; +import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria; -import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Property; import org.hibernate.criterion.Restrictions; @@ -43,7 +42,7 @@ import org.hibernate.type.StandardBasicTypes; * @author kevinvandevelde at atmire.com */ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDAO { - private static final Logger log = Logger.getLogger(ItemDAOImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemDAOImpl.class); protected ItemDAOImpl() { super(); @@ -92,7 +91,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA query.setParameter("withdrawn", withdrawn); query.setParameter("discoverable", discoverable); if (lastModified != null) { - query.setTimestamp("last_modified", lastModified); + query.setParameter("last_modified", lastModified, TemporalType.TIMESTAMP); } return iterate(query); } @@ -142,14 +141,68 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA return iterate(query); } - enum OP { equals, not_equals, like, not_like, contains, doesnt_contain, exists, doesnt_exist, matches, - doesnt_match } + enum OP { + equals { + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").eq(val); + } + }, + not_equals { + public Criterion buildPredicate(String val, String regexClause) { + return OP.equals.buildPredicate(val, regexClause); + } + }, + like { + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").like(val); + } + }, + not_like { + public Criterion buildPredicate(String val, String regexClause) { + return OP.like.buildPredicate(val, regexClause); + } + }, + contains { + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").like("%" + val + "%"); + } + }, + doesnt_contain { + public Criterion buildPredicate(String val, String regexClause) { + return OP.contains.buildPredicate(val, regexClause); + } + }, + exists { + public Criterion buildPredicate(String val, String regexClause) { + return Property.forName("mv.value").isNotNull(); + } + }, + doesnt_exist { + public Criterion buildPredicate(String val, String regexClause) { + return OP.exists.buildPredicate(val, regexClause); + } + }, + matches { + public Criterion buildPredicate(String val, String regexClause) { + return Restrictions.sqlRestriction(regexClause, val, StandardBasicTypes.STRING); + } + }, + doesnt_match { + public Criterion buildPredicate(String val, String regexClause) { + return OP.matches.buildPredicate(val, regexClause); + } + + }; + public abstract Criterion buildPredicate(String val, String regexClause); + } @Override + @Deprecated public Iterator findByMetadataQuery(Context context, List> listFieldList, List query_op, List query_val, List collectionUuids, String regexClause, int offset, int limit) throws SQLException { - Criteria criteria = createCriteria(context, Item.class, "item"); + + Criteria criteria = getHibernateSession(context).createCriteria(Item.class, "item"); criteria.setFirstResult(offset); criteria.setMaxResults(limit); @@ -186,20 +239,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA subcriteria.add(Restrictions.in("metadataField", listFieldList.get(i))); } - sb.append(op.name() + " "); - if (op == OP.equals || op == OP.not_equals) { - subcriteria.add(Property.forName("mv.value").eq(query_val.get(i))); - sb.append(query_val.get(i)); - } else if (op == OP.like || op == OP.not_like) { - subcriteria.add(Property.forName("mv.value").like(query_val.get(i))); - sb.append(query_val.get(i)); - } else if (op == OP.contains || op == OP.doesnt_contain) { - subcriteria.add(Property.forName("mv.value").like("%" + query_val.get(i) + "%")); - sb.append(query_val.get(i)); - } else if (op == OP.matches || op == OP.doesnt_match) { - subcriteria.add(Restrictions.sqlRestriction(regexClause, query_val.get(i), StandardBasicTypes.STRING)); - sb.append(query_val.get(i)); - } + subcriteria.add(op.buildPredicate(query_val.get(i), regexClause)); if (op == OP.exists || op == OP.equals || op == OP.like || op == OP.contains || op == OP.matches) { criteria.add(Subqueries.exists(subcriteria)); @@ -209,7 +249,8 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA } log.debug(String.format("Running custom query with %d filters", index)); - return list(criteria).iterator(); + return ((List) criteria.list()).iterator(); + } @Override @@ -288,7 +329,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA Query query = createQuery(context, "select count(distinct i) from Item i " + "join i.collections collection " + "WHERE collection IN (:collections) AND i.inArchive=:in_archive AND i.withdrawn=:withdrawn"); - query.setParameterList("collections", collections); + query.setParameter("collections", collections); query.setParameter("in_archive", includeArchived); query.setParameter("withdrawn", includeWithdrawn); @@ -299,7 +340,7 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA public Iterator findByLastModifiedSince(Context context, Date since) throws SQLException { Query query = createQuery(context, "SELECT i FROM item i WHERE last_modified > :last_modified"); - query.setTimestamp("last_modified", since); + query.setParameter("last_modified", since, TemporalType.TIMESTAMP); return iterate(query); } @@ -318,35 +359,6 @@ public class ItemDAOImpl extends AbstractHibernateDSODAO implements ItemDA return count(query); } - @Override - public List findBundlesByName(Context context, Item item, String name) throws SQLException { - String hqlQueryString = "SELECT bundles FROM Item as item join item.bundles bundles join bundles.metadata " + - "metadatavalue WHERE item = :item"; - if (StringUtils.isNotBlank(name)) { - hqlQueryString += " AND STR(metadatavalue.value) = :text_value "; - } - Query query = createQuery(context, hqlQueryString); - - query.setParameter("item", item); - if (StringUtils.isNotBlank(name)) { - query.setParameter("text_value", name); - } - return query.list(); - } - - @Override - public List findBySubmitter(Context context, EPerson eperson, Integer limit, Integer offset) - throws SQLException { - Criteria criteria = createCriteria(context, Item.class); - criteria.addOrder(Order.asc("lastModified")); - criteria.add(Restrictions.eq("inArchive", true)); - criteria.add(Restrictions.eq("withdrawn", false)); - criteria.add(Restrictions.eq("submitter.id", eperson.getID())); - criteria.setFirstResult(offset); - criteria.setMaxResults(limit); - return list(criteria); - } - @Override public int countItems(Context context, EPerson submitter, boolean includeArchived, boolean includeWithdrawn) throws SQLException { diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java index c7e22f3427..c53ea0c9a7 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataFieldDAOImpl.java @@ -8,18 +8,22 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.MetadataField; +import org.dspace.content.MetadataField_; import org.dspace.content.MetadataSchema; +import org.dspace.content.MetadataSchema_; import org.dspace.content.dao.MetadataFieldDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.FetchMode; -import org.hibernate.Query; -import org.hibernate.criterion.Order; /** * Hibernate implementation of the Database Access Object interface class for the MetadataField object. @@ -61,8 +65,8 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im if (qualifier != null) { query.setParameter("qualifier", qualifier); } + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return singleResult(query); } @@ -97,19 +101,27 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im if (StringUtils.isNotBlank(qualifier)) { query.setParameter("qualifier", qualifier); } + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return singleResult(query); } @Override public List findAll(Context context, Class clazz) throws SQLException { - Criteria criteria = createCriteria(context, MetadataField.class); - criteria.createAlias("metadataSchema", "s").addOrder(Order.asc("s.name")).addOrder(Order.asc("element")) - .addOrder(Order.asc("qualifier")); - criteria.setFetchMode("metadataSchema", FetchMode.JOIN); - criteria.setCacheable(true); - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataField.class); + Root metadataFieldRoot = criteriaQuery.from(MetadataField.class); + Join join = metadataFieldRoot.join("metadataSchema"); + criteriaQuery.select(metadataFieldRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(join.get(MetadataSchema_.name))); + orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.element))); + orderList.add(criteriaBuilder.asc(metadataFieldRoot.get(MetadataField_.qualifier))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, true, MetadataField.class, -1, -1, false); } @Override @@ -123,8 +135,8 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im query.setParameter("name", metadataSchema); query.setParameter("element", element); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return list(query); } @@ -140,7 +152,8 @@ public class MetadataFieldDAOImpl extends AbstractHibernateDAO im query.setParameter("name", metadataSchema.getName()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); + return list(query); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java index 63d37ac195..80198a1e89 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataSchemaDAOImpl.java @@ -8,15 +8,18 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.MetadataSchema; +import org.dspace.content.MetadataSchema_; import org.dspace.content.dao.MetadataSchemaDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; /** * Hibernate implementation of the Database Access Object interface class for the MetadataSchema object. @@ -33,7 +36,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO /** * Get the schema object corresponding to this namespace URI. * - * @param context DSpace context + * @param context DSpace context * @param namespace namespace URI to match * @return metadata schema object or null if none found. * @throws SQLException if database error @@ -46,28 +49,34 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO "WHERE ms.namespace = :namespace "); query.setParameter("namespace", namespace); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); - query.setCacheable(true); return singleResult(query); } @Override public List findAll(Context context, Class clazz) throws SQLException { // Get all the metadataschema rows - Criteria criteria = createCriteria(context, MetadataSchema.class); - criteria.addOrder(Order.asc("id")); - criteria.setCacheable(true); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataSchema.class); + Root metadataSchemaRoot = criteriaQuery.from(MetadataSchema.class); + criteriaQuery.select(metadataSchemaRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(metadataSchemaRoot.get(MetadataSchema_.id))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, true, MetadataSchema.class, -1, -1); } /** * Return true if and only if the passed name appears within the allowed * number of times in the current schema. * - * @param context DSpace context + * @param context DSpace context * @param metadataSchemaId schema id - * @param namespace namespace URI to match + * @param namespace namespace URI to match * @return true of false * @throws SQLException if database error */ @@ -80,16 +89,16 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO query.setParameter("namespace", namespace); query.setParameter("id", metadataSchemaId); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query) == null; } /** * Return true if and only if the passed name is unique. * - * @param context DSpace context + * @param context DSpace context * @param metadataSchemaId schema id - * @param name short name of schema + * @param name short name of schema * @return true of false * @throws SQLException if database error */ @@ -102,15 +111,17 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO query.setParameter("name", name); query.setParameter("id", metadataSchemaId); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query) == null; } /** * Get the schema corresponding with this short name. * - * @param context context, in case we need to read it in from DB - * @param shortName the short name for the schema + * @param context + * context, in case we need to read it in from DB + * @param shortName + * the short name for the schema * @return the metadata schema object * @throws SQLException if database error */ @@ -122,7 +133,7 @@ public class MetadataSchemaDAOImpl extends AbstractHibernateDAO query.setParameter("name", shortName); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java index d800126bdd..a4fdf57cba 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/MetadataValueDAOImpl.java @@ -10,16 +10,18 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; import java.util.Iterator; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; import org.dspace.content.MetadataField; +import org.dspace.content.MetadataField_; import org.dspace.content.MetadataValue; import org.dspace.content.dao.MetadataValueDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; -import org.hibernate.FetchMode; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the MetadataValue object. @@ -36,13 +38,15 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im @Override public List findByField(Context context, MetadataField metadataField) throws SQLException { - Criteria criteria = createCriteria(context, MetadataValue.class); - criteria.add( - Restrictions.eq("metadataField.id", metadataField.getID()) - ); - criteria.setFetchMode("metadataField", FetchMode.JOIN); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, MetadataValue.class); + Root metadataValueRoot = criteriaQuery.from(MetadataValue.class); + Join join = metadataValueRoot.join("metadataField"); + criteriaQuery.select(metadataValueRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(MetadataField_.id), metadataField.getID())); - return list(criteria); + + return list(context, criteriaQuery, false, MetadataValue.class, -1, -1); } @Override @@ -51,7 +55,7 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im "WHERE m.value like concat('%', concat(:searchString,'%')) ORDER BY m.id ASC"; Query query = createQuery(context, queryString); - query.setString("searchString", value); + query.setParameter("searchString", value); return iterate(query); } @@ -72,7 +76,7 @@ public class MetadataValueDAOImpl extends AbstractHibernateDAO im Query query = createQuery(context, queryString); query.setParameter("metadata_field_id", metadataFieldId); query.setMaxResults(1); - return (MetadataValue) query.uniqueResult(); + return (MetadataValue) query.getSingleResult(); } @Override diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java index 41f7312e5c..4533eab76a 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/SiteDAOImpl.java @@ -8,12 +8,14 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.Site; import org.dspace.content.dao.SiteDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; -import org.hibernate.Criteria; /** * Hibernate implementation of the Database Access Object interface class for the Site object. @@ -29,8 +31,10 @@ public class SiteDAOImpl extends AbstractHibernateDAO implements SiteDAO { @Override public Site findSite(Context context) throws SQLException { - Criteria criteria = createCriteria(context, Site.class); - criteria.setCacheable(true); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Site.class); + Root siteRoot = criteriaQuery.from(Site.class); + criteriaQuery.select(siteRoot); + return uniqueResult(context, criteriaQuery, true, Site.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java index ee98889294..8e5e803898 100644 --- a/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/dao/impl/WorkspaceItemDAOImpl.java @@ -8,21 +8,26 @@ package org.dspace.content.dao.impl; import java.sql.SQLException; +import java.util.AbstractMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.WorkspaceItem; +import org.dspace.content.WorkspaceItem_; import org.dspace.content.dao.WorkspaceItemDAO; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; -import org.hibernate.transform.BasicTransformerAdapter; +import org.dspace.eperson.EPerson_; +import org.dspace.eperson.Group; /** * Hibernate implementation of the Database Access Object interface class for the WorkspaceItem object. @@ -49,63 +54,91 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im @Override public List findByEPerson(Context context, EPerson ep, Integer limit, Integer offset) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class, "wi"); - criteria.addOrder(Order.asc("workspaceItemId")); - criteria.createAlias("wi.item", "item"); - criteria.createAlias("item.submitter", "submitter"); - - criteria.add(Restrictions.eq("submitter.id", ep.getID())); - criteria.setFirstResult(offset); - criteria.setMaxResults(limit); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(workspaceItemRoot.get(WorkspaceItem_.item).get("submitter"), ep)); + criteriaQuery.orderBy(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + return list(context, criteriaQuery, false, WorkspaceItem.class, limit, offset); } @Override public List findByCollection(Context context, Collection c) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.add(Restrictions.eq("collection", c)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(workspaceItemRoot.get(WorkspaceItem_.collection), c)); + criteriaQuery.orderBy(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override public WorkspaceItem findByItem(Context context, Item i) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.add(Restrictions.eq("item", i)); - // Look for the unique workspaceitem entry where 'item_id' references this item - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(workspaceItemRoot.get(WorkspaceItem_.item), i)); + return uniqueResult(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override public List findAll(Context context) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.addOrder(Order.asc("item")); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override public List findAll(Context context, Integer limit, Integer offset) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.addOrder(Order.asc("item")); - criteria.setFirstResult(offset); - criteria.setMaxResults(limit); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, WorkspaceItem.class, limit, offset); } @Override public List findWithSupervisedGroup(Context context) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.add(Restrictions.isNotEmpty("supervisorGroups")); - criteria.addOrder(Order.asc("workspaceItemId")); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.isNotEmpty(workspaceItemRoot.get(WorkspaceItem_.supervisorGroups))); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + criteriaQuery.orderBy(orderList); + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override public List findBySupervisedGroupMember(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, WorkspaceItem.class); - criteria.createAlias("supervisorGroups", "supervisorGroup"); - criteria.createAlias("supervisorGroup.epeople", "person"); - criteria.add(Restrictions.eq("person.id", ePerson.getID())); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkspaceItem.class); + Root workspaceItemRoot = criteriaQuery.from(WorkspaceItem.class); + Join join = workspaceItemRoot.join("supervisorGroups"); + Join secondJoin = join.join("epeople"); + criteriaQuery.select(workspaceItemRoot); + criteriaQuery.where(criteriaBuilder.equal(secondJoin.get(EPerson_.id), ePerson.getID())); + criteriaQuery.orderBy(criteriaBuilder.asc(workspaceItemRoot.get(WorkspaceItem_.workspaceItemId))); + return list(context, criteriaQuery, false, WorkspaceItem.class, -1, -1); } @Override @@ -127,13 +160,13 @@ public class WorkspaceItemDAOImpl extends AbstractHibernateDAO im Query query = createQuery(context, "SELECT wi.stageReached as stage_reached, count(*) as cnt from WorkspaceItem wi" + " group by wi.stageReached order by wi.stageReached"); - query.setResultTransformer(new BasicTransformerAdapter() { - @Override - public Object transformTuple(Object[] tuple, String[] aliases) { - return new java.util.AbstractMap.SimpleImmutableEntry((Integer) tuple[0], (Long) tuple[1]); - } - }); - return (List>) query.list(); + + List list = query.getResultList(); + List> returnList = new LinkedList<>(); + for (Object[] o : list) { + returnList.add(new AbstractMap.SimpleEntry<>((Integer) o[0], (Long) o[1])); + } + return returnList; } } diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java index 77de1ef12e..f32990ea5b 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSDisseminator.java @@ -85,8 +85,6 @@ import org.jdom.Element; import org.jdom.Namespace; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Base class for disseminator of @@ -125,7 +123,8 @@ public abstract class AbstractMETSDisseminator /** * log4j category */ - private static final Logger log = LoggerFactory.getLogger(AbstractMETSDisseminator.class); + private static org.apache.logging.log4j.Logger log = + org.apache.logging.log4j.LogManager.getLogger(AbstractMETSDisseminator.class); // JDOM xml output writer - indented format for readability. protected static XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java index 5ecaa5c09c..9cf6a7ca9f 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractMETSIngester.java @@ -20,7 +20,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -109,7 +109,7 @@ public abstract class AbstractMETSIngester extends AbstractPackageIngester { /** * log4j category */ - private static Logger log = Logger.getLogger(AbstractMETSIngester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMETSIngester.class); protected final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected final BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() diff --git a/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java b/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java index a9e8b9a509..da58f1cf0b 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/AbstractPackageIngester.java @@ -16,7 +16,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; @@ -59,7 +59,7 @@ public abstract class AbstractPackageIngester /** * log4j category */ - private static Logger log = Logger.getLogger(AbstractPackageIngester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractPackageIngester.class); protected final CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected final ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java index 2fb65dc1bb..887520ad66 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPDisseminator.java @@ -28,8 +28,8 @@ import edu.harvard.hul.ois.mets.Type; import edu.harvard.hul.ois.mets.helper.MetsException; import edu.harvard.hul.ois.mets.helper.PCData; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.Util; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bundle; @@ -82,7 +82,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @see AbstractPackageDisseminator */ public class DSpaceAIPDisseminator extends AbstractMETSDisseminator { - private static final Logger log = Logger.getLogger(DSpaceAIPDisseminator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAIPDisseminator.class); /** * Unique identifier for the profile of the METS document. diff --git a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java index e23ab5f0b4..954a68bfc1 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/DSpaceAIPIngester.java @@ -10,7 +10,7 @@ package org.dspace.content.packager; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Collection; @@ -64,7 +64,7 @@ public class DSpaceAIPIngester /** * log4j category */ - private static Logger log = Logger.getLogger(DSpaceAIPIngester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceAIPIngester.class); /** * Ensure it's an AIP generated by the complementary AIP disseminator. diff --git a/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java b/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java index d9d860d04e..53a8678df2 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/METSManifest.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -117,7 +117,7 @@ public class METSManifest { /** * log4j category */ - private static final Logger log = Logger.getLogger(METSManifest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(METSManifest.class); /** * Canonical filename of METS manifest within a package or as a bitstream. diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java b/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java index 0b26cc867b..d80efb06e4 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PDFPackager.java @@ -16,8 +16,8 @@ import java.sql.SQLException; import java.util.Calendar; import java.util.List; -import org.apache.commons.lang.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; import org.apache.pdfbox.cos.COSDocument; import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.io.RandomAccessBufferedFileInputStream; @@ -73,7 +73,7 @@ public class PDFPackager /** * log4j category */ - private static final Logger log = Logger.getLogger(PDFPackager.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PDFPackager.class); protected static final String BITSTREAM_FORMAT_NAME = "Adobe PDF"; diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java b/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java index 3da64df783..58f2621afb 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PackageException.java @@ -10,7 +10,7 @@ package org.dspace.content.packager; import java.io.PrintWriter; import java.io.StringWriter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * This is a superclass for exceptions representing a failure when diff --git a/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java b/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java index 045f7963d0..2f4074063c 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/PackageUtils.java @@ -21,7 +21,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -65,7 +65,7 @@ public class PackageUtils { /** * log4j category */ - private static final Logger log = Logger.getLogger(PackageUtils.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PackageUtils.class); // Map of metadata elements for Communities and Collections // Format is alternating key/value in a straight array; use this diff --git a/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java b/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java index 5fc538e086..75bc512996 100644 --- a/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java +++ b/dspace-api/src/main/java/org/dspace/content/packager/RoleDisseminator.java @@ -21,7 +21,7 @@ import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -47,7 +47,7 @@ public class RoleDisseminator implements PackageDisseminator { /** * log4j category */ - private static final Logger log = Logger.getLogger(RoleDisseminator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RoleDisseminator.class); /** * DSpace Roles XML Namespace in JDOM form. diff --git a/dspace-api/src/main/java/org/dspace/content/service/ItemService.java b/dspace-api/src/main/java/org/dspace/content/service/ItemService.java index 662c5365b5..0464204a38 100644 --- a/dspace-api/src/main/java/org/dspace/content/service/ItemService.java +++ b/dspace-api/src/main/java/org/dspace/content/service/ItemService.java @@ -645,11 +645,6 @@ public interface ItemService extends DSpaceObjectService, DSpaceObjectLega */ boolean isInProgressSubmission(Context context, Item item) throws SQLException; - List getBundles(Context context, Item item, String name) throws SQLException; - - public List findBySubmitter(Context context, EPerson ep, Integer pageSize, Integer offset) - throws SQLException; - public int countBySubmitter(Context context, EPerson ep) throws SQLException; } diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java index 14c2622096..d4571b8463 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDAO.java @@ -10,21 +10,24 @@ package org.dspace.core; import java.sql.SQLException; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.UUID; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Root; -import org.apache.commons.collections4.CollectionUtils; -import org.hibernate.Criteria; -import org.hibernate.Query; +import org.apache.commons.collections.CollectionUtils; import org.hibernate.Session; -import org.hibernate.criterion.Projections; /** * Hibernate implementation for generic DAO interface. Also includes additional * Hibernate calls that are commonly used. * Each DAO should extend this class to prevent code duplication. * - * @param class type * @author kevinvandevelde at atmire.com + * @param class type */ public abstract class AbstractHibernateDAO implements GenericDAO { @@ -43,13 +46,13 @@ public abstract class AbstractHibernateDAO implements GenericDAO { //Isn't required, is just here for other DB implementation. Hibernate auto keeps track of changes. } - /** - * The Session used to manipulate entities of this type. - * - * @param context current DSpace context. - * @return the current Session. - * @throws SQLException - */ + /** + * The Session used to manipulate entities of this type. + * + * @param context current DSpace context. + * @return the current Session. + * @throws SQLException + */ protected Session getHibernateSession(Context context) throws SQLException { return ((Session) context.getDBConnection().getSession()); } @@ -61,13 +64,16 @@ public abstract class AbstractHibernateDAO implements GenericDAO { @Override public List findAll(Context context, Class clazz) throws SQLException { - return list(createCriteria(context, clazz)); + CriteriaQuery criteriaQuery = getCriteriaQuery(getCriteriaBuilder(context), clazz); + Root root = criteriaQuery.from(clazz); + criteriaQuery.select(root); + return executeCriteriaQuery(context, criteriaQuery, false, -1, -1); } @Override public T findUnique(Context context, String query) throws SQLException { @SuppressWarnings("unchecked") - T result = (T) createQuery(context, query).uniqueResult(); + T result = (T) createQuery(context, query).getSingleResult(); return result; } @@ -91,51 +97,26 @@ public abstract class AbstractHibernateDAO implements GenericDAO { @Override public List findMany(Context context, String query) throws SQLException { @SuppressWarnings("unchecked") - List result = (List) createQuery(context, query).list(); + List result = (List) createQuery(context, query).getResultList(); return result; } /** * Execute a JPA Criteria query and return a collection of results. * - * @param context The relevant DSpace Context. - * @param query JPQL query string + * @param context + * The relevant DSpace Context. + * @param query + * JPQL query string * @return list of DAOs specified by the query string * @throws SQLException if database error */ public List findMany(Context context, Query query) throws SQLException { @SuppressWarnings("unchecked") - List result = (List) query.list(); + List result = (List) query.getResultList(); return result; } - /** - * Create criteria matching an entity type or a supertype thereof. - * Use when building a criteria query. - * - * @param context current DSpace context. - * @param persistentClass specifies the type to be matched by the criteria. - * @return criteria concerning the type to be found. - * @throws SQLException passed through. - */ - public Criteria createCriteria(Context context, Class persistentClass) throws SQLException { - return getHibernateSession(context).createCriteria(persistentClass); - } - - /** - * Create criteria matching an entity type or a supertype thereof. - * Use when building a criteria query. - * - * @param context current DSpace context. - * @param persistentClass specifies the type to be matched by the criteria. - * @param alias alias for the type. - * @return criteria concerning the type to be found. - * @throws SQLException passed through. - */ - public Criteria createCriteria(Context context, Class persistentClass, String alias) throws SQLException { - return getHibernateSession(context).createCriteria(persistentClass, alias); - } - /** * Create a parsed query from a query expression. * @@ -149,82 +130,111 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } /** - * Get the entities matched by the given Criteria. - * Use this if you need all results together. + * This method will return a list with unique results, no duplicates, made by the given CriteriaQuery and parameters * - * @param criteria description of desired entities. - * @return the entities matched. + * @param context + * The standard DSpace context object + * @param criteriaQuery + * The CriteriaQuery for which this list will be retrieved + * @param cacheable + * Whether or not this query should be cacheable + * @param clazz + * The clazz for which this CriteriaQuery will be executed on + * @param maxResults + * The maxmimum amount of results that will be returned for this CriteriaQuery + * @param offset + * The offset to be used for the CriteriaQuery + * @return A list of distinct results as depicted by the CriteriaQuery and parameters + * @throws SQLException */ - public List list(Criteria criteria) { + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, + int offset) throws SQLException { + criteriaQuery.distinct(true); @SuppressWarnings("unchecked") - List result = (List) criteria.list(); + List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, maxResults, offset); return result; } /** - * Get the entities matching a given parsed query. - * Use this if you need all results together. + * This method will return a list of results for the given CriteriaQuery and parameters * - * @param query the query to be executed. - * @return entities matching the query. + * @param context + * The standard DSpace context object + * @param criteriaQuery + * The CriteriaQuery to be used to find the list of results + * @param cacheable + * A boolean value indicating whether this query should be cached or not + * @param clazz + * The class on which the CriteriaQuery will search + * @param maxResults + * The maximum amount of results to be returned + * @param offset + * The offset to be used for the CriteriaQuery + * @param distinct + * A boolean value indicating whether this list should be distinct or not + * @return A list of results determined by the CriteriaQuery and parameters + * @throws SQLException + */ + public List list(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, int maxResults, + int offset, boolean distinct) throws SQLException { + criteriaQuery.distinct(distinct); + @SuppressWarnings("unchecked") + List result = (List) executeCriteriaQuery(context, criteriaQuery, cacheable, maxResults, offset); + return result; + } + + /** + * This method will be used to return a list of results for the given query + * + * @param query + * The query for which the resulting list will be returned + * @return The list of results for the given query */ public List list(Query query) { @SuppressWarnings("unchecked") - List result = (List) query.list(); + List result = (List) query.getResultList(); return result; } /** - * Retrieve a unique result selected by criteria. If multiple results CAN be + * Retrieve a unique result from the query. If multiple results CAN be * retrieved an exception will be thrown, * so only use when the criteria state uniqueness in the database. - * - * @param criteria description of the desired entity. + * @param criteriaQuery JPA criteria * @return a DAO specified by the criteria */ - public T uniqueResult(Criteria criteria) { - @SuppressWarnings("unchecked") - T result = (T) criteria.uniqueResult(); - return result; - } - - /** - * Retrieve a unique result selected by a query. If multiple results CAN be - * retrieved then an exception will be thrown, so only use when the query - * states uniqueness in the database. - * - * @param query description of the desired entity. - * @return the found entity. - */ - public T uniqueResult(Query query) { - @SuppressWarnings("unchecked") - T result = (T) query.uniqueResult(); - return result; - } - - /** - * Retrieve a single result selected by criteria. Best used if you expect a - * single result, but this isn't enforced on the database. - * - * @param criteria description of the desired entities. - * @return a DAO specified by the criteria - */ - public T singleResult(Criteria criteria) { - criteria.setMaxResults(1); - List list = list(criteria); + public T uniqueResult(Context context, CriteriaQuery criteriaQuery, boolean cacheable, Class clazz, + int maxResults, int offset) throws SQLException { + List list = list(context, criteriaQuery, cacheable, clazz, maxResults, offset); if (CollectionUtils.isNotEmpty(list)) { - return list.get(0); + if (list.size() == 1) { + return list.get(0); + } else { + throw new IllegalArgumentException("More than one result found"); + } } else { return null; } } /** - * Retrieve a single result matching a query. Best used if you expect a + * Retrieve a single result from the query. Best used if you expect a * single result, but this isn't enforced on the database. + * @param criteriaQuery JPA criteria + * @return a DAO specified by the criteria + */ + public T singleResult(Context context, CriteriaQuery criteriaQuery) throws SQLException { + Query query = this.getHibernateSession(context).createQuery(criteriaQuery); + return singleResult(query); + + } + + /** + * This method will return the first result from the given query or null if no results were found * - * @param query description of desired entities. - * @return matched entities. + * @param query + * The query that is to be executed + * @return One result from the given query or null if none was found */ public T singleResult(final Query query) { query.setMaxResults(1); @@ -234,49 +244,179 @@ public abstract class AbstractHibernateDAO implements GenericDAO { } else { return null; } + } /** - * Get an iterator over a stream of query results. - * Use this when consuming results one at a time. + * This method will return a singular result for the given query * - * @param query description of desired entities. - * @return iterator over the results of the query. + * @param query + * The query for which a single result will be given + * @return The single result for this query */ - public Iterator iterate(Query query) { + public T uniqueResult(Query query) { @SuppressWarnings("unchecked") - Iterator result = (Iterator) query.iterate(); + T result = (T) query.getSingleResult(); return result; } /** - * How many rows match these criteria? - * The same value as {@link countLong(Criteria)}, coerced to {@code int}. + * This method will return an Iterator for the given Query * - * @param criteria description of the rows. - * @return count of matching rows. + * @param query + * The query for which an Iterator will be made + * @return The Iterator for the results of this query */ - public int count(Criteria criteria) { - return ((Long) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); + public Iterator iterate(Query query) { + @SuppressWarnings("unchecked") + Iterator result = (Iterator) query.getResultList().iterator(); + return result; } /** - * How many rows match this query? + * This method will return the amount of results that would be generated for this CriteriaQuery as an integer * - * @param query description of the rows. - * @return count of matching rows. + * @param context + * The standard DSpace Context object + * @param criteriaQuery + * The CriteriaQuery for which this result will be retrieved + * @param criteriaBuilder + * The CriteriaBuilder that accompagnies the CriteriaQuery + * @param root + * The root that'll determine on which class object we need to calculate the result + * @return The amount of results that would be found by this CriteriaQuery as an integer value + * @throws SQLException + */ + public int count(Context context, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder, Root root) + throws SQLException { + return Math.toIntExact(countLong(context, criteriaQuery, criteriaBuilder, root)); + } + + /** + * This method will return the count of items for this query as an integer + * This query needs to already be in a formate that'll return one record that contains the amount + * + * @param query + * The query for which the amount of results will be returned. + * @return The amount of results */ public int count(Query query) { - return ((Long) query.uniqueResult()).intValue(); + return ((Long) query.getSingleResult()).intValue(); } /** - * How many rows match these criteria? + * This method will return the count of items for this query as a long * - * @param criteria description of the rows. - * @return count of matching rows. + * @param context + * The standard DSpace Context object + * @param criteriaQuery + * The CriteriaQuery for which the amount of results will be retrieved + * @param criteriaBuilder + * The CriteriaBuilder that goes along with this CriteriaQuery + * @param root + * The root created for a DSpace class on which this query will search + * @return A long value that depicts the amount of results this query has found + * @throws SQLException */ - public long countLong(Criteria criteria) { - return (Long) criteria.setProjection(Projections.rowCount()).uniqueResult(); + public long countLong(Context context, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder, Root root) + throws SQLException { + Expression countExpression = criteriaBuilder.countDistinct(root); + criteriaQuery.select(countExpression); + return (Long) this.getHibernateSession(context).createQuery(criteriaQuery).getSingleResult(); } + + /** + * This method should always be used in order to retrieve the CriteriaQuery in order to + * start creating a query that has to be executed + * + * @param criteriaBuilder + * The CriteriaBuilder for which this CriteriaQuery will be constructed + * @param clazz + * The class that this CriteriaQuery will be constructed for + * @return A CriteriaQuery on which a query can be built + */ + public CriteriaQuery getCriteriaQuery(CriteriaBuilder criteriaBuilder, Class clazz) { + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(clazz); + return criteriaQuery; + } + + /** + * This method should always be used in order to retrieve a CriteriaBuilder for the given context + * + * @param context + * The standard DSpace Context class for which a CriteriaBuilder will be made + * @return A CriteriaBuilder that can be used to create the query + * @throws SQLException + */ + public CriteriaBuilder getCriteriaBuilder(Context context) throws SQLException { + return this.getHibernateSession(context).getCriteriaBuilder(); + } + + /** + * This method will return a list of objects to be returned that match the given criteriaQuery and parameters. + * The maxResults and offSet can be circumvented by entering the value -1 for them. + * + * @param context + * The standard context DSpace object + * @param criteriaQuery + * The CriteriaQuery that will be used for executing the query + * @param cacheable + * Whether or not this query is able to be cached + * @param maxResults + * The maximum amount of results that this query will return + * This can be circumvented by passing along -1 as the value + * @param offset + * The offset to be used in this query + * This can be circumvented by passing along -1 as the value + * @return This will return a list of objects that conform to the made query + * @throws SQLException + */ + public List executeCriteriaQuery(Context context, CriteriaQuery criteriaQuery, boolean cacheable, + int maxResults, int offset) throws SQLException { + Query query = this.getHibernateSession(context).createQuery(criteriaQuery); + + query.setHint("org.hibernate.cacheable", cacheable); + if (maxResults != -1) { + query.setMaxResults(maxResults); + } + if (offset != -1) { + query.setFirstResult(offset); + } + return query.getResultList(); + + } + + /** + * This method can be used to construct a query for which there needs to be a bunch of equal properties + * These properties can be passed along in the equals hashmap + * + * @param context + * The standard DSpace context object + * @param clazz + * The class on which the criteriaQuery will be built + * @param equals + * A hashmap that can be used to store the String representation of the column + * and the value that should match that in the DB + * @param cacheable + * A boolean indicating whether this query should be cacheable or not + * @param maxResults + * The max amount of results to be returned by this query + * @param offset + * The offset to be used in this query + * @return Will return a list of objects that correspond with the constructed query and parameters + * @throws SQLException + */ + public List findByX(Context context, Class clazz, Map equals, boolean cacheable, int maxResults, + int offset) throws SQLException { + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteria = getCriteriaQuery(criteriaBuilder, clazz); + Root root = criteria.from(clazz); + criteria.select(root); + + for (Map.Entry entry : equals.entrySet()) { + criteria.where(criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue())); + } + return executeCriteriaQuery(context, criteria, cacheable, maxResults, offset); + } + } diff --git a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java index c17d1bdb86..232431cac7 100644 --- a/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java +++ b/dspace-api/src/main/java/org/dspace/core/AbstractHibernateDSODAO.java @@ -9,15 +9,16 @@ package org.dspace.core; import java.sql.SQLException; import java.util.Collection; -import java.util.Collections; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataField; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation used by DSpaceObject Database Access Objects. @@ -26,8 +27,8 @@ import org.hibernate.criterion.Restrictions; *

* Each DSO Database Access Object should extend this class to prevent code duplication. * - * @param type of DSO represented. * @author kevinvandevelde at atmire.com + * @param type of DSO represented. */ public abstract class AbstractHibernateDSODAO extends AbstractHibernateDAO { /** @@ -36,27 +37,27 @@ public abstract class AbstractHibernateDSODAO extends Ab * All DSOs now have UUID primary keys, and those should be used when available. * Each type derived from DSpaceObject had its own stream of record IDs, so * it is also necessary to know the specific type. - * - * @param context current DSpace context. + * @param context current DSpace context. * @param legacyId the old integer record identifier. - * @param clazz DSO subtype of record identified by {@link legacyId}. + * @param clazz DSO subtype of record identified by {@link legacyId}. * @return * @throws SQLException */ public T findByLegacyId(Context context, int legacyId, Class clazz) throws SQLException { - Criteria criteria = createCriteria(context, clazz); - criteria.add(Restrictions.eq("legacyId", legacyId)); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, clazz); + Root root = criteriaQuery.from(clazz); + criteriaQuery.where(criteriaBuilder.equal(root.get("legacyId"), legacyId)); + return uniqueResult(context, criteriaQuery, false, clazz, -1, -1); } /** * Add left outer join on all metadata fields which are passed to this function. * The identifier of the join will be the toString() representation of the metadata field. * The joined metadata fields can then be used to query or sort. - * - * @param query the query string being built. + * @param query the query string being built. * @param tableIdentifier name of the table to be joined. - * @param metadataFields names of the desired fields. + * @param metadataFields names of the desired fields. */ protected void addMetadataLeftJoin(StringBuilder query, String tableIdentifier, Collection metadataFields) { @@ -72,9 +73,9 @@ public abstract class AbstractHibernateDSODAO extends Ab * Values can be checked using a like or an "=" query, as determined by the "operator" parameter. * When creating a query, the "queryParam" string can be used set as parameter for the query. * - * @param query the already existing query builder, all changes will be appended - * @param metadataFields the metadata fields whose metadata value should be queried - * @param operator can either be "=" or "like" + * @param query the already existing query builder, all changes will be appended + * @param metadataFields the metadata fields whose metadata value should be queried + * @param operator can either be "=" or "like" * @param additionalWhere additional where query */ protected void addMetadataValueWhereQuery(StringBuilder query, List metadataFields, String operator, @@ -108,23 +109,21 @@ public abstract class AbstractHibernateDSODAO extends Ab /** * Append ORDER BY clause based on metadata fields or column names. * All fields will be in ascending order. - * - * @param query the query being built. + * @param query the query being built. * @param metadataSortFields fields on which to sort -- use this OR columnSortFields. - * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. + * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. */ protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, List columnSortFields) { - addMetadataSortQuery(query, metadataSortFields, columnSortFields, Collections.EMPTY_LIST); + addMetadataSortQuery(query, metadataSortFields, columnSortFields, ListUtils.EMPTY_LIST); } /** * Append ORDER BY clause based on metadata fields or column names. - * - * @param query the query being built. + * @param query the query being built. * @param metadataSortFields fields on which to sort -- use this OR columnSortFields. - * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. - * @param direction ASC or DESC for each field. Unspecified fields will be ASC. + * @param columnSortFields columns on which to sort -- use this OR metadataSortFields. + * @param direction ASC or DESC for each field. Unspecified fields will be ASC. */ protected void addMetadataSortQuery(StringBuilder query, List metadataSortFields, List columnSortFields, List direction) { diff --git a/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java b/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java index 30d6cf800a..8f2e92e2f0 100644 --- a/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java +++ b/dspace-api/src/main/java/org/dspace/core/ConfigurationManager.java @@ -10,9 +10,9 @@ package org.dspace.core; import java.util.Enumeration; import java.util.Properties; -import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationConverter; -import org.apache.log4j.Logger; +import org.apache.commons.configuration2.Configuration; +import org.apache.commons.configuration2.ConfigurationConverter; +import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -36,7 +36,7 @@ public class ConfigurationManager { /** * log4j category */ - private static final Logger log = Logger.getLogger(ConfigurationManager.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ConfigurationManager.class); protected ConfigurationManager() { diff --git a/dspace-api/src/main/java/org/dspace/core/Context.java b/dspace-api/src/main/java/org/dspace/core/Context.java index fac882c715..1771473c62 100644 --- a/dspace-api/src/main/java/org/dspace/core/Context.java +++ b/dspace-api/src/main/java/org/dspace/core/Context.java @@ -18,7 +18,7 @@ import java.util.Stack; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.ResourcePolicy; import org.dspace.content.DSpaceObject; import org.dspace.eperson.EPerson; @@ -50,7 +50,7 @@ import org.springframework.util.CollectionUtils; * @version $Revision$ */ public class Context implements AutoCloseable { - private static final Logger log = Logger.getLogger(Context.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Context.class); protected static final AtomicBoolean databaseUpdated = new AtomicBoolean(false); /** diff --git a/dspace-api/src/main/java/org/dspace/core/Email.java b/dspace-api/src/main/java/org/dspace/core/Email.java index 0ce631e6b8..0fcf911a35 100644 --- a/dspace-api/src/main/java/org/dspace/core/Email.java +++ b/dspace-api/src/main/java/org/dspace/core/Email.java @@ -32,12 +32,14 @@ import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; +import javax.mail.internet.ContentType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import javax.mail.internet.ParseException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -103,7 +105,6 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author Robert Tansley * @author Jim Downing - added attachment handling code * @author Adan Roman Ruiz at arvo.es - added inputstream attachment handling code - * @version $Revision: 5844 $ */ public class Email { /** @@ -139,7 +140,7 @@ public class Email { */ private String charset; - private static final Logger log = Logger.getLogger(Email.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Email.class); /** * Create a new email message. @@ -207,7 +208,25 @@ public class Email { attachments.add(new FileAttachment(f, name)); } + /** When given a bad MIME type for an attachment, use this instead. */ + private static final String DEFAULT_ATTACHMENT_TYPE = "application/octet-stream"; + public void addAttachment(InputStream is, String name, String mimetype) { + if (null == mimetype) { + log.error("Null MIME type replaced with '" + DEFAULT_ATTACHMENT_TYPE + + "' for attachment '" + name + "'"); + mimetype = DEFAULT_ATTACHMENT_TYPE; + } else { + try { + new ContentType(mimetype); // Just try to parse it. + } catch (ParseException ex) { + log.error("Bad MIME type '" + mimetype + + "' replaced with '" + DEFAULT_ATTACHMENT_TYPE + + "' for attachment '" + name + "'", ex); + mimetype = DEFAULT_ATTACHMENT_TYPE; + } + } + moreAttachments.add(new InputStreamAttachment(is, name, mimetype)); } diff --git a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java index b8aeb959b4..37e48c4a4f 100644 --- a/dspace-api/src/main/java/org/dspace/core/I18nUtil.java +++ b/dspace-api/src/main/java/org/dspace/core/I18nUtil.java @@ -15,8 +15,8 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.StringTokenizer; -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.eperson.EPerson; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; @@ -35,7 +35,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class I18nUtil { - private static final Logger log = Logger.getLogger(I18nUtil.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(I18nUtil.class); // the default Locale of this DSpace Instance public static final Locale DEFAULTLOCALE = getDefaultLocale(); diff --git a/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java b/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java index 477143a04a..366de8314b 100644 --- a/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/core/LegacyPluginServiceImpl.java @@ -18,7 +18,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.service.PluginService; import org.dspace.services.ConfigurationService; import org.springframework.beans.factory.annotation.Autowired; @@ -70,7 +70,7 @@ public class LegacyPluginServiceImpl implements PluginService { /** * log4j category */ - private static Logger log = Logger.getLogger(LegacyPluginServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LegacyPluginServiceImpl.class); /** * Prefixes of names of properties to look for in DSpace Configuration diff --git a/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java deleted file mode 100644 index 47875d345a..0000000000 --- a/dspace-api/src/main/java/org/dspace/core/LoggerServiceImpl.java +++ /dev/null @@ -1,182 +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.core; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.util.Enumeration; -import java.util.Properties; - -import org.apache.log4j.Logger; -import org.apache.log4j.PropertyConfigurator; -import org.apache.log4j.xml.DOMConfigurator; -import org.dspace.services.ConfigurationService; -import org.dspace.services.KernelStartupCallbackService; -import org.dspace.services.factory.DSpaceServicesFactory; - -/** - * Service which simply initializes DSpace logging *after* the kernel starts - * - * @author Tim Donohue - */ -public class LoggerServiceImpl implements KernelStartupCallbackService { - /** - * log4j category - */ - private static Logger log = Logger.getLogger(LoggerServiceImpl.class); - - // System property which will disable DSpace's log4j setup - private final String LOG_DISABLE_PROPERTY = "dspace.log.init.disable"; - - // Logging settings which are specified in DSpace's configuration - private final String LOG_CONFIG_PROPERTY = "log.init.config"; - - /** - * After kernel starts up, initialize Log4j based on the logging settings - * in our ConfigurationService. - */ - @Override - public void executeCallback() { - try { - /* - * Initialize Logging once ConfigurationManager is initialized. - * - * This is controlled by a property in dspace.cfg. If the property - * is absent then nothing will be configured and the application - * will use the defaults provided by log4j. - * - * Property format is: - * - * log.init.config = ${dspace.dir}/config/log4j.properties - * or - * log.init.config = ${dspace.dir}/config/log4j.xml - * - * See default log4j initialization documentation here: - * http://logging.apache.org/log4j/docs/manual.html - * - * If there is a problem with the file referred to in - * "log.configuration", it needs to be sent to System.err - * so do not instantiate another Logging configuration. - * - */ - ConfigurationService config = DSpaceServicesFactory.getInstance().getConfigurationService(); - String dsLogConfiguration = config.getProperty(LOG_CONFIG_PROPERTY); - - if (dsLogConfiguration == null || System.getProperty(LOG_DISABLE_PROPERTY) != null) { - /* - * Do nothing if log config not set in dspace.cfg or "dspace.log.init.disable" - * system property set. Leave it upto log4j to properly init its logging - * via classpath or system properties. - */ - info("Using default log4j provided log configuration." + - " If unintended, check your dspace.cfg for (" + LOG_CONFIG_PROPERTY + ")"); - } else { - info("Using dspace provided log configuration (" + LOG_CONFIG_PROPERTY + ")"); - - File logConfigFile = new File(dsLogConfiguration); - - if (logConfigFile.exists()) { - info("Loading: " + dsLogConfiguration); - - // Check if we have an XML config - if (logConfigFile.getName().endsWith(".xml")) { - // Configure log4j via the DOMConfigurator - DOMConfigurator.configure(logConfigFile.toURI().toURL()); - } else { - // Otherwise, assume a Properties file - - // Parse our log4j properties file - Properties log4jProps = new Properties(); - try (InputStream fis = new FileInputStream(logConfigFile)) { - log4jProps.load(fis); - } catch (IOException e) { - fatal("Can't load dspace provided log4j configuration from " + logConfigFile - .getAbsolutePath(), e); - } - - // Configure log4j based on all its properties - PropertyConfigurator.configure(log4jProps); - } - } else { - info("File does not exist: " + dsLogConfiguration); - } - } - - } catch (MalformedURLException e) { - fatal("Can't load dspace provided log4j configuration", e); - throw new IllegalStateException("Cannot load dspace provided log4j configuration", e); - } - } - - /** - * Attempt to log an INFO statement. If Log4j is not yet setup, send to System OUT - * - * @param string - */ - private void info(String string) { - if (!isLog4jConfigured()) { - System.out.println("INFO: " + string); - } else { - log.info(string); - } - } - - /** - * Attempt to log a WARN statement. If Log4j is not yet setup, send to System OUT - * - * @param string - */ - private void warn(String string) { - if (!isLog4jConfigured()) { - System.out.println("WARN: " + string); - } else { - log.warn(string); - } - } - - /** - * Attempt to log a FATAL statement. If Log4j is not yet setup, send to System ERR - * - * @param string - * @param e - */ - private void fatal(String string, Exception e) { - if (!isLog4jConfigured()) { - System.err.println("FATAL: " + string); - e.printStackTrace(System.err); - } else { - log.fatal(string, e); - } - } - - /** - * Only current solution available to detect if log4j is truly configured. - *

- * Based on samples here: http://wiki.apache.org/logging-log4j/UsefulCode - */ - private boolean isLog4jConfigured() { - Enumeration appenders = org.apache.log4j.LogManager.getRootLogger() - .getAllAppenders(); - - if (!(appenders instanceof org.apache.log4j.helpers.NullEnumeration)) { - return true; - } else { - Enumeration loggers = org.apache.log4j.LogManager.getCurrentLoggers(); - while (loggers.hasMoreElements()) { - Logger c = (Logger) loggers.nextElement(); - if (!(c.getAllAppenders() instanceof org.apache.log4j.helpers.NullEnumeration)) { - return true; - } - } - } - return false; - } -} diff --git a/dspace-api/src/main/java/org/dspace/core/Utils.java b/dspace-api/src/main/java/org/dspace/core/Utils.java index a7e59a2e46..32c32776f7 100644 --- a/dspace-api/src/main/java/org/dspace/core/Utils.java +++ b/dspace-api/src/main/java/org/dspace/core/Utils.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; import com.coverity.security.Escape; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Utility functions for DSpace. @@ -42,7 +42,7 @@ public final class Utils { /** * log4j logger */ - private static Logger log = Logger.getLogger(Utils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Utils.class); private static final Pattern DURATION_PATTERN = Pattern .compile("(\\d+)([smhdwy])"); diff --git a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java index 888cd21764..e7260fc2b4 100644 --- a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java +++ b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactory.java @@ -10,6 +10,7 @@ package org.dspace.core.factory; import org.dspace.core.service.LicenseService; import org.dspace.core.service.NewsService; import org.dspace.core.service.PluginService; +import org.dspace.service.ClientInfoService; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -26,6 +27,8 @@ public abstract class CoreServiceFactory { public abstract PluginService getPluginService(); + public abstract ClientInfoService getClientInfoService(); + public static CoreServiceFactory getInstance() { return DSpaceServicesFactory.getInstance().getServiceManager() .getServiceByName("coreServiceFactory", CoreServiceFactory.class); diff --git a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java index 4beb47f2c0..7db3ad24d7 100644 --- a/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java +++ b/dspace-api/src/main/java/org/dspace/core/factory/CoreServiceFactoryImpl.java @@ -10,6 +10,7 @@ package org.dspace.core.factory; import org.dspace.core.service.LicenseService; import org.dspace.core.service.NewsService; import org.dspace.core.service.PluginService; +import org.dspace.service.ClientInfoService; import org.springframework.beans.factory.annotation.Autowired; /** @@ -29,6 +30,9 @@ public class CoreServiceFactoryImpl extends CoreServiceFactory { @Autowired(required = true) private PluginService pluginService; + @Autowired(required = true) + private ClientInfoService clientInfoService; + @Override public LicenseService getLicenseService() { return licenseService; @@ -43,4 +47,8 @@ public class CoreServiceFactoryImpl extends CoreServiceFactory { public PluginService getPluginService() { return pluginService; } + + public ClientInfoService getClientInfoService() { + return clientInfoService; + } } diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java b/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java index 6cc4e59204..67e882a558 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/AbstractTranslator.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.MetadataValue; @@ -40,7 +40,7 @@ public abstract class AbstractTranslator extends AbstractCurationTask { protected String apiKey = ""; - private static Logger log = Logger.getLogger(AbstractTranslator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractTranslator.class); protected List results = new ArrayList(); diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java b/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java index dc59292afe..fbc6eebdb5 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/BasicLinkChecker.java @@ -13,7 +13,7 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.MetadataValue; @@ -40,7 +40,7 @@ public class BasicLinkChecker extends AbstractCurationTask { private List results = null; // The log4j logger for this class - private static Logger log = Logger.getLogger(BasicLinkChecker.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicLinkChecker.class); /** diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java b/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java index 79da1eff90..d7ba7fed1f 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/BitstreamsIntoMetadata.java @@ -10,7 +10,7 @@ package org.dspace.ctask.general; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -33,7 +33,7 @@ public class BitstreamsIntoMetadata extends AbstractCurationTask { protected List results = null; // The log4j logger for this class - private static Logger log = Logger.getLogger(BitstreamsIntoMetadata.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamsIntoMetadata.class); /** diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java b/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java index 9b49105c36..2b6c52d0d6 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/MetadataWebService.java @@ -33,7 +33,7 @@ import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -130,7 +130,7 @@ public class MetadataWebService extends AbstractCurationTask implements Namespac /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataWebService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataWebService.class); // transform token parsing pattern protected Pattern ttPattern = Pattern.compile("\'([^\']*)\'|(\\S+)"); // URL of web service with template parameters diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java b/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java index 88700be299..43f61d13f8 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/MicrosoftTranslator.java @@ -16,7 +16,7 @@ import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; /** @@ -36,7 +36,7 @@ public class MicrosoftTranslator extends AbstractTranslator { protected final String baseUrl = "http://api.microsofttranslator.com/V2/Http.svc/Translate"; - private static final Logger log = Logger.getLogger(MicrosoftTranslator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MicrosoftTranslator.class); @Override diff --git a/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java b/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java index fa387a59c4..07bfed5fe5 100644 --- a/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java +++ b/dspace-api/src/main/java/org/dspace/ctask/general/RequiredMetadata.java @@ -100,17 +100,19 @@ public class RequiredMetadata extends AbstractCurationTask { reqList = new ArrayList(); List inputSet = reader.getInputsByCollectionHandle(handle); for (DCInputSet inputs : inputSet) { - for (DCInput input : inputs.getFields()) { - if (input.isRequired()) { - StringBuilder sb = new StringBuilder(); - sb.append(input.getSchema()).append("."); - sb.append(input.getElement()).append("."); - String qual = input.getQualifier(); - if (qual == null) { - qual = ""; + for (DCInput[] row : inputs.getFields()) { + for (DCInput input : row) { + if (input.isRequired()) { + StringBuilder sb = new StringBuilder(); + sb.append(input.getSchema()).append("."); + sb.append(input.getElement()).append("."); + String qual = input.getQualifier(); + if (qual == null) { + qual = ""; + } + sb.append(qual); + reqList.add(sb.toString()); } - sb.append(qual); - reqList.add(sb.toString()); } } reqMap.put(inputs.getFormName(), reqList); diff --git a/dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java b/dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java new file mode 100644 index 0000000000..279204cf57 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/ctask/testing/PropertyParameterTestingTask.java @@ -0,0 +1,61 @@ +/** + * 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.ctask.testing; + +import java.io.IOException; + +import org.dspace.content.DSpaceObject; +import org.dspace.core.Context; +import org.dspace.curate.AbstractCurationTask; +import org.dspace.curate.Curator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Logs what it was asked to do, samples run parameters and task + * properties, making no changes to the repository. For testing. + * + *

+ * To test parameters and properties, set a value for the run parameter + * "runParameter" or the task property "taskProperty". + * + *

+ * This is a debugging tool, NOT a regression test. + * + * @author mhwood + */ +public class PropertyParameterTestingTask + extends AbstractCurationTask { + private static final Logger LOG + = LoggerFactory.getLogger(PropertyParameterTestingTask.class); + + @Override + public void init(Curator curator, String taskId) + throws IOException { + super.init(curator, taskId); + LOG.info("Received 'init' on task {}", taskId); + // Display some properties. + LOG.info("taskProperty = '{}'; runParameter = '{}'", + taskProperty("taskProperty"), taskProperty("runParameter")); + } + + @Override + public int perform(DSpaceObject dso) + throws IOException { + LOG.info("Received 'perform' on {}", dso); + return Curator.CURATE_SUCCESS; + } + + @Override + public int perform(Context ctx, String id) + throws IOException { + LOG.info("Received 'perform' on object ID {}", id); + return Curator.CURATE_SUCCESS; + } +} diff --git a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java index cf9c9fe9de..d5ec37d60b 100644 --- a/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java +++ b/dspace-api/src/main/java/org/dspace/curate/AbstractCurationTask.java @@ -12,8 +12,8 @@ import java.sql.SQLException; import java.util.Iterator; 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.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -40,7 +40,7 @@ public abstract class AbstractCurationTask implements CurationTask { // curator-assigned taskId protected String taskId = null; // logger - private static Logger log = Logger.getLogger(AbstractCurationTask.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractCurationTask.class); protected CommunityService communityService; protected ItemService itemService; protected HandleService handleService; @@ -198,14 +198,17 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration property value for passed name, else * null if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @return value * the property value, or null */ protected String taskProperty(String name) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return parameter; + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getProperty(taskId + "." + name); } else { return configurationService.getProperty(name); @@ -215,6 +218,7 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration integer property value for passed name, else * passed default value if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @param defaultValue value @@ -223,8 +227,10 @@ public abstract class AbstractCurationTask implements CurationTask { * the property value, or default value */ protected int taskIntProperty(String name, int defaultValue) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return Integer.valueOf(parameter); + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getIntProperty(taskId + "." + name, defaultValue); } else { return configurationService.getIntProperty(name, defaultValue); @@ -234,6 +240,7 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration long property value for passed name, else * passed default value if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @param defaultValue value @@ -242,8 +249,10 @@ public abstract class AbstractCurationTask implements CurationTask { * the property value, or default */ protected long taskLongProperty(String name, long defaultValue) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return Long.valueOf(parameter); + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getLongProperty(taskId + "." + name, defaultValue); } else { return configurationService.getLongProperty(name, defaultValue); @@ -253,6 +262,7 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration boolean property value for passed name, else * passed default value if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @param defaultValue value @@ -261,8 +271,10 @@ public abstract class AbstractCurationTask implements CurationTask { * the property value, or default */ protected boolean taskBooleanProperty(String name, boolean defaultValue) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return Boolean.valueOf(parameter); + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getBooleanProperty(taskId + "." + name, defaultValue); } else { return configurationService.getBooleanProperty(name, defaultValue); @@ -272,14 +284,17 @@ public abstract class AbstractCurationTask implements CurationTask { /** * Returns task configuration Array property value for passed name, else * null if no properties defined or no value for passed key. + * If a taskID/Name is specified, prepend it on the configuration name. * * @param name the property name * @return value * the property value, or null */ protected String[] taskArrayProperty(String name) { - // If a taskID/Name is specified, prepend it on the configuration name - if (StringUtils.isNotBlank(taskId)) { + String parameter = curator.getRunParameter(name); + if (null != parameter) { + return new String[] { parameter }; + } else if (StringUtils.isNotBlank(taskId)) { return configurationService.getArrayProperty(taskId + "." + name); } else { return configurationService.getArrayProperty(name); diff --git a/dspace-api/src/main/java/org/dspace/curate/CitationPage.java b/dspace-api/src/main/java/org/dspace/curate/CitationPage.java index 8634eeb5bb..386bf0ba92 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CitationPage.java +++ b/dspace-api/src/main/java/org/dspace/curate/CitationPage.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.tuple.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -46,7 +46,7 @@ public class CitationPage extends AbstractCurationTask { /** * Class Logger */ - private static Logger log = Logger.getLogger(CitationPage.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CitationPage.class); protected int status = Curator.CURATE_UNSET; protected String result = null; diff --git a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java index c0b206abfc..d5577cf368 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java +++ b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java @@ -9,7 +9,9 @@ package org.dspace.curate; import java.io.BufferedReader; import java.io.FileReader; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -48,6 +50,8 @@ public class CurationCli { "file containing curation task names"); options.addOption("i", "id", true, "Id (handle) of object to perform task on, or 'all' to perform on whole repository"); + options.addOption("p", "parameter", true, + "a task parameter 'NAME=VALUE'"); options.addOption("q", "queue", true, "name of task queue to process"); options.addOption("e", "eperson", true, @@ -71,6 +75,7 @@ public class CurationCli { String reporterName = null; String scope = null; boolean verbose = false; + final Map parameters = new HashMap<>(); if (line.hasOption('h')) { HelpFormatter help = new HelpFormatter(); @@ -104,6 +109,19 @@ public class CurationCli { ePersonName = line.getOptionValue('e'); } + if (line.hasOption('p')) { // parameter + for (String parameter : line.getOptionValues('p')) { + String[] parts = parameter.split("=", 2); + String name = parts[0].trim(); + String value; + if (parts.length > 1) { + value = parts[1].trim(); + } else { + value = "true"; + } + parameters.put(name, value); + } + } if (line.hasOption('r')) { // report file reporterName = line.getOptionValue('r'); } @@ -154,6 +172,7 @@ public class CurationCli { Curator.TxScope txScope = Curator.TxScope.valueOf(scope.toUpperCase()); curator.setTransactionScope(txScope); } + curator.addParameters(parameters); // we are operating in batch mode, if anyone cares. curator.setInvoked(Curator.Invoked.BATCH); // load curation tasks diff --git a/dspace-api/src/main/java/org/dspace/curate/Curator.java b/dspace-api/src/main/java/org/dspace/curate/Curator.java index 55d9843cb3..1a78544bc0 100644 --- a/dspace-api/src/main/java/org/dspace/curate/Curator.java +++ b/dspace-api/src/main/java/org/dspace/curate/Curator.java @@ -15,7 +15,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -78,10 +78,11 @@ public class Curator { ; - private static final Logger log = Logger.getLogger(Curator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Curator.class); protected static final ThreadLocal curationCtx = new ThreadLocal<>(); + protected final Map runParameters = new HashMap<>(); protected Map trMap = new HashMap<>(); protected List perfList = new ArrayList<>(); protected TaskQueue taskQ = null; @@ -102,6 +103,32 @@ public class Curator { handleService = HandleServiceFactory.getInstance().getHandleService(); } + /** + * Set a parameter visible to all tasks in this Curator instance. + * @param name the parameter's name. + * @param value the parameter's value. + */ + public void addParameter(String name, String value) { + runParameters.put(name, value); + } + + /** + * Set many parameters visible to all tasks in this Curator instance. + * @param parameters parameter name/value pairs. + */ + public void addParameters(Map parameters) { + runParameters.putAll(parameters); + } + + /** + * Look up a run parameter. + * @param name the name of the desired parameter. + * @return the value of the named parameter. + */ + public String getRunParameter(String name) { + return runParameters.get(name); + } + /** * Add a task to the set to be performed. Caller should make no assumptions * on execution ordering. diff --git a/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java b/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java index fc665bcf2c..979ade99a5 100644 --- a/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java +++ b/dspace-api/src/main/java/org/dspace/curate/FileTaskQueue.java @@ -19,7 +19,7 @@ import java.util.Iterator; import java.util.List; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; @@ -30,7 +30,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author richardrodgers */ public class FileTaskQueue implements TaskQueue { - private static Logger log = Logger.getLogger(TaskQueue.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TaskQueue.class); // base directory for curation task queues protected String tqDir; diff --git a/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java b/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java index 706992093b..a9a8e8906a 100644 --- a/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java +++ b/dspace-api/src/main/java/org/dspace/curate/TaskResolver.java @@ -20,7 +20,7 @@ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.factory.CoreServiceFactory; import org.dspace.services.factory.DSpaceServicesFactory; @@ -64,7 +64,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class TaskResolver { // logging service - private static Logger log = Logger.getLogger(TaskResolver.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TaskResolver.class); // base directory of task scripts & catalog name protected static final String CATALOG = "task.catalog"; diff --git a/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java b/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java index 580f8c42c3..5cecc13b89 100644 --- a/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/curate/WorkflowCuratorServiceImpl.java @@ -23,7 +23,7 @@ import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -58,7 +58,7 @@ public class WorkflowCuratorServiceImpl implements WorkflowCuratorService { /** * log4j logger */ - private Logger log = Logger.getLogger(WorkflowCuratorServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkflowCuratorServiceImpl.class); protected Map tsMap = new HashMap(); diff --git a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java index 933ba459cb..78872a8bc7 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java +++ b/dspace-api/src/main/java/org/dspace/discovery/FullTextContentStreams.java @@ -27,7 +27,7 @@ import com.google.common.collect.Iterables; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.Charsets; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.common.util.ContentStreamBase; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; @@ -42,7 +42,7 @@ import org.dspace.core.Context; * Construct a ContentStream from a File */ public class FullTextContentStreams extends ContentStreamBase { - private static final Logger log = Logger.getLogger(FullTextContentStreams.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(FullTextContentStreams.class); public static final String FULLTEXT_BUNDLE = "TEXT"; diff --git a/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java b/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java index 7aaf63fe2d..1381e4dda2 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java +++ b/dspace-api/src/main/java/org/dspace/discovery/IndexClient.java @@ -16,7 +16,7 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; @@ -37,7 +37,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class IndexClient { - private static final Logger log = Logger.getLogger(IndexClient.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(IndexClient.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java b/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java index d8ec35806e..9117dd7ad2 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java +++ b/dspace-api/src/main/java/org/dspace/discovery/IndexEventConsumer.java @@ -10,7 +10,7 @@ package org.dspace.discovery; import java.util.HashSet; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bundle; import org.dspace.content.DSpaceObject; import org.dspace.core.Constants; @@ -30,7 +30,7 @@ public class IndexEventConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(IndexEventConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IndexEventConsumer.class); // collect Items, Collections, Communities that need indexing private Set objectsToUpdate = null; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java index 263370ed62..9a19bf0646 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -37,9 +37,9 @@ import java.util.Vector; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.Transformer; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.validator.routines.UrlValidator; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; @@ -47,7 +47,7 @@ import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.SolrServer; @@ -134,7 +134,7 @@ import org.springframework.stereotype.Service; @Service public class SolrServiceImpl implements SearchService, IndexingService { - private static final Logger log = Logger.getLogger(SolrServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrServiceImpl.class); protected static final String LAST_INDEXED_FIELD = "SolrIndexer.lastIndexed"; protected static final String HANDLE_FIELD = "handle"; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java index b47f81b6a2..5e78173d93 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceMetadataBrowseIndexingPlugin.java @@ -11,8 +11,9 @@ import java.util.HashSet; 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.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.solr.common.SolrInputDocument; import org.dspace.browse.BrowseException; import org.dspace.browse.BrowseIndex; @@ -44,8 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SolrServiceMetadataBrowseIndexingPlugin implements SolrServiceIndexPlugin { - private static final Logger log = Logger - .getLogger(SolrServiceMetadataBrowseIndexingPlugin.class); + private static final Logger log = LogManager.getLogger(SolrServiceMetadataBrowseIndexingPlugin.class); @Autowired(required = true) protected ItemService itemService; diff --git a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java index 4bea98390d..4fcc8c38ca 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceResourceRestrictionPlugin.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import java.util.List; import java.util.Set; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.common.SolrInputDocument; import org.dspace.authorize.ResourcePolicy; @@ -39,7 +39,8 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SolrServiceResourceRestrictionPlugin implements SolrServiceIndexPlugin, SolrServiceSearchPlugin { - private static final Logger log = Logger.getLogger(SolrServiceResourceRestrictionPlugin.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(SolrServiceResourceRestrictionPlugin.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java index d2d32d5ad9..69f992a29b 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java +++ b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoveryConfigurationService.java @@ -11,7 +11,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.services.factory.DSpaceServicesFactory; diff --git a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java index 8538b54db2..db6ac80f29 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java +++ b/dspace-api/src/main/java/org/dspace/discovery/configuration/DiscoverySortConfiguration.java @@ -11,7 +11,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * @author Kevin Van de Velde (kevin at atmire dot com) diff --git a/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java b/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java index a96ed6c3d3..60081d1153 100644 --- a/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/disseminate/CitationDocumentServiceImpl.java @@ -20,9 +20,9 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; @@ -59,7 +59,7 @@ public class CitationDocumentServiceImpl implements CitationDocumentService, Ini /** * Class Logger */ - private static Logger log = Logger.getLogger(CitationDocumentServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CitationDocumentServiceImpl.class); /** * A set of MIME types that can have a citation page added to them. That is, diff --git a/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java b/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java index 45b2d407ac..7857a45eb8 100644 --- a/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java +++ b/dspace-api/src/main/java/org/dspace/embargo/DefaultEmbargoSetter.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.factory.AuthorizeServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java b/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java index c0ee6ad720..49d2650bfd 100644 --- a/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java +++ b/dspace-api/src/main/java/org/dspace/embargo/EmbargoCLITool.java @@ -16,7 +16,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DCDate; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -37,7 +37,7 @@ public class EmbargoCLITool { /** * log4j category */ - private static final Logger log = Logger.getLogger(EmbargoServiceImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(EmbargoServiceImpl.class); private static final EmbargoService embargoService = EmbargoServiceFactory.getInstance().getEmbargoService(); diff --git a/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java b/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java index 68efce46e1..69c601034a 100644 --- a/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/embargo/EmbargoServiceImpl.java @@ -13,7 +13,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DCDate; import org.dspace.content.Item; @@ -51,7 +51,7 @@ public class EmbargoServiceImpl implements EmbargoService { /** * log4j category */ - private final Logger log = Logger.getLogger(EmbargoServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(EmbargoServiceImpl.class); // Metadata field components for user-supplied embargo terms // set from the DSpace configuration by init() diff --git a/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java index 6b9531788a..0e1034328a 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/AccountServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Locale; import javax.mail.MessagingException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; @@ -42,7 +42,7 @@ public class AccountServiceImpl implements AccountService { /** * log4j log */ - private static Logger log = Logger.getLogger(AccountServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AccountServiceImpl.class); @Autowired(required = true) protected EPersonService ePersonService; @Autowired(required = true) diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPerson.java b/dspace-api/src/main/java/org/dspace/eperson/EPerson.java index 5835ebeac8..fc2950ee2b 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPerson.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPerson.java @@ -21,8 +21,8 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import org.apache.commons.lang.BooleanUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.DSpaceObjectLegacySupport; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java b/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java index 62761444a5..4f094bb5c5 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPersonConsumer.java @@ -11,7 +11,7 @@ import java.util.Date; import java.util.UUID; import javax.mail.MessagingException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; import org.dspace.core.Context; @@ -35,7 +35,7 @@ public class EPersonConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(EPersonConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonConsumer.class); protected EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); diff --git a/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java index 4c04482f1f..f173250cf3 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/EPersonServiceImpl.java @@ -18,8 +18,8 @@ import java.util.UUID; import org.apache.commons.codec.DecoderException; import org.apache.commons.collections4.CollectionUtils; -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.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.DSpaceObjectServiceImpl; @@ -50,7 +50,7 @@ public class EPersonServiceImpl extends DSpaceObjectServiceImpl impleme /** * log4j logger */ - private final Logger log = Logger.getLogger(EPersonServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonServiceImpl.class); @Autowired(required = true) protected EPersonDAO ePersonDAO; diff --git a/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java b/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java index df57f173b3..09bdf34d4c 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java +++ b/dspace-api/src/main/java/org/dspace/eperson/Group2GroupCache.java @@ -81,7 +81,7 @@ public class Group2GroupCache implements Serializable { @Override public int hashCode() { - return new org.apache.commons.lang.builder.HashCodeBuilder() + return new org.apache.commons.lang3.builder.HashCodeBuilder() .append(parent == null ? "" : parent.getID()) .append(child == null ? "" : child.getID()) .toHashCode(); diff --git a/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java index fccaf3f1c8..7851e1cdc3 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/GroupServiceImpl.java @@ -18,7 +18,7 @@ import java.util.Set; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.dspace.authorize.AuthorizeConfiguration; @@ -686,7 +686,7 @@ public class GroupServiceImpl extends DSpaceObjectServiceImpl implements @Override public Group findByIdOrLegacyId(Context context, String id) throws SQLException { - if (org.apache.commons.lang.StringUtils.isNumeric(id)) { + if (org.apache.commons.lang3.StringUtils.isNumeric(id)) { return findByLegacyId(context, Integer.parseInt(id)); } else { return find(context, UUIDUtils.fromString(id)); diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java index 1cdefcbbdd..d7174e7d45 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeCLITool.java @@ -25,9 +25,8 @@ import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Level; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.Item; @@ -55,7 +54,7 @@ import org.dspace.search.HarvestedItemInfo; */ public class SubscribeCLITool { - private static final Logger log = Logger.getLogger(SubscribeCLITool.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubscribeCLITool.class); private static HandleService handleService = HandleServiceFactory.getInstance().getHandleService(); private static ItemService itemService = ContentServiceFactory.getInstance().getItemService(); @@ -315,10 +314,6 @@ public class SubscribeCLITool { boolean test = line.hasOption("t"); - if (test) { - log.setLevel(Level.DEBUG); - } - Context context = null; try { diff --git a/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java b/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java index cd9e078463..34dbcdbeaa 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/SubscribeServiceImpl.java @@ -10,7 +10,7 @@ package org.dspace.eperson; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Collection; @@ -32,7 +32,7 @@ public class SubscribeServiceImpl implements SubscribeService { /** * log4j logger */ - private Logger log = Logger.getLogger(SubscribeServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(SubscribeServiceImpl.class); @Autowired(required = true) protected SubscriptionDAO subscriptionDAO; diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java index 581393e686..fd4c6f59d9 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/EPersonDAOImpl.java @@ -15,18 +15,21 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; -import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections.ListUtils; import org.apache.commons.lang3.StringUtils; import org.dspace.content.MetadataField; import org.dspace.core.AbstractHibernateDSODAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; +import org.dspace.eperson.EPerson_; import org.dspace.eperson.Group; import org.dspace.eperson.dao.EPersonDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the EPerson object. @@ -42,22 +45,23 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements @Override public EPerson findByEmail(Context context, String email) throws SQLException { - // All email addresses are stored as lowercase, so ensure that the email address is lowercased for the lookup - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.eq("email", email.toLowerCase())); - - criteria.setCacheable(true); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where(criteriaBuilder.equal(ePersonRoot.get(EPerson_.email), email.toLowerCase())); + return uniqueResult(context, criteriaQuery, true, EPerson.class, -1, -1); } @Override public EPerson findByNetid(Context context, String netid) throws SQLException { - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.eq("netid", netid)); - - criteria.setCacheable(true); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where((criteriaBuilder.equal(ePersonRoot.get(EPerson_.netid), netid))); + return uniqueResult(context, criteriaQuery, true, EPerson.class, -1, -1); } @Override @@ -101,8 +105,8 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements sortFields = Collections.singletonList(metadataSortField); } - Query query = getSearchQuery(context, queryString, null, Collections.EMPTY_LIST, sortFields, - sortField, pageSize, offset); + Query query = getSearchQuery(context, queryString, null, ListUtils.EMPTY_LIST, sortFields, sortField, pageSize, + offset); return list(query); } @@ -119,26 +123,32 @@ public class EPersonDAOImpl extends AbstractHibernateDSODAO implements idList.add(group.getID()); } - query.setParameterList("idList", idList); + query.setParameter("idList", idList); return list(query); } @Override public List findWithPasswordWithoutDigestAlgorithm(Context context) throws SQLException { - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.and( - Restrictions.isNotNull("password"), - Restrictions.isNull("digestAlgorithm") - )); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.isNotNull(ePersonRoot.get(EPerson_.password)), + criteriaBuilder.isNull(ePersonRoot.get(EPerson_.digestAlgorithm)) + ) + ); + return list(context, criteriaQuery, false, EPerson.class, -1, -1); } @Override public List findNotActiveSince(Context context, Date date) throws SQLException { - Criteria criteria = createCriteria(context, EPerson.class); - criteria.add(Restrictions.le("lastActive", date)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, EPerson.class); + Root ePersonRoot = criteriaQuery.from(EPerson.class); + criteriaQuery.select(ePersonRoot); + criteriaQuery.where(criteriaBuilder.lessThanOrEqualTo(ePersonRoot.get(EPerson_.lastActive), date)); + return list(context, criteriaQuery, false, EPerson.class, -1, -1); } protected Query getSearchQuery(Context context, String queryString, String queryParam, diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java index 03858e2240..717b41e8b9 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/Group2GroupCacheDAOImpl.java @@ -8,17 +8,20 @@ package org.dspace.eperson.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.Group; import org.dspace.eperson.Group2GroupCache; +import org.dspace.eperson.Group2GroupCache_; import org.dspace.eperson.dao.Group2GroupCacheDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Group2GroupCache object. @@ -34,26 +37,27 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO findByParent(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, Group2GroupCache.class); - criteria.add(Restrictions.eq("parent.id", group.getID())); - criteria.setCacheable(true); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); + Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); + criteriaQuery.select(group2GroupCacheRoot); + criteriaQuery.where(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.parent), group)); + return list(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } @Override public List findByChildren(Context context, Iterable groups) throws SQLException { - Criteria criteria = createCriteria(context, Group2GroupCache.class); - - Disjunction orDisjunction = Restrictions.or(); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Group2GroupCache.class); + Root group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); + List eqPredicates = new LinkedList<>(); for (Group group : groups) { - orDisjunction.add(Restrictions.eq("child.id", group.getID())); + eqPredicates.add(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), group)); } - - criteria.add(orDisjunction); - criteria.setCacheable(true); - - return list(criteria); + Predicate orPredicate = criteriaBuilder.or(eqPredicates.toArray(new Predicate[] {})); + criteriaQuery.select(group2GroupCacheRoot); + criteriaQuery.where(orPredicate); + return list(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } @Override @@ -63,19 +67,23 @@ public class Group2GroupCacheDAOImpl extends AbstractHibernateDAO group2GroupCacheRoot = criteriaQuery.from(Group2GroupCache.class); + criteriaQuery.select(group2GroupCacheRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.parent), parent), + criteriaBuilder.equal(group2GroupCacheRoot.get(Group2GroupCache_.child), child) + ) + ); + return uniqueResult(context, criteriaQuery, true, Group2GroupCache.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java index e61f28b7f5..3c26468cc0 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/GroupDAOImpl.java @@ -11,8 +11,9 @@ import java.sql.SQLException; import java.util.Collections; import java.util.List; import java.util.UUID; +import javax.persistence.Query; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.dspace.content.MetadataField; import org.dspace.core.AbstractHibernateDSODAO; @@ -20,7 +21,6 @@ import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.dao.GroupDAO; -import org.hibernate.Query; /** * Hibernate implementation of the Database Access Object interface class for the Group object. @@ -84,7 +84,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou if (offset > 0) { query.setFirstResult(offset); } - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return list(query); } @@ -94,7 +94,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou Query query = createQuery(context, "from Group where (from EPerson e where e.id = :eperson_id) in elements(epeople)"); query.setParameter("eperson_id", ePerson.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return list(query); } @@ -106,7 +106,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou "where g.name = :name "); query.setParameter("name", name); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } @@ -132,7 +132,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou query.setParameter("id", id); query.setParameter("eperson_id", ePerson.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return singleResult(query); } @@ -182,7 +182,7 @@ public class GroupDAOImpl extends AbstractHibernateDSODAO implements Grou "JOIN g.groups c "); @SuppressWarnings("unchecked") - List> results = query.list(); + List> results = query.getResultList(); return results; } diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java index c5aa36b5a4..35fda4b62f 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/RegistrationDataDAOImpl.java @@ -8,14 +8,16 @@ package org.dspace.eperson.dao.impl; import java.sql.SQLException; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.RegistrationData; +import org.dspace.eperson.RegistrationData_; import org.dspace.eperson.dao.RegistrationDataDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the RegistrationData object. @@ -32,16 +34,22 @@ public class RegistrationDataDAOImpl extends AbstractHibernateDAO registrationDataRoot = criteriaQuery.from(RegistrationData.class); + criteriaQuery.select(registrationDataRoot); + criteriaQuery.where(criteriaBuilder.equal(registrationDataRoot.get(RegistrationData_.email), email)); + return uniqueResult(context, criteriaQuery, false, RegistrationData.class, -1, -1); } @Override public RegistrationData findByToken(Context context, String token) throws SQLException { - Criteria criteria = createCriteria(context, RegistrationData.class); - criteria.add(Restrictions.eq("token", token)); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, RegistrationData.class); + Root registrationDataRoot = criteriaQuery.from(RegistrationData.class); + criteriaQuery.select(registrationDataRoot); + criteriaQuery.where(criteriaBuilder.equal(registrationDataRoot.get(RegistrationData_.token), token)); + return uniqueResult(context, criteriaQuery, false, RegistrationData.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java index 88734410e1..a90c5da5a1 100644 --- a/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/eperson/dao/impl/SubscriptionDAOImpl.java @@ -8,18 +8,20 @@ package org.dspace.eperson.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Subscription; +import org.dspace.eperson.Subscription_; import org.dspace.eperson.dao.SubscriptionDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Subscription object. @@ -35,27 +37,28 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl @Override public List findByEPerson(Context context, EPerson eperson) throws SQLException { - Criteria criteria = createCriteria(context, Subscription.class); - criteria.add( - Restrictions.and( - Restrictions.eq("ePerson", eperson) - ) - ); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); + Root subscriptionRoot = criteriaQuery.from(Subscription.class); + criteriaQuery.select(subscriptionRoot); + criteriaQuery.where(criteriaBuilder.equal(subscriptionRoot.get(Subscription_.ePerson), eperson)); + return list(context, criteriaQuery, false, Subscription.class, -1, -1); } @Override public Subscription findByCollectionAndEPerson(Context context, EPerson eperson, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, Subscription.class); - criteria.add( - Restrictions.and( - Restrictions.eq("ePerson", eperson), - Restrictions.eq("collection", collection) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + javax.persistence.criteria.CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); + Root subscriptionRoot = criteriaQuery.from(Subscription.class); + criteriaQuery.select(subscriptionRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(subscriptionRoot.get(Subscription_.ePerson), eperson), + criteriaBuilder.equal(subscriptionRoot.get(Subscription_.collection), collection) + ) ); - return singleResult(criteria); + return singleResult(context, criteriaQuery); } @@ -87,8 +90,17 @@ public class SubscriptionDAOImpl extends AbstractHibernateDAO impl @Override public List findAllOrderedByEPerson(Context context) throws SQLException { - Criteria criteria = createCriteria(context, Subscription.class); - criteria.addOrder(Order.asc("ePerson")); - return list(criteria); + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Subscription.class); + Root subscriptionRoot = criteriaQuery.from(Subscription.class); + criteriaQuery.select(subscriptionRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(subscriptionRoot.get(Subscription_.ePerson))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, Subscription.class, -1, -1); } -} +} \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java b/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java index 63b2dab1a9..543ad934b3 100644 --- a/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java +++ b/dspace-api/src/main/java/org/dspace/event/BasicDispatcher.java @@ -9,7 +9,7 @@ package org.dspace.event; import java.util.Iterator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.Utils; @@ -29,7 +29,7 @@ public class BasicDispatcher extends Dispatcher { /** * log4j category */ - private static Logger log = Logger.getLogger(BasicDispatcher.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicDispatcher.class); @Override public void addConsumerProfile(ConsumerProfile cp) diff --git a/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java b/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java index f43cc370f1..01f0d4fc56 100644 --- a/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java +++ b/dspace-api/src/main/java/org/dspace/event/ConsumerProfile.java @@ -10,7 +10,7 @@ package org.dspace.event; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; /** @@ -25,7 +25,7 @@ public class ConsumerProfile { /** * log4j category */ - private static Logger log = Logger.getLogger(ConsumerProfile.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ConsumerProfile.class); /** * Name matching the key in DSpace Configuration diff --git a/dspace-api/src/main/java/org/dspace/event/Event.java b/dspace-api/src/main/java/org/dspace/event/Event.java index 45b54362d6..45b6407b28 100644 --- a/dspace-api/src/main/java/org/dspace/event/Event.java +++ b/dspace-api/src/main/java/org/dspace/event/Event.java @@ -16,8 +16,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; @@ -224,7 +224,7 @@ public class Event implements Serializable { /** * log4j category */ - private static Logger log = Logger.getLogger(Event.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Event.class); /** * Constructor. diff --git a/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java b/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java index 891148b672..1afc0a22f5 100644 --- a/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/event/EventServiceImpl.java @@ -14,7 +14,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.pool2.KeyedObjectPool; import org.apache.commons.pool2.KeyedPooledObjectFactory; import org.apache.commons.pool2.PoolUtils; @@ -22,7 +22,7 @@ import org.apache.commons.pool2.PooledObject; import org.apache.commons.pool2.impl.DefaultPooledObject; import org.apache.commons.pool2.impl.GenericKeyedObjectPool; import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.event.service.EventService; import org.dspace.services.ConfigurationService; @@ -39,7 +39,7 @@ public class EventServiceImpl implements EventService { /** * log4j category */ - private Logger log = Logger.getLogger(EventServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(EventServiceImpl.class); protected DispatcherPoolFactory dispatcherFactory = null; diff --git a/dspace-api/src/main/java/org/dspace/event/TestConsumer.java b/dspace-api/src/main/java/org/dspace/event/TestConsumer.java index 379276ccda..e40c0d9a36 100644 --- a/dspace-api/src/main/java/org/dspace/event/TestConsumer.java +++ b/dspace-api/src/main/java/org/dspace/event/TestConsumer.java @@ -12,7 +12,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.ArrayUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Context; import org.dspace.eperson.EPerson; @@ -27,7 +27,7 @@ import org.dspace.eperson.EPerson; */ public class TestConsumer implements Consumer { // Log4j logger - private static Logger log = Logger.getLogger(TestConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TestConsumer.class); // Send diagnostic output here - set to null to turn it off. private static PrintStream out = ConfigurationManager diff --git a/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java b/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java index 6c95a89e25..a24c02a2e1 100644 --- a/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java +++ b/dspace-api/src/main/java/org/dspace/google/GoogleAccount.java @@ -20,7 +20,7 @@ import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.analytics.Analytics; import com.google.api.services.analytics.AnalyticsScopes; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.services.factory.DSpaceServicesFactory; /** @@ -47,7 +47,7 @@ public class GoogleAccount { private volatile static GoogleAccount uniqueInstance; - private static Logger log = Logger.getLogger(GoogleAccount.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleAccount.class); private GoogleAccount() { diff --git a/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java b/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java index f7ebaebb4d..ec86e5b410 100644 --- a/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java +++ b/dspace-api/src/main/java/org/dspace/google/GoogleRecorderEventListener.java @@ -23,10 +23,10 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; -import org.dspace.core.ConfigurationManager; import org.dspace.core.Constants; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.dspace.services.model.Event; import org.dspace.usage.AbstractUsageEventListener; @@ -46,10 +46,11 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { private String analyticsKey; private CloseableHttpClient httpclient; private String GoogleURL = "https://www.google-analytics.com/collect"; - private static Logger log = Logger.getLogger(GoogleRecorderEventListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleRecorderEventListener.class); protected ContentServiceFactory contentServiceFactory; protected ConfigurationService configurationService; + protected ClientInfoService clientInfoService; public GoogleRecorderEventListener() { // httpclient is threadsafe so we only need one. @@ -62,10 +63,15 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { } @Autowired - public void setConfigurationService(final ConfigurationService configurationService) { + public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; } + @Autowired + public void setClientInfoService(ClientInfoService clientInfoService) { + this.clientInfoService = clientInfoService; + } + @Override public void receiveEvent(Event event) { if ((event instanceof UsageEvent)) { @@ -187,22 +193,7 @@ public class GoogleRecorderEventListener extends AbstractUsageEventListener { } private String getIPAddress(HttpServletRequest request) { - String clientIP = request.getRemoteAddr(); - if (ConfigurationManager.getBooleanProperty("useProxies", false) && request - .getHeader("X-Forwarded-For") != null) { - /* This header is a comma delimited list */ - for (String xfip : request.getHeader("X-Forwarded-For").split(",")) { - /* proxy itself will sometime populate this header with the same value in - remote address. ordering in spec is vague, we'll just take the last - not equal to the proxy - */ - if (!request.getHeader("X-Forwarded-For").contains(clientIP)) { - clientIP = xfip.trim(); - } - } - } - - return clientIP; + return clientInfoService.getClientIp(request); } } diff --git a/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java b/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java index a965ade577..9e8d04faf2 100644 --- a/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java +++ b/dspace-api/src/main/java/org/dspace/handle/HandlePlugin.java @@ -21,7 +21,7 @@ import net.handle.hdllib.HandleValue; import net.handle.hdllib.ScanCallback; import net.handle.hdllib.Util; import net.handle.util.StreamTable; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.handle.factory.HandleServiceFactory; import org.dspace.handle.service.HandleService; @@ -51,7 +51,7 @@ public class HandlePlugin implements HandleStorage { /** * log4j category */ - private static Logger log = Logger.getLogger(HandlePlugin.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandlePlugin.class); /** * The DSpace service manager kernel diff --git a/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java b/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java index d322fdd5c2..ca545e0722 100644 --- a/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/HandleServiceImpl.java @@ -12,8 +12,8 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -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.content.service.SiteService; import org.dspace.core.Constants; @@ -41,7 +41,7 @@ public class HandleServiceImpl implements HandleService { /** * log4j category */ - private static Logger log = Logger.getLogger(HandleServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleServiceImpl.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java b/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java index 333ac801f8..5710f8cf81 100644 --- a/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java +++ b/dspace-api/src/main/java/org/dspace/handle/UpdateHandlePrefix.java @@ -12,7 +12,7 @@ import java.io.InputStreamReader; import java.sql.SQLException; import java.util.Iterator; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.MetadataValue; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.MetadataValueService; @@ -33,7 +33,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class UpdateHandlePrefix { - private static final Logger log = Logger.getLogger(UpdateHandlePrefix.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(UpdateHandlePrefix.class); private static final ConfigurationService configurationService = DSpaceServicesFactory.getInstance() .getConfigurationService(); diff --git a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java index 1aac41a144..3bd702bf80 100644 --- a/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/handle/dao/impl/HandleDAOImpl.java @@ -13,15 +13,17 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collections; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.DSpaceObject; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.handle.Handle; +import org.dspace.handle.Handle_; import org.dspace.handle.dao.HandleDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter; @@ -56,7 +58,7 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl query.setParameter("id", dso.getID()); - query.setCacheable(true); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); return list(query); } } @@ -71,22 +73,32 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl query.setParameter("handle", handle); - query.setCacheable(true); - return uniqueResult(query); + query.setHint("org.hibernate.cacheable", Boolean.TRUE); + return singleResult(query); } @Override public List findByPrefix(Context context, String prefix) throws SQLException { - Criteria criteria = createCriteria(context, Handle.class); - criteria.add(Restrictions.like("handle", prefix + "%")); - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Handle.class); + Root handleRoot = criteriaQuery.from(Handle.class); + criteriaQuery.select(handleRoot); + criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix + "%")); + return list(context, criteriaQuery, false, Handle.class, -1, -1); } @Override public long countHandlesByPrefix(Context context, String prefix) throws SQLException { - Criteria criteria = createCriteria(context, Handle.class); - criteria.add(Restrictions.like("handle", prefix + "%")); - return countLong(criteria); + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root handleRoot = criteriaQuery.from(Handle.class); + criteriaQuery.select(criteriaBuilder.count(criteriaQuery.from(Handle.class))); + criteriaQuery.where(criteriaBuilder.like(handleRoot.get(Handle_.handle), prefix + "%")); + return countLong(context, criteriaQuery, criteriaBuilder, handleRoot); } @Override @@ -94,9 +106,9 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl String hql = "UPDATE Handle set handle = concat(:newPrefix, '/', substring(handle, :oldPrefixLength + 2)) " + "WHERE handle like concat(:oldPrefix,'%')"; Query query = createQuery(context, hql); - query.setString("newPrefix", newPrefix); - query.setInteger("oldPrefixLength", oldPrefix.length()); - query.setString("oldPrefix", oldPrefix); + query.setParameter("newPrefix", newPrefix); + query.setParameter("oldPrefixLength", oldPrefix.length()); + query.setParameter("oldPrefix", oldPrefix); return query.executeUpdate(); } @@ -107,7 +119,6 @@ public class HandleDAOImpl extends AbstractHibernateDAO implements Handl /** * Return next available value of Handle suffix (based on DB sequence). - * * @param context Current DSpace Context * @return next available Handle suffix (as a Long) * @throws SQLException if database error or sequence doesn't exist diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java index 37690fa8d0..727c41ee37 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestConsumer.java @@ -9,7 +9,7 @@ package org.dspace.harvest; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.core.Constants; @@ -31,7 +31,7 @@ public class HarvestConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(HarvestConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HarvestConsumer.class); protected HarvestedCollectionService harvestedCollectionService; protected HarvestedItemService harvestedItemService; diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java index 2867a804c9..d668b09bc4 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestScheduler.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Stack; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -32,7 +32,7 @@ import org.dspace.harvest.service.HarvestedCollectionService; * @author alexey */ public class HarvestScheduler implements Runnable { - protected static Logger log = Logger.getLogger(HarvestScheduler.class); + protected static Logger log = org.apache.logging.log4j.LogManager.getLogger(HarvestScheduler.class); protected static EPerson harvestAdmin; diff --git a/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java b/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java index c021d455bd..52498558d4 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java +++ b/dspace-api/src/main/java/org/dspace/harvest/HarvestThread.java @@ -10,7 +10,7 @@ package org.dspace.harvest; import java.sql.SQLException; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -25,7 +25,7 @@ import org.dspace.harvest.service.HarvestedCollectionService; */ public class HarvestThread extends Thread { - private static final Logger log = Logger.getLogger(HarvestThread.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HarvestThread.class); protected UUID collectionId; protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected HarvestedCollectionService harvestedCollectionService = diff --git a/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java b/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java index 4593f10592..4e78729105 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java +++ b/dspace-api/src/main/java/org/dspace/harvest/OAIHarvester.java @@ -31,8 +31,8 @@ import ORG.oclc.oai.harvester2.verb.Identify; import ORG.oclc.oai.harvester2.verb.ListIdentifiers; import ORG.oclc.oai.harvester2.verb.ListMetadataFormats; import ORG.oclc.oai.harvester2.verb.ListRecords; -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.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -88,7 +88,7 @@ public class OAIHarvester { /** * log4j category */ - private static Logger log = Logger.getLogger(OAIHarvester.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(OAIHarvester.class); private static final Namespace ATOM_NS = Namespace.getNamespace("http://www.w3.org/2005/Atom"); private static final Namespace ORE_NS = Namespace.getNamespace("http://www.openarchives.org/ore/terms/"); diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java index aee60639c3..95a0bdf216 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedCollectionDAOImpl.java @@ -9,18 +9,19 @@ package org.dspace.harvest.dao.impl; import java.sql.SQLException; import java.util.Date; +import java.util.LinkedList; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.harvest.HarvestedCollection; +import org.dspace.harvest.HarvestedCollection_; import org.dspace.harvest.dao.HarvestedCollectionDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.LogicalExpression; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the HarvestedCollection object. @@ -39,98 +40,136 @@ public class HarvestedCollectionDAOImpl extends AbstractHibernateDAO ? and harvest_status = ? -// order by last_harvested desc limit 1"; - Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); - criteria.addOrder(Order.desc("lastHarvested")); - return singleResult(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } @Override public HarvestedCollection findByStatusAndMinimalTypeOrderByLastHarvestedAsc(Context context, int status, int type, int limit) throws SQLException { -// Old query: "select collection_id from harvested_collection where harvest_type > ? and harvest_status = ? -// order by last_harvested asc limit 1"; - Criteria criteria = getByStatusAndMinimalTypeCriteria(context, status, type, limit); - criteria.addOrder(Order.asc("lastHarvested")); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } @Override public List findByStatus(Context context, int status) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - criteria.add(Restrictions.eq("harvestStatus", status)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + criteriaQuery + .where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); + return list(context, criteriaQuery, false, HarvestedCollection.class, -1, -1); } @Override public HarvestedCollection findByCollection(Context context, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - criteria.add(Restrictions.eq("collection", collection)); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + criteriaQuery + .where(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.collection), collection)); + return singleResult(context, criteriaQuery); } @Override public List - findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(Context context, Date startTime, - int minimalType, int[] statuses, - int expirationStatus, Date expirationTime) + findByLastHarvestedAndHarvestTypeAndHarvestStatusesAndHarvestTime(Context context, + Date startTime, + int minimalType, + int[] statuses, + int expirationStatus, + Date expirationTime) throws SQLException { -// Old query: "SELECT * FROM harvested_collection WHERE -// (last_harvested < ? or last_harvested is null) and harvest_type > ? and (harvest_status = ? or harvest_status = ? -// or (harvest_status=? and harvest_start_time < ?)) ORDER BY last_harvested", -// new java.sql.Timestamp(startTime.getTime()), 0, HarvestedCollection.STATUS_READY, -// HarvestedCollection.STATUS_OAI_ERROR, HarvestedCollection.STATUS_BUSY, new java.sql.Timestamp(expirationTime -// .getTime())); - Criteria criteria = createCriteria(context, HarvestedCollection.class); - LogicalExpression lastHarvestedRestriction = Restrictions.or( - Restrictions.lt("lastHarvested", startTime), - Restrictions.isNull("lastHarvested") - ); - Disjunction statusRestriction = Restrictions.or(); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + + Predicate wasNotHarvestedInCurrentRun = criteriaBuilder + .or(criteriaBuilder.lessThan(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested), startTime), + criteriaBuilder.isNull(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested)) + ); + + List hasCorrectStatusOrIsExpiredRestrictions = new LinkedList<>(); + for (int status : statuses) { - statusRestriction.add(Restrictions.eq("harvestStatus", status)); + hasCorrectStatusOrIsExpiredRestrictions + .add(criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status)); } - statusRestriction.add( - Restrictions.and( - Restrictions.eq("harvestStatus", expirationStatus), - Restrictions.gt("harvestStartTime", expirationTime) - ) + + Predicate harvestExpiredRestriction = criteriaBuilder.and( + criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), expirationStatus), + criteriaBuilder + .greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestStartTime), expirationTime) ); - criteria.add( - Restrictions.and( - lastHarvestedRestriction, - Restrictions.gt("harvestType", minimalType), - statusRestriction + hasCorrectStatusOrIsExpiredRestrictions.add(harvestExpiredRestriction); - ) + Predicate hasCorrectStatusOrIsExpiredPredicate = criteriaBuilder.or(hasCorrectStatusOrIsExpiredRestrictions + .toArray(new Predicate[] {})); + + Predicate hasMinimalType = criteriaBuilder.greaterThan( + harvestedCollectionRoot.get(HarvestedCollection_.harvestType), + minimalType); + + criteriaQuery.where(criteriaBuilder.and(wasNotHarvestedInCurrentRun, + hasMinimalType, + hasCorrectStatusOrIsExpiredPredicate + ) ); - criteria.addOrder(Order.asc("lastHarvested")); - return list(criteria); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(harvestedCollectionRoot.get(HarvestedCollection_.lastHarvested))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, HarvestedCollection.class, -1, -1); + } @Override public int count(Context context) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - return count(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + return count(context, criteriaQuery, criteriaBuilder, harvestedCollectionRoot); } - protected Criteria getByStatusAndMinimalTypeCriteria(Context context, int status, int type, int limit) + protected CriteriaQuery getByStatusAndMinimalTypeCriteria(Context context, int status, int type) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedCollection.class); - criteria.add( - Restrictions.and( - Restrictions.gt("harvestType", type), - Restrictions.eq("harvestStatus", status) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedCollection.class); + Root harvestedCollectionRoot = criteriaQuery.from(HarvestedCollection.class); + criteriaQuery.select(harvestedCollectionRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.greaterThan(harvestedCollectionRoot.get(HarvestedCollection_.harvestType), type), + criteriaBuilder.equal(harvestedCollectionRoot.get(HarvestedCollection_.harvestStatus), status) + ) ); - if (limit != -1) { - criteria.setMaxResults(1); - } - return criteria; + return criteriaQuery; } } diff --git a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java index 73ed113b70..9e9838be6c 100644 --- a/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/harvest/dao/impl/HarvestedItemDAOImpl.java @@ -8,15 +8,19 @@ package org.dspace.harvest.dao.impl; import java.sql.SQLException; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.content.Item; +import org.dspace.content.Item_; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.harvest.HarvestedItem; +import org.dspace.harvest.HarvestedItem_; import org.dspace.harvest.dao.HarvestedItemDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the HarvestedItem object. @@ -32,21 +36,28 @@ public class HarvestedItemDAOImpl extends AbstractHibernateDAO im @Override public HarvestedItem findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedItem.class); - criteria.add(Restrictions.eq("item", item)); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedItem.class); + Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); + criteriaQuery.select(harvestedItemRoot); + criteriaQuery.where(criteriaBuilder.equal(harvestedItemRoot.get(HarvestedItem_.item), item)); + return singleResult(context, criteriaQuery); } @Override public HarvestedItem findByOAIId(Context context, String itemOaiID, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, HarvestedItem.class); - criteria.createAlias("item", "i"); - criteria.add( - Restrictions.and( - Restrictions.eq("oaiId", itemOaiID), - Restrictions.eq("i.owningCollection", collection) - ) + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, HarvestedItem.class); + Root harvestedItemRoot = criteriaQuery.from(HarvestedItem.class); + Join join = harvestedItemRoot.join("item"); + criteriaQuery.select(harvestedItemRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(harvestedItemRoot.get(HarvestedItem_.oaiId), itemOaiID), + criteriaBuilder.equal(join.get(Item_.owningCollection), collection) + ) ); - return singleResult(criteria); + return singleResult(context, criteriaQuery); + } } diff --git a/dspace-api/src/main/java/org/dspace/health/Check.java b/dspace-api/src/main/java/org/dspace/health/Check.java index c18e09e817..40f29c15f7 100644 --- a/dspace-api/src/main/java/org/dspace/health/Check.java +++ b/dspace-api/src/main/java/org/dspace/health/Check.java @@ -7,7 +7,7 @@ */ package org.dspace.health; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Abstract check interface. @@ -17,7 +17,7 @@ import org.apache.log4j.Logger; public abstract class Check { - protected static Logger log = Logger.getLogger(Check.class); + protected static Logger log = org.apache.logging.log4j.LogManager.getLogger(Check.class); long took_ = -1L; String report_ = null; private String errors_ = ""; diff --git a/dspace-api/src/main/java/org/dspace/health/Report.java b/dspace-api/src/main/java/org/dspace/health/Report.java index 9285898220..651d3ac1d7 100644 --- a/dspace-api/src/main/java/org/dspace/health/Report.java +++ b/dspace-api/src/main/java/org/dspace/health/Report.java @@ -20,8 +20,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.exception.ExceptionUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; import org.dspace.core.Email; import org.dspace.core.factory.CoreServiceFactory; @@ -33,7 +33,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class Report { - private static Logger log = Logger.getLogger(Report.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Report.class); public static final String EMAIL_PATH = "config/emails/healthcheck"; // store the individual check reports private StringBuilder summary_; diff --git a/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java index 31d9efa36e..46bc317d13 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/DOIIdentifierProvider.java @@ -13,7 +13,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.ObjectUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; diff --git a/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java index a91e6d06cd..2ae6ff63cb 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/HandleIdentifierProvider.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -38,7 +38,7 @@ public class HandleIdentifierProvider extends IdentifierProvider { /** * log4j category */ - private static Logger log = Logger.getLogger(HandleIdentifierProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleIdentifierProvider.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java b/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java index 4cfd365fc2..17ab949cfe 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/IdentifierServiceImpl.java @@ -11,8 +11,8 @@ import java.sql.SQLException; import java.util.ArrayList; 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.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; @@ -36,7 +36,7 @@ public class IdentifierServiceImpl implements IdentifierService { /** * log4j category */ - private static Logger log = Logger.getLogger(IdentifierServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(IdentifierServiceImpl.class); @Autowired(required = true) protected ContentServiceFactory contentServiceFactory; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java index 777fa4811f..a2045acf26 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedDOIIdentifierProvider.java @@ -11,8 +11,8 @@ import java.sql.SQLException; import java.util.ArrayList; 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.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -36,7 +36,7 @@ public class VersionedDOIIdentifierProvider extends DOIIdentifierProvider { /** * log4j category */ - private static Logger log = Logger.getLogger(VersionedDOIIdentifierProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionedDOIIdentifierProvider.class); protected DOIConnector connector; diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java index da7f1d7882..f507348279 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProvider.java @@ -15,7 +15,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -46,7 +46,7 @@ public class VersionedHandleIdentifierProvider extends IdentifierProvider { /** * log4j category */ - private static Logger log = Logger.getLogger(VersionedHandleIdentifierProvider.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionedHandleIdentifierProvider.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java index 72cbf7d4e7..797358262e 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java +++ b/dspace-api/src/main/java/org/dspace/identifier/VersionedHandleIdentifierProviderWithCanonicalHandles.java @@ -12,8 +12,8 @@ import java.sql.SQLException; import java.util.Date; 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.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -43,7 +43,8 @@ public class VersionedHandleIdentifierProviderWithCanonicalHandles extends Ident /** * log4j category */ - private static Logger log = Logger.getLogger(VersionedHandleIdentifierProviderWithCanonicalHandles.class); + private static Logger log = + org.apache.logging.log4j.LogManager.getLogger(VersionedHandleIdentifierProviderWithCanonicalHandles.class); /** * Prefix registered to no one diff --git a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java index f62cf0e99e..019e89c129 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/identifier/dao/impl/DOIDAOImpl.java @@ -8,17 +8,19 @@ package org.dspace.identifier.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import org.dspace.content.DSpaceObject; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.identifier.DOI; +import org.dspace.identifier.DOI_; import org.dspace.identifier.dao.DOIDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Conjunction; -import org.hibernate.criterion.Disjunction; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the DOI object. @@ -34,74 +36,88 @@ public class DOIDAOImpl extends AbstractHibernateDAO implements DOIDAO { @Override public DOI findByDoi(Context context, String doi) throws SQLException { - Criteria criteria = createCriteria(context, DOI.class); - criteria.add(Restrictions.eq("doi", doi)); - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + criteriaQuery.where(criteriaBuilder.equal(doiRoot.get(DOI_.doi), doi)); + return uniqueResult(context, criteriaQuery, false, DOI.class, -1, -1); } @Override public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso, List statusToExclude) throws SQLException { - //SELECT * FROM Doi WHERE resource_type_id = ? AND resource_id = ? AND resource_id = ? AND ((status != ? AND - // status != ?) OR status IS NULL) - Criteria criteria = createCriteria(context, DOI.class); - Disjunction statusQuery = Restrictions.or(); - Conjunction statusConjunctionAnd = Restrictions.and(); - for (Integer status : statusToExclude) { - statusConjunctionAnd.add(Restrictions.not(Restrictions.eq("status", status))); - } - statusQuery.add(statusConjunctionAnd); - statusQuery.add(Restrictions.isNull("status")); - criteria.add( - Restrictions.and( - Restrictions.eq("dSpaceObject", dso), - statusQuery + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); - ) + List listToIncludeInOrPredicate = new LinkedList<>(); + + for (Integer status : statusToExclude) { + listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); + } + listToIncludeInOrPredicate.add(criteriaBuilder.isNull(doiRoot.get(DOI_.status))); + + Predicate orPredicate = criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[] {})); + + criteriaQuery.where(criteriaBuilder.and(orPredicate, + criteriaBuilder.equal(doiRoot.get(DOI_.dSpaceObject), dso) + ) ); - return singleResult(criteria); + + return singleResult(context, criteriaQuery); } @Override public List findByStatus(Context context, List statuses) throws SQLException { - Criteria criteria = createCriteria(context, DOI.class); - Disjunction statusQuery = Restrictions.or(); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + List orPredicates = new LinkedList<>(); for (Integer status : statuses) { - statusQuery.add(Restrictions.eq("status", status)); + orPredicates.add(criteriaBuilder.equal(doiRoot.get(DOI_.status), status)); } - criteria.add(statusQuery); - return list(criteria); + criteriaQuery.where(criteriaBuilder.or(orPredicates.toArray(new Predicate[] {}))); + return list(context, criteriaQuery, false, DOI.class, -1, -1); } @Override public List findSimilarNotInState(Context context, String doi, List excludedStatuses, boolean dsoNotNull) throws SQLException { - // SELECT * FROM Doi WHERE doi LIKE ? AND resource_type_id = ? AND resource_id IS NOT NULL AND status != ? - // AND status != ? - Criteria criteria = createCriteria(context, DOI.class); - Conjunction conjunctionAnd = Restrictions.and(); - Disjunction statusQuery = Restrictions.or(); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + + List listToIncludeInOrPredicate = new LinkedList<>(); + for (Integer status : excludedStatuses) { - statusQuery.add(Restrictions.ne("status", status)); + listToIncludeInOrPredicate.add(criteriaBuilder.notEqual(doiRoot.get(DOI_.status), status)); } - conjunctionAnd.add(Restrictions.like("doi", doi)); - conjunctionAnd.add(statusQuery); + + List listToIncludeInAndPredicate = new LinkedList<>(); + + listToIncludeInAndPredicate.add(criteriaBuilder.like(doiRoot.get(DOI_.doi), doi)); + listToIncludeInAndPredicate.add(criteriaBuilder.or(listToIncludeInOrPredicate.toArray(new Predicate[] {}))); if (dsoNotNull) { - conjunctionAnd.add(Restrictions.isNotNull("dSpaceObject")); + listToIncludeInAndPredicate.add(criteriaBuilder.isNotNull(doiRoot.get(DOI_.dSpaceObject))); } - criteria.add(conjunctionAnd); - return list(criteria); + criteriaQuery.where(listToIncludeInAndPredicate.toArray(new Predicate[] {})); + return list(context, criteriaQuery, false, DOI.class, -1, -1); + + } @Override public DOI findDOIByDSpaceObject(Context context, DSpaceObject dso) throws SQLException { - Criteria criteria = createCriteria(context, DOI.class); - criteria.add( - Restrictions.and( - Restrictions.eq("dSpaceObject", dso) - ) - ); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, DOI.class); + Root doiRoot = criteriaQuery.from(DOI.class); + criteriaQuery.select(doiRoot); + criteriaQuery.where(criteriaBuilder.equal(doiRoot.get(DOI_.dSpaceObject), dso)); + return singleResult(context, criteriaQuery); } } diff --git a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java index 8ad93e6e56..654d275d87 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java +++ b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIConsumer.java @@ -7,7 +7,7 @@ */ package org.dspace.identifier.doi; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.factory.ContentServiceFactory; @@ -28,7 +28,7 @@ public class DOIConsumer implements Consumer { /** * log4j logger */ - private static Logger log = Logger.getLogger(DOIConsumer.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DOIConsumer.class); @Override public void initialize() throws Exception { diff --git a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java index ed59eb3cdf..37fb18a5e4 100644 --- a/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java +++ b/dspace-api/src/main/java/org/dspace/identifier/doi/DOIOrganiser.java @@ -26,7 +26,7 @@ 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.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.ItemService; @@ -51,7 +51,7 @@ import org.dspace.utils.DSpace; */ public class DOIOrganiser { - private static final Logger LOG = Logger.getLogger(DOIOrganiser.class); + private static final Logger LOG = org.apache.logging.log4j.LogManager.getLogger(DOIOrganiser.class); private DOIIdentifierProvider provider; private Context context; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java index 1813d28659..3ce45d6048 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/AbstractMetadataFieldMapping.java @@ -12,7 +12,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.importer.external.metadatamapping.contributor.MetadataContributor; import org.dspace.importer.external.metadatamapping.transform.MetadataProcessorService; @@ -30,7 +30,7 @@ public abstract class AbstractMetadataFieldMapping /** * log4j logger */ - private static Logger log = Logger.getLogger(AbstractMetadataFieldMapping.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractMetadataFieldMapping.class); /* A map containing what processing has to be done on a given metadataFieldConfig. * The processing of a value is used to determine the actual value that will be returned used. diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java index 948075d9dc..5b814510ee 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/transform/AuthorMetadataProcessorService.java @@ -7,7 +7,7 @@ */ package org.dspace.importer.external.metadatamapping.transform; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * Removes the last point from an author name. diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java index dea509f470..fe8af76831 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedDateMetadatumContributor.java @@ -15,7 +15,7 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DCDate; import org.dspace.importer.external.metadatamapping.MetadataFieldConfig; import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; @@ -30,7 +30,7 @@ import org.springframework.beans.factory.annotation.Required; * @author Philip Vissenaekens (philip at atmire dot com) */ public class PubmedDateMetadatumContributor implements MetadataContributor { - Logger log = Logger.getLogger(PubmedDateMetadatumContributor.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedDateMetadatumContributor.class); private MetadataFieldMapping> metadataFieldMapping; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java index 82da062036..18a706a4ed 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/metadatamapping/contributor/PubmedLanguageMetadatumContributor.java @@ -14,7 +14,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.importer.external.metadatamapping.MetadataFieldConfig; import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; import org.dspace.importer.external.metadatamapping.MetadatumDTO; @@ -27,7 +27,7 @@ import org.dspace.importer.external.metadatamapping.contributor.MetadataContribu * @author Philip Vissenaekens (philip at atmire dot com) */ public class PubmedLanguageMetadatumContributor implements MetadataContributor { - Logger log = Logger.getLogger(PubmedDateMetadatumContributor.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedDateMetadatumContributor.class); private MetadataFieldMapping> metadataFieldMapping; private HashMap iso3toIso2; diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java b/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java index 74f6b26a77..87c2bd0029 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/ImportService.java @@ -15,7 +15,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.importer.external.datamodel.ImportRecord; import org.dspace.importer.external.datamodel.Query; @@ -36,7 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; public class ImportService implements Destroyable { private HashMap importSources = new HashMap<>(); - Logger log = Logger.getLogger(ImportService.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(ImportService.class); /** * Constructs an empty ImportService class object diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java index a0340236c5..38632a1a2b 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractRemoteMetadataSource.java @@ -16,7 +16,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.locks.ReentrantLock; import javax.annotation.Resource; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.importer.external.exception.MetadataSourceException; import org.dspace.importer.external.exception.SourceExceptionHandler; @@ -136,7 +136,7 @@ public abstract class AbstractRemoteMetadataSource { /** * log4j logger */ - private static Logger log = Logger.getLogger(AbstractRemoteMetadataSource.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractRemoteMetadataSource.class); /** * Command pattern implementation. the callable.call method will be retried diff --git a/dspace-api/src/main/java/org/dspace/license/CCLookup.java b/dspace-api/src/main/java/org/dspace/license/CCLookup.java index 6ddd31a77d..c86aa78301 100644 --- a/dspace-api/src/main/java/org/dspace/license/CCLookup.java +++ b/dspace-api/src/main/java/org/dspace/license/CCLookup.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.license.factory.LicenseServiceFactory; import org.dspace.license.service.CreativeCommonsService; import org.dspace.services.ConfigurationService; @@ -45,7 +45,7 @@ public class CCLookup { /** * log4j logger */ - private static Logger log = Logger.getLogger(CCLookup.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CCLookup.class); private String cc_root; private String jurisdiction; diff --git a/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java b/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java index c88c7d8b4b..384b82ddc3 100644 --- a/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/license/CreativeCommonsServiceImpl.java @@ -21,8 +21,8 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; -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.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -46,7 +46,7 @@ public class CreativeCommonsServiceImpl implements CreativeCommonsService, Initi /** * log4j category */ - private static Logger log = Logger.getLogger(CreativeCommonsServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CreativeCommonsServiceImpl.class); /** * The Bundle Name diff --git a/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java b/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java index 30d7147079..55eeb8d314 100644 --- a/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java +++ b/dspace-api/src/main/java/org/dspace/license/LicenseCleanup.java @@ -26,7 +26,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -44,7 +44,7 @@ import org.dspace.core.Context; */ public class LicenseCleanup { - private static final Logger log = Logger.getLogger(LicenseCleanup.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseCleanup.class); protected static final Templates templates; diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java b/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java index f127d7ff48..76ae0cd2d2 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFConsumer.java @@ -17,7 +17,7 @@ import java.util.NoSuchElementException; import java.util.UUID; import com.hp.hpl.jena.rdf.model.Model; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -40,7 +40,7 @@ import org.dspace.workflow.factory.WorkflowServiceFactory; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class RDFConsumer implements Consumer { - private static final Logger log = Logger.getLogger(RDFConsumer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFConsumer.class); protected Deque toConvert; protected Deque toDelete; diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java b/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java index 1280f18cd9..03ae589c62 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFUtil.java @@ -13,8 +13,8 @@ import java.util.List; import java.util.UUID; 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.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; @@ -31,7 +31,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class RDFUtil { - private static final Logger log = Logger.getLogger(RDFUtil.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFUtil.class); private static final AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance() .getAuthorizeService(); diff --git a/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java b/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java index a6f8804756..834ec15d4a 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java +++ b/dspace-api/src/main/java/org/dspace/rdf/RDFizer.java @@ -26,7 +26,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -54,7 +54,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; */ public class RDFizer { - private static final Logger log = Logger.getLogger(RDFizer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFizer.class); protected boolean stdout; protected boolean verbose; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java index 5dcd8c2e4a..36501b89c4 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataConverterPlugin.java @@ -25,8 +25,8 @@ import com.hp.hpl.jena.reasoner.ValidityReport; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; import com.hp.hpl.jena.vocabulary.RDF; -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.util.factory.UtilServiceFactory; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; @@ -50,7 +50,7 @@ public class MetadataConverterPlugin implements ConverterPlugin { public final static String METADATA_SCHEMA_URL_KEY = "rdf.metadata.schema"; public final static String METADATA_PREFIXES_KEY = "rdf.metadata.prefixes"; - private final static Logger log = Logger.getLogger(MetadataConverterPlugin.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataConverterPlugin.class); @Autowired(required = true) protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java index 9fdf139197..6286f3b87a 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/MetadataRDFMapping.java @@ -22,15 +22,15 @@ import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.Logger; /** * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class MetadataRDFMapping { - private static final Logger log = Logger.getLogger(MetadataRDFMapping.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataRDFMapping.class); protected final String name; protected final Pattern fulfills; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java index 382915cacc..93a9b6211d 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/RDFConverterImpl.java @@ -13,7 +13,7 @@ import java.util.List; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class RDFConverterImpl implements RDFConverter { - private static final Logger log = Logger.getLogger(RDFConverterImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFConverterImpl.class); protected ConfigurationService configurationService; protected List plugins; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java index 96927fc3b2..e5475e5eb4 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/SimpleDSORelationsConverterPlugin.java @@ -18,8 +18,8 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; -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.util.Util; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; @@ -57,7 +57,8 @@ public class SimpleDSORelationsConverterPlugin public static final String SIMPLE_RELATIONS_ITEM2BITSTREAM_KEY = "rdf.simplerelations.item2bitstream"; - private static final Logger log = Logger.getLogger(SimpleDSORelationsConverterPlugin.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(SimpleDSORelationsConverterPlugin.class); @Autowired(required = true) protected BitstreamService bitstreamService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java b/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java index cf52167325..f86af753e6 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java +++ b/dspace-api/src/main/java/org/dspace/rdf/conversion/StaticDSOConverterPlugin.java @@ -16,7 +16,7 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.util.FileManager; import com.hp.hpl.jena.util.FileUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; @@ -30,7 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class StaticDSOConverterPlugin implements ConverterPlugin { - private static final Logger log = Logger.getLogger(StaticDSOConverterPlugin.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StaticDSOConverterPlugin.class); public static final String CONSTANT_DATA_FILENAME_KEY_PREFIX = "rdf.constant.data."; public static final String CONSTANT_DATA_GENERAL_KEY_SUFFIX = "GENERAL"; diff --git a/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java b/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java index 2f6b66bda6..2abcd41a1b 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/factory/RDFFactoryImpl.java @@ -8,7 +8,7 @@ package org.dspace.rdf.factory; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.conversion.RDFConverter; import org.dspace.rdf.storage.RDFStorage; import org.dspace.rdf.storage.URIGenerator; @@ -23,7 +23,7 @@ public class RDFFactoryImpl extends RDFFactory { // by type here. So we use setters and properties in Spring configuration // instead. - private static final Logger log = Logger.getLogger(RDFFactoryImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFFactoryImpl.class); private RDFStorage storage; private URIGenerator generator; diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java index f0cd45b8fa..6b2caa598d 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/MediaRange.java @@ -13,8 +13,8 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.Logger; /** * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) @@ -62,7 +62,7 @@ public class MediaRange { public static final String mediaRangeRegex = "(?:(" + token + ")/(" + token + "?)" + "(" + nonQualityParam + "*)" + qualityParam + "?(" + nonQualityParam + "*))"; - private final static Logger log = Logger.getLogger(MediaRange.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(MediaRange.class); protected final String type; protected final String subtype; diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java index ed8840bb7a..998f57ca4f 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/NegotiationFilter.java @@ -19,7 +19,7 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.RDFUtil; import org.dspace.services.factory.DSpaceServicesFactory; @@ -29,7 +29,7 @@ import org.dspace.services.factory.DSpaceServicesFactory; public class NegotiationFilter implements Filter { public static final String ACCEPT_HEADER_NAME = "Accept"; - private static final Logger log = Logger.getLogger(NegotiationFilter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(NegotiationFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { diff --git a/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java b/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java index fe7a0029a4..dbf703e8de 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/negotiation/Negotiator.java @@ -14,8 +14,8 @@ import java.util.Comparator; import java.util.Iterator; 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.rdf.RDFUtil; import org.dspace.services.factory.DSpaceServicesFactory; @@ -34,7 +34,7 @@ public class Negotiator { public static final String DEFAULT_LANG = "html"; - private static final Logger log = Logger.getLogger(Negotiator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Negotiator.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java index 935a4ed610..54071ab8a2 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/DOIURIGenerator.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Constants; @@ -26,7 +26,7 @@ import org.springframework.beans.factory.annotation.Required; * @author pbecker */ public class DOIURIGenerator implements URIGenerator { - private static final Logger log = Logger.getLogger(DOIURIGenerator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DOIURIGenerator.class); protected static URIGenerator fallback; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java index 7ed4c9f552..3353fa35ef 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/HandleURIGenerator.java @@ -12,8 +12,8 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -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.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; @@ -26,7 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class HandleURIGenerator implements URIGenerator { - private static final Logger log = Logger.getLogger(HandleURIGenerator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleURIGenerator.class); @Autowired(required = true) protected SiteService siteService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java b/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java index 2aa9209ac1..b173010bd4 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/LocalURIGenerator.java @@ -12,8 +12,8 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -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.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; @@ -27,7 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; * @author Pascal-Nicolas Becker (dspace -at- pascal -hyphen- becker -dot- de) */ public class LocalURIGenerator implements URIGenerator { - private static final Logger log = Logger.getLogger(LocalURIGenerator.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LocalURIGenerator.class); @Autowired(required = true) protected SiteService siteService; diff --git a/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java b/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java index 5656f409d7..fd84db5d5f 100644 --- a/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java +++ b/dspace-api/src/main/java/org/dspace/rdf/storage/RDFStorageImpl.java @@ -25,12 +25,12 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.sparql.core.DatasetGraph; import com.hp.hpl.jena.update.GraphStore; import com.hp.hpl.jena.update.GraphStoreFactory; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.jena.atlas.web.auth.HttpAuthenticator; import org.apache.jena.atlas.web.auth.SimpleAuthenticator; import org.apache.jena.web.DatasetGraphAccessor; import org.apache.jena.web.DatasetGraphAccessorHTTP; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.rdf.RDFUtil; import org.dspace.services.ConfigurationService; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class RDFStorageImpl implements RDFStorage { - private static final Logger log = Logger.getLogger(RDFStorageImpl.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(RDFStorageImpl.class); @Autowired(required = true) protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/search/Harvest.java b/dspace-api/src/main/java/org/dspace/search/Harvest.java index 083a32d89d..677a760452 100644 --- a/dspace-api/src/main/java/org/dspace/search/Harvest.java +++ b/dspace-api/src/main/java/org/dspace/search/Harvest.java @@ -14,7 +14,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -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; @@ -46,7 +46,7 @@ public class Harvest { /** * log4j logger */ - private static final Logger log = Logger.getLogger(Harvest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Harvest.class); protected static final AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance() .getAuthorizeService(); diff --git a/dspace-api/src/main/java/org/dspace/service/ClientInfoService.java b/dspace-api/src/main/java/org/dspace/service/ClientInfoService.java new file mode 100644 index 0000000000..68fb5b7f43 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/service/ClientInfoService.java @@ -0,0 +1,37 @@ +/** + * 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.service; + +import javax.servlet.http.HttpServletRequest; + +/** + * Service that can be used to retrieve information about DSpace clients + */ +public interface ClientInfoService { + + /** + * Get the client IP of this request taking into account the X-Forwarded-For header and the "useProxies" setting + * @param request The client HTTP request + * @return The IP address of the originating client + */ + String getClientIp(HttpServletRequest request); + + /** + * Get the client IP of this request taking into account the X-Forwarded-For header and the "useProxies" setting + * @param remoteIp the remote address of the current request + * @param xForwardedForHeaderValue The value of the X-Forwarded-For header + * @return The IP address of the originating client + */ + String getClientIp(String remoteIp, String xForwardedForHeaderValue); + + /** + * Does DSpace take into account HTTP proxy headers or not + * @return true if this is the case, false otherwise + */ + boolean isUseProxiesEnabled(); +} diff --git a/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java b/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java new file mode 100644 index 0000000000..76874908d7 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/service/impl/ClientInfoServiceImpl.java @@ -0,0 +1,131 @@ +/** + * 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.service.impl; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.dspace.service.ClientInfoService; +import org.dspace.services.ConfigurationService; +import org.dspace.statistics.util.IPTable; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Implementation of {@link ClientInfoService} that can provide information on DSpace client requests + * + * @author tom dot desair at gmail dot com + */ +public class ClientInfoServiceImpl implements ClientInfoService { + + private static final String X_FORWARDED_FOR_HEADER = "X-Forwarded-For"; + + private static final Logger log = LoggerFactory.getLogger(ClientInfoServiceImpl.class); + + private Boolean useProxiesEnabled; + + private ConfigurationService configurationService; + + /** + * Sparse HashTable structure to hold IP address ranges of trusted proxies + */ + private IPTable trustedProxies; + + @Autowired(required = true) + public ClientInfoServiceImpl(ConfigurationService configurationService) { + this.configurationService = configurationService; + this.trustedProxies = parseTrustedProxyRanges( + configurationService.getArrayProperty("proxies.trusted.ipranges")); + } + + @Override + public String getClientIp(HttpServletRequest request) { + return getClientIp(request.getRemoteAddr(), request.getHeader(X_FORWARDED_FOR_HEADER)); + } + + @Override + public String getClientIp(String remoteIp, String xForwardedForHeaderValue) { + String ip = remoteIp; + + if (isUseProxiesEnabled()) { + String xForwardedForIp = getXForwardedForIpValue(remoteIp, xForwardedForHeaderValue); + + if (StringUtils.isNotBlank(xForwardedForIp) && isRequestFromTrustedProxy(ip)) { + ip = xForwardedForIp; + } + + } else if (StringUtils.isNotBlank(xForwardedForHeaderValue)) { + log.warn( + "X-Forwarded-For header detected but useProxiesEnabled is not enabled. " + + "If your dspace is behind a proxy set it to true"); + } + + return ip; + } + + @Override + public boolean isUseProxiesEnabled() { + if (useProxiesEnabled == null) { + useProxiesEnabled = configurationService.getBooleanProperty("useProxies", true); + log.info("useProxies=" + useProxiesEnabled); + } + + return useProxiesEnabled; + } + + private IPTable parseTrustedProxyRanges(String[] proxyProperty) { + if (ArrayUtils.isEmpty(proxyProperty)) { + return null; + } else { + //Load all supplied proxy IP ranges into the IP table + IPTable ipTable = new IPTable(); + try { + for (String proxyRange : proxyProperty) { + ipTable.add(proxyRange); + } + } catch (IPTable.IPFormatException e) { + log.error("Property proxies.trusted.ipranges contains an invalid IP range", e); + ipTable = null; + } + + return ipTable; + } + } + + private boolean isRequestFromTrustedProxy(String ipAddress) { + try { + return trustedProxies == null || trustedProxies.contains(ipAddress); + } catch (IPTable.IPFormatException e) { + log.error("Request contains invalid remote address", e); + return false; + } + } + + private String getXForwardedForIpValue(String remoteIp, String xForwardedForValue) { + String ip = null; + + /* This header is a comma delimited list */ + String headerValue = StringUtils.trimToEmpty(xForwardedForValue); + for (String xfip : headerValue.split(",")) { + /* proxy itself will sometime populate this header with the same value in + remote address. ordering in spec is vague, we'll just take the last + not equal to the proxy + */ + if (!StringUtils.equals(remoteIp, xfip) && StringUtils.isNotBlank(xfip) + //if we have trusted proxies, we'll assume that they are not the client IP + && (trustedProxies == null || !isRequestFromTrustedProxy(xfip))) { + + ip = xfip.trim(); + } + } + + return ip; + } +} diff --git a/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java b/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java index ec98ee874a..e1a14cc18c 100644 --- a/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java +++ b/dspace-api/src/main/java/org/dspace/sort/AbstractTextFilterOFD.java @@ -7,7 +7,7 @@ */ package org.dspace.sort; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.text.filter.TextFilter; /** @@ -40,7 +40,7 @@ import org.dspace.text.filter.TextFilter; * @author Graham Triggs */ public abstract class AbstractTextFilterOFD implements OrderFormatDelegate { - private static final Logger log = Logger.getLogger(AbstractTextFilterOFD.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractTextFilterOFD.class); // Initialised in subclass in an object initializer protected TextFilter[] filters; diff --git a/dspace-api/src/main/java/org/dspace/sort/SortOption.java b/dspace-api/src/main/java/org/dspace/sort/SortOption.java index 5c1cdfa95d..19634164ce 100644 --- a/dspace-api/src/main/java/org/dspace/sort/SortOption.java +++ b/dspace-api/src/main/java/org/dspace/sort/SortOption.java @@ -15,9 +15,9 @@ import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.ConfigurationManager; /** @@ -26,7 +26,7 @@ import org.dspace.core.ConfigurationManager; * @author Richard Jones */ public class SortOption { - private static final Logger log = Logger.getLogger(SortOption.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SortOption.class); public static final String ASCENDING = "ASC"; public static final String DESCENDING = "DESC"; diff --git a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java index 1993dc5847..9204c56a21 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/Dataset.java +++ b/dspace-api/src/main/java/org/dspace/statistics/Dataset.java @@ -18,8 +18,8 @@ import java.util.List; import java.util.Map; import au.com.bytecode.opencsv.CSVWriter; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; /** * @author kevinvandevelde at atmire.com @@ -54,8 +54,8 @@ public class Dataset { initRowLabels(rows); } - public Dataset(float[][] matrix) { - this.matrix = (String[][]) ArrayUtils.clone(matrix); + public Dataset(String[][] matrix) { + this.matrix = ArrayUtils.clone(matrix); nbRows = matrix.length; if (0 < matrix.length && 0 < matrix[0].length) { nbCols = matrix[0].length; diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java index e6c09ea32b..fd26725a71 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerServiceImpl.java @@ -39,9 +39,9 @@ import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.model.CityResponse; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; @@ -82,14 +82,13 @@ import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.dspace.statistics.service.SolrLoggerService; import org.dspace.statistics.util.DnsLookup; import org.dspace.statistics.util.LocationUtils; import org.dspace.statistics.util.SpiderDetector; import org.dspace.usage.UsageWorkflowEvent; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -103,8 +102,9 @@ import org.springframework.beans.factory.annotation.Autowired; * @author mdiggory at atmire.com */ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBean { - private static final Logger log - = LoggerFactory.getLogger(SolrLoggerServiceImpl.class); + + private static final org.apache.logging.log4j.Logger log = + org.apache.logging.log4j.LogManager.getLogger(SolrLoggerServiceImpl.class); private static final String MULTIPLE_VALUES_SPLITTER = "|"; protected SolrServer solr; @@ -115,8 +115,6 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea protected DatabaseReader locationService; - protected boolean useProxies; - private static List statisticYearCores = new ArrayList(); private static boolean statisticYearCoresInit = false; @@ -126,6 +124,8 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea protected ContentServiceFactory contentServiceFactory; @Autowired(required = true) private ConfigurationService configurationService; + @Autowired(required = true) + private ClientInfoService clientInfoService; public static enum StatisticsType { VIEW("view"), @@ -151,7 +151,6 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea @Override public void afterPropertiesSet() throws Exception { - log.info("solr-statistics.spidersfile:" + configurationService.getProperty("solr-statistics.spidersfile")); log.info("solr-statistics.server:" + configurationService.getProperty("solr-statistics.server")); log.info("usage-statistics.dbfile:" + configurationService.getProperty("usage-statistics.dbfile")); @@ -192,9 +191,6 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea log.error("The required 'dbfile' configuration is missing in solr-statistics.cfg!"); } locationService = service; - - useProxies = configurationService.getBooleanProperty("useProxies"); - log.info("useProxies=" + useProxies); } @Override @@ -296,26 +292,7 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea // Save our basic info that we already have if (request != null) { - String ip = request.getRemoteAddr(); - - if (isUseProxies() && request.getHeader("X-Forwarded-For") != null) { - /* This header is a comma delimited list */ - for (String xfip : request.getHeader("X-Forwarded-For").split(",")) { - /* proxy itself will sometime populate this header with the same value in - remote address. ordering in spec is vague, we'll just take the last - not equal to the proxy - */ - if (!request.getHeader("X-Forwarded-For").contains(ip)) { - ip = xfip.trim(); - } - } - } - if (!isUseProxies() && request.getHeader("X-Forwarded-For") != null) { - log.warn( - "X-Forwarded-For header detected but useProxies is not enabled. If your dspace is behind a proxy " + - "set it to true"); - } - + String ip = clientInfoService.getClientIp(request); doc1.addField("ip", ip); //Also store the referrer @@ -391,65 +368,48 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea SolrInputDocument doc1 = new SolrInputDocument(); // Save our basic info that we already have - if (!isUseProxies() && xforwardedfor != null) { - log.warn( - "X-Forwarded-For header detected but useProxies is not enabled. If your dspace is behind a proxy set " + - "it to true"); + ip = clientInfoService.getClientIp(ip, xforwardedfor); + doc1.addField("ip", ip); + + try { + String dns = DnsLookup.reverseDns(ip); + doc1.addField("dns", dns.toLowerCase()); + } catch (Exception e) { + log.info("Failed DNS Lookup for IP:" + ip); + log.debug(e.getMessage(), e); } - if (isUseProxies() && xforwardedfor != null) { - /* This header is a comma delimited list */ - for (String xfip : xforwardedfor.split(",")) { - /* proxy itself will sometime populate this header with the same value in - remote address. ordering in spec is vague, we'll just take the last - not equal to the proxy - */ - if (!xforwardedfor.contains(ip)) { - ip = xfip.trim(); - } - } - - doc1.addField("ip", ip); - + if (userAgent != null) { + doc1.addField("userAgent", userAgent); + } + doc1.addField("isBot", isSpiderBot); + // Save the location information if valid, save the event without + // location information if not valid + if (locationService != null) { try { - String dns = DnsLookup.reverseDns(ip); - doc1.addField("dns", dns.toLowerCase()); - } catch (Exception e) { - log.info("Failed DNS Lookup for IP:" + ip); - log.debug(e.getMessage(), e); - } - if (userAgent != null) { - doc1.addField("userAgent", userAgent); - } - doc1.addField("isBot", isSpiderBot); - // Save the location information if valid, save the event without - // location information if not valid - if (locationService != null) { - try { - InetAddress ipAddress = InetAddress.getByName(ip); - CityResponse location = locationService.city(ipAddress); - String countryCode = location.getCountry().getIsoCode(); - double latitude = location.getLocation().getLatitude(); - double longitude = location.getLocation().getLongitude(); - if (!( - "--".equals(countryCode) - && latitude == -180 - && longitude == -180) - ) { - try { - doc1.addField("continent", LocationUtils + InetAddress ipAddress = InetAddress.getByName(ip); + CityResponse location = locationService.city(ipAddress); + String countryCode = location.getCountry().getIsoCode(); + double latitude = location.getLocation().getLatitude(); + double longitude = location.getLocation().getLongitude(); + if (!( + "--".equals(countryCode) + && latitude == -180 + && longitude == -180) + ) { + try { + doc1.addField("continent", LocationUtils .getContinentCode(countryCode)); - } catch (Exception e) { - System.out + } catch (Exception e) { + System.out .println("COUNTRY ERROR: " + countryCode); - } - doc1.addField("countryCode", countryCode); - doc1.addField("city", location.getCity().getName()); - doc1.addField("latitude", latitude); - doc1.addField("longitude", longitude); } - } catch (GeoIp2Exception | IOException e) { - log.error("Unable to get location of request: {}", e.getMessage()); + doc1.addField("countryCode", countryCode); + doc1.addField("city", location.getCity().getName()); + doc1.addField("latitude", latitude); + doc1.addField("longitude", longitude); } + } catch (GeoIp2Exception | IOException e) { + log.error("Unable to get location of request: {}", e.getMessage()); } } @@ -604,7 +564,7 @@ public class SolrLoggerServiceImpl implements SolrLoggerService, InitializingBea @Override public boolean isUseProxies() { - return useProxies; + return clientInfoService.isUseProxiesEnabled(); } @Override diff --git a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java index deb0a92d5b..bce0a6f7b1 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java +++ b/dspace-api/src/main/java/org/dspace/statistics/SolrLoggerUsageEventListener.java @@ -7,7 +7,7 @@ */ package org.dspace.statistics; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.eperson.EPerson; import org.dspace.services.model.Event; import org.dspace.statistics.service.SolrLoggerService; @@ -26,7 +26,7 @@ import org.springframework.util.CollectionUtils; */ public class SolrLoggerUsageEventListener extends AbstractUsageEventListener { - private static Logger log = Logger.getLogger(SolrLoggerUsageEventListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrLoggerUsageEventListener.class); protected SolrLoggerService solrLoggerService; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java index a7c20688be..5a3d92e8f9 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataSearches.java @@ -14,8 +14,8 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.content.DSpaceObject; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java index cdd0cbbb73..5b003b3741 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataVisits.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.util.ClientUtils; import org.dspace.app.util.Util; diff --git a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java index 3d2719faa7..a4d340b1e9 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java +++ b/dspace-api/src/main/java/org/dspace/statistics/content/StatisticsDataWorkflow.java @@ -17,10 +17,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.PropertiesConfiguration; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; +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.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; @@ -44,7 +46,7 @@ import org.dspace.statistics.content.filter.StatisticsFilter; */ public class StatisticsDataWorkflow extends StatisticsData { - private static final Logger log = Logger.getLogger(StatisticsDataWorkflow.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StatisticsDataWorkflow.class); /** * Current DSpaceObject for which to generate the statistics. @@ -188,15 +190,16 @@ public class StatisticsDataWorkflow extends StatisticsData { Date oldestDate = (Date) solrDocument.getFieldValue("time"); //Store the date, we only need to retrieve this once ! try { - //Also store it in the solr-statics configuration file, the reason for this being that the sort - // query - //can be very time consuming & we do not want this delay each time we want to see workflow + // Also store it in the solr-statics configuration file, the reason for this being that the sort + // query can be very time consuming & we do not want this delay each time we want to see workflow // statistics String solrConfigDir = configurationService.getProperty("dspace.dir") + File.separator + "config" + File.separator + "modules" + File.separator + "usage-statistics.cfg"; - PropertiesConfiguration config = new PropertiesConfiguration(solrConfigDir); + FileBasedConfigurationBuilder builder = new Configurations() + .propertiesBuilder(solrConfigDir); + PropertiesConfiguration config = builder.getConfiguration(); config.setProperty("workflow-start-date", new DCDate(oldestDate)); - config.save(); + builder.save(); } catch (ConfigurationException e) { log.error("Error while storing workflow start date", e); } diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java b/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java index b26f747aca..3987f5df53 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/ClassicDSpaceLogConverter.java @@ -28,7 +28,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.statistics.LogAnalyser; import org.dspace.app.statistics.LogLine; import org.dspace.content.DSpaceObject; @@ -44,7 +44,7 @@ import org.dspace.handle.factory.HandleServiceFactory; * @see StatisticsImporter */ public class ClassicDSpaceLogConverter { - private final Logger log = Logger.getLogger(ClassicDSpaceLogConverter.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(ClassicDSpaceLogConverter.class); /** * A DSpace context diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java b/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java index 693454a2cb..0b08085f52 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/LocationUtils.java @@ -13,7 +13,7 @@ import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.I18nUtil; /** @@ -24,7 +24,7 @@ import org.dspace.core.I18nUtil; * @author ben at atmire.com */ public class LocationUtils { - private static final Logger logger = Logger.getLogger(LocationUtils.class); + private static final Logger logger = org.apache.logging.log4j.LogManager.getLogger(LocationUtils.class); private static final Properties countryToContinent = new Properties(); diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java b/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java index 7939db3a12..0b5149df74 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/SpiderDetectorServiceImpl.java @@ -19,8 +19,9 @@ import java.util.Set; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.configuration.ConversionException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.configuration2.ex.ConversionException; +import org.apache.commons.lang3.StringUtils; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,8 +41,6 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { private static final Logger log = LoggerFactory.getLogger(SpiderDetectorServiceImpl.class); - private Boolean useProxies; - private Boolean useCaseInsensitiveMatching; private final List agents @@ -51,6 +50,7 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { = Collections.synchronizedList(new ArrayList()); private ConfigurationService configurationService; + private ClientInfoService clientInfoService; /** * Sparse HashTable structure to hold IP address ranges. @@ -58,8 +58,9 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { private IPTable table = null; @Autowired(required = true) - public SpiderDetectorServiceImpl(ConfigurationService configurationService) { + public SpiderDetectorServiceImpl(ConfigurationService configurationService, ClientInfoService clientInfoService) { this.configurationService = configurationService; + this.clientInfoService = clientInfoService; } public IPTable getTable() { @@ -104,7 +105,7 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { } // No. See if any IP addresses match - if (isUseProxies() && proxyIPs != null) { + if (clientInfoService.isUseProxiesEnabled() && proxyIPs != null) { /* This header is a comma delimited list */ for (String xfip : proxyIPs.split(",")) { if (isSpider(xfip)) { @@ -306,12 +307,4 @@ public class SpiderDetectorServiceImpl implements SpiderDetectorService { return useCaseInsensitiveMatching; } - private boolean isUseProxies() { - if (useProxies == null) { - useProxies = configurationService.getBooleanProperty("useProxies"); - } - - return useProxies; - } - } diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java index 9662a3f7d9..61fd2619c2 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsClient.java @@ -15,7 +15,7 @@ import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.tools.ant.taskdefs.Get; import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.statistics.factory.StatisticsServiceFactory; @@ -27,7 +27,7 @@ import org.dspace.statistics.service.SolrLoggerService; * @author Stuart Lewis */ public class StatisticsClient { - private static final Logger log = Logger.getLogger(StatisticsClient.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StatisticsClient.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java index 8588b381ce..f236e1bc72 100644 --- a/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java +++ b/dspace-api/src/main/java/org/dspace/statistics/util/StatisticsImporter.java @@ -33,8 +33,8 @@ import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.commons.lang.time.DateFormatUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.logging.log4j.Logger; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.common.SolrInputDocument; @@ -64,7 +64,7 @@ import org.dspace.statistics.service.SolrLoggerService; * @see ClassicDSpaceLogConverter */ public class StatisticsImporter { - private static final Logger log = Logger.getLogger(StatisticsImporter.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(StatisticsImporter.class); /** * Date format (for solr) diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java index 9aab7c4346..1c5ed69757 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitStoreMigrate.java @@ -13,7 +13,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; import org.dspace.core.Context; @@ -28,7 +28,7 @@ public class BitStoreMigrate { /** * log4j log */ - private static Logger log = Logger.getLogger(BitStoreMigrate.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitStoreMigrate.class); private static final BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); private static final BitstreamStorageService bitstreamStorageService = diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java index 18e1f33388..c63b4ebe7e 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/BitstreamStorageServiceImpl.java @@ -17,7 +17,7 @@ import java.util.Map; import java.util.UUID; import org.apache.commons.collections4.MapUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.checker.service.ChecksumHistoryService; import org.dspace.content.Bitstream; @@ -62,7 +62,7 @@ public class BitstreamStorageServiceImpl implements BitstreamStorageService, Ini /** * log4j log */ - private static Logger log = Logger.getLogger(BitstreamStorageServiceImpl.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamStorageServiceImpl.class); @Autowired(required = true) protected BitstreamService bitstreamService; diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java index 97c2a512b7..5b8ff11c88 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/Cleanup.java @@ -13,7 +13,7 @@ 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.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.storage.bitstore.factory.StorageServiceFactory; /** @@ -26,7 +26,7 @@ public class Cleanup { /** * log4j log */ - private static Logger log = Logger.getLogger(Cleanup.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Cleanup.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java index 31901c7f34..36f75c67f9 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/DSBitStoreService.java @@ -17,7 +17,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.core.Utils; @@ -33,7 +33,7 @@ public class DSBitStoreService implements BitStoreService { /** * log4j log */ - private static Logger log = Logger.getLogger(DSBitStoreService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DSBitStoreService.class); // These settings control the way an identifier is hashed into // directory and file names diff --git a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java index 51072d2259..9d7ec14143 100644 --- a/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java +++ b/dspace-api/src/main/java/org/dspace/storage/bitstore/S3BitStoreService.java @@ -27,7 +27,7 @@ import com.amazonaws.services.s3.model.S3Object; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.core.ConfigurationManager; import org.dspace.core.Utils; @@ -45,7 +45,7 @@ public class S3BitStoreService implements BitStoreService { /** * log4j log */ - private static Logger log = Logger.getLogger(S3BitStoreService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(S3BitStoreService.class); /** * Checksum algorithm diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java index 13944f8de7..a8ca129e85 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/DatabaseUtils.java @@ -23,8 +23,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.sql.DataSource; -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.core.Context; import org.dspace.discovery.IndexingService; import org.dspace.discovery.SearchServiceException; @@ -54,7 +54,7 @@ public class DatabaseUtils { /** * log4j category */ - private static final Logger log = Logger.getLogger(DatabaseUtils.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DatabaseUtils.class); // Our Flyway DB object (initialized by setupFlyway()) private static Flyway flywaydb; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java index 1517b29a31..11018d37e0 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/GroupServiceInitializer.java @@ -9,7 +9,7 @@ package org.dspace.storage.rdbms; import java.sql.Connection; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.eperson.service.GroupService; import org.flywaydb.core.api.MigrationInfo; @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class GroupServiceInitializer implements FlywayCallback { - private final Logger log = Logger.getLogger(GroupServiceInitializer.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupServiceInitializer.class); @Autowired(required = true) protected GroupService groupService; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java index 410e922e0c..48f2e4e6f0 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/PostgreSQLCryptoChecker.java @@ -11,7 +11,7 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.flywaydb.core.api.FlywayException; import org.flywaydb.core.api.MigrationInfo; import org.flywaydb.core.api.callback.FlywayCallback; @@ -29,7 +29,7 @@ import org.flywaydb.core.api.callback.FlywayCallback; * @author Tim Donohue */ public class PostgreSQLCryptoChecker implements FlywayCallback { - private Logger log = Logger.getLogger(PostgreSQLCryptoChecker.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(PostgreSQLCryptoChecker.class); /** * Check for pgcrypto (if needed). Throws an exception if pgcrypto is diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java index 68f671c951..a4b7129546 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/SiteServiceInitializer.java @@ -9,7 +9,7 @@ package org.dspace.storage.rdbms; import java.sql.Connection; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.service.SiteService; import org.dspace.core.Context; import org.flywaydb.core.api.MigrationInfo; @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class SiteServiceInitializer implements FlywayCallback { - private Logger log = Logger.getLogger(SiteServiceInitializer.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(SiteServiceInitializer.class); @Autowired(required = true) protected SiteService siteService; diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java index 4c4dcb2896..ce481d0caf 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/MigrationUtils.java @@ -12,7 +12,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * This Utility class offers utility methods which may be of use to perform diff --git a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java index 366fc76b89..2b614b5356 100644 --- a/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java +++ b/dspace-api/src/main/java/org/dspace/storage/rdbms/migration/V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.java @@ -10,7 +10,7 @@ package org.dspace.storage.rdbms.migration; import java.sql.Connection; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.browse.BrowseException; import org.dspace.browse.BrowseIndex; import org.dspace.storage.rdbms.DatabaseUtils; @@ -27,7 +27,8 @@ public class V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables implements JdbcM /** * log4j category */ - private static final Logger log = Logger.getLogger(V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.class); + private static final Logger log = + org.apache.logging.log4j.LogManager.getLogger(V6_0_2016_01_26__DS_2188_Remove_DBMS_Browse_Tables.class); /* The checksum to report for this migration (when successful) */ private int checksum = -1; diff --git a/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java b/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java index ccaa6e05d1..0961a49d92 100644 --- a/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java +++ b/dspace-api/src/main/java/org/dspace/submit/extraction/MetadataExtractor.java @@ -13,7 +13,11 @@ import gr.ekt.bte.dataloader.FileDataLoader; import org.dspace.services.ConfigurationService; /** + * Configuration bean to associate a BTE FileDataLoader with a specific list of format identified by the file + * extensions. See config/spring/api/metadata-extractor.xml + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public class MetadataExtractor { diff --git a/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java b/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java index ddc8c04ae0..df3c78919e 100644 --- a/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java +++ b/dspace-api/src/main/java/org/dspace/submit/listener/MetadataListener.java @@ -12,12 +12,26 @@ import java.util.Map; import gr.ekt.bte.core.DataLoader; import org.dspace.services.ConfigurationService; +/** + * Configuration bean to map metadata to identifiers (i.e dc.identifier.doi -> doi, dc.identifier.isbn -> isbn) and + * alias to BTE Data Loader. See config/spring/api/step-processing.xml + * + * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) + * + */ public class MetadataListener { + /** + * Metadata to identifier map + */ private Map metadata; private ConfigurationService configurationService; + /** + * Alias to data loader map + */ private Map dataloadersMap; public ConfigurationService getConfigurationService() { diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java index 3711842fde..ebc898e4cf 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivFileDataLoader.java @@ -25,8 +25,8 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -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.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -40,7 +40,7 @@ import org.xml.sax.SAXException; */ public class ArXivFileDataLoader extends FileDataLoader { - private static Logger log = Logger.getLogger(ArXivFileDataLoader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ArXivFileDataLoader.class); Map fieldMap; // mapping between service fields and local // intermediate fields diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java index 44cd7ca541..0a32871758 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ArXivService.java @@ -16,7 +16,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import gr.ekt.bte.core.Record; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java index 1ddc866568..410c30ca58 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiFileDataLoader.java @@ -25,8 +25,8 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -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.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; @@ -38,7 +38,7 @@ import org.xml.sax.SAXException; */ public class CiNiiFileDataLoader extends FileDataLoader { - private static Logger log = Logger.getLogger(CiNiiFileDataLoader.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CiNiiFileDataLoader.class); Map fieldMap; // mapping between service fields and local // intermediate fields diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java index db495906da..23026353fd 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiService.java @@ -23,7 +23,7 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -35,7 +35,7 @@ public class CiNiiService { /** * log4j category */ - private static final Logger log = Logger.getLogger(CiNiiService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CiNiiService.class); protected int timeout = 1000; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java index 65cf2bf609..929705371a 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CiNiiUtils.java @@ -17,7 +17,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.dspace.submit.util.SubmissionLookupPublication; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java index 71b50e06dc..dcda4fdba5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefFileDataLoader.java @@ -25,7 +25,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -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/submit/lookup/CrossRefService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java index d1c0fa2654..f73e9c0352 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefService.java @@ -24,7 +24,7 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import gr.ekt.bte.core.Record; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -34,7 +34,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.dspace.core.Context; import org.dspace.core.LogManager; @@ -51,7 +51,7 @@ import org.xml.sax.SAXException; */ public class CrossRefService { - private static final Logger log = Logger.getLogger(CrossRefService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CrossRefService.class); protected int timeout = 1000; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java index c80af2b0a7..f9b64092af 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/CrossRefUtils.java @@ -17,7 +17,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.dspace.submit.util.SubmissionLookupPublication; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java index aab93ef6a5..f93eb29bbc 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/DSpaceWorkspaceItemOutputGenerator.java @@ -21,8 +21,9 @@ import gr.ekt.bte.core.OutputGenerator; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; -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.dspace.app.util.DCInput; import org.dspace.app.util.DCInputSet; import org.dspace.app.util.DCInputsReader; @@ -49,8 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class DSpaceWorkspaceItemOutputGenerator implements OutputGenerator { - private static Logger log = Logger - .getLogger(DSpaceWorkspaceItemOutputGenerator.class); + private static Logger log = LogManager.getLogger(DSpaceWorkspaceItemOutputGenerator.class); protected Context context; @@ -275,13 +275,15 @@ public class DSpaceWorkspaceItemOutputGenerator implements OutputGenerator { String qualifier) throws DCInputsReaderException { List dcinputsets = new DCInputsReader().getInputsBySubmissionName(formName); for (DCInputSet dcinputset : dcinputsets) { - for (DCInput dcinput : dcinputset.getFields()) { - if (dcinput.getSchema().equals(schema) - && dcinput.getElement().equals(element) - && ((dcinput.getQualifier() != null && dcinput - .getQualifier().equals(qualifier)) - || (dcinput.getQualifier() == null && qualifier == null))) { - return dcinput; + for (DCInput[] dcrow : dcinputset.getFields()) { + for (DCInput dcinput : dcrow) { + if (dcinput.getSchema().equals(schema) + && dcinput.getElement().equals(element) + && ((dcinput.getQualifier() != null && dcinput + .getQualifier().equals(qualifier)) + || (dcinput.getQualifier() == null && qualifier == null))) { + return dcinput; + } } } } diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java index b4885e9271..8698363924 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/MapConverterModifier.java @@ -21,7 +21,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.services.ConfigurationService; /** diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java index 3ef5f65f80..712bfbc3a4 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/MultipleSubmissionLookupDataLoader.java @@ -21,7 +21,8 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; /** @@ -32,8 +33,7 @@ import org.dspace.core.Context; */ public class MultipleSubmissionLookupDataLoader implements DataLoader { - private static Logger log = Logger - .getLogger(MultipleSubmissionLookupDataLoader.class); + private static Logger log = LogManager.getLogger(MultipleSubmissionLookupDataLoader.class); protected final String NOT_FOUND_DOI = "NOT-FOUND-DOI"; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java index 43e632e59f..c62afa6c35 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/NetworkSubmissionLookupDataLoader.java @@ -19,7 +19,7 @@ import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.dspace.core.Context; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java index e8213820b6..05a37e64d6 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedFileDataLoader.java @@ -25,7 +25,7 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import gr.ekt.bte.exceptions.MalformedSourceException; -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/submit/lookup/PubmedOnlineDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java index e78fd67405..094ce4e21d 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedOnlineDataLoader.java @@ -16,7 +16,7 @@ import java.util.Set; import gr.ekt.bte.core.Record; import org.apache.http.HttpException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; @@ -29,7 +29,7 @@ import org.dspace.core.LogManager; public class PubmedOnlineDataLoader extends NetworkSubmissionLookupDataLoader { protected boolean searchProvider = true; - private static final Logger log = Logger.getLogger(PubmedOnlineDataLoader.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedOnlineDataLoader.class); protected PubmedService pubmedService = new PubmedService(); diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java index 2bbb2af8bf..fa30ee8ea5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedService.java @@ -19,7 +19,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import gr.ekt.bte.core.Record; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; @@ -29,7 +29,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.XMLUtils; import org.dspace.core.ConfigurationManager; import org.w3c.dom.Document; @@ -44,7 +44,7 @@ import org.xml.sax.SAXException; */ public class PubmedService { - private static final Logger log = Logger.getLogger(PubmedService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PubmedService.class); protected int timeout = 1000; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java index 03f3e3ab03..bca34de295 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/PubmedUtils.java @@ -19,7 +19,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.util.XMLUtils; import org.dspace.submit.util.SubmissionLookupPublication; import org.w3c.dom.Element; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java index ed83d24aeb..24a7601b53 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/RemoveLastDotModifier.java @@ -16,7 +16,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * @author Andrea Bollini diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java index a032331efc..286c6ba23b 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionItemDataLoader.java @@ -15,7 +15,8 @@ import gr.ekt.bte.core.DataLoadingSpec; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.exceptions.MalformedSourceException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.submit.util.ItemSubmissionLookupDTO; /** @@ -29,8 +30,7 @@ public class SubmissionItemDataLoader implements DataLoader { List providers; - private static Logger log = Logger - .getLogger(SubmissionItemDataLoader.class); + private static Logger log = LogManager.getLogger(SubmissionItemDataLoader.class); public SubmissionItemDataLoader() { dtoList = null; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java index b98581b807..7712b64041 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupService.java @@ -17,7 +17,7 @@ import gr.ekt.bte.core.DataLoader; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.TransformationEngine; import gr.ekt.bte.dataloader.FileDataLoader; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.submit.util.SubmissionLookupDTO; /** @@ -35,7 +35,7 @@ public class SubmissionLookupService { public static final String PROVIDER_NAME_FIELD = "provider_name_field"; - private static Logger log = Logger.getLogger(SubmissionLookupService.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionLookupService.class); public static final String SEPARATOR_VALUE = "#######"; diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java index 995fb6798f..d537b0a5aa 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/SubmissionLookupUtils.java @@ -14,7 +14,7 @@ import java.util.regex.Pattern; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.Value; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.content.MetadataSchema; import org.dspace.content.MetadataValue; @@ -31,7 +31,7 @@ import org.dspace.core.Context; * @author Panagiotis Koutsourakis */ public class SubmissionLookupUtils { - private static Logger log = Logger.getLogger(SubmissionLookupUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionLookupUtils.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java b/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java index cdc9aa87db..8d52f1ba73 100644 --- a/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java +++ b/dspace-api/src/main/java/org/dspace/submit/lookup/ValueConcatenationModifier.java @@ -16,7 +16,7 @@ import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; /** * @author Andrea Bollini diff --git a/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java b/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java index bbfdf0cb18..6a746844bc 100644 --- a/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java +++ b/dspace-api/src/main/java/org/dspace/submit/model/LanguageFormField.java @@ -7,10 +7,22 @@ */ package org.dspace.submit.model; +/** + * A simple POJO to store information about the available languages for a field + * + * @author Andrea Bollini (andrea.bollini at 4science.it) + * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * + */ public class LanguageFormField { - + /** + * The value to present to the user + */ private String display; + /** + * The internal iso code to store in the database + */ private String code; public LanguageFormField(String code, String display) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java b/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java index 3cb16908f3..72273b8037 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/AccessStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -17,7 +17,7 @@ public class AccessStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(AccessStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(AccessStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java b/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java index 1c22849c3d..88606e51ed 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/CCLicenseStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.license.factory.LicenseServiceFactory; @@ -18,7 +18,7 @@ public class CCLicenseStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(CCLicenseStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CCLicenseStep.class); protected final CreativeCommonsService creativeCommonsService = LicenseServiceFactory.getInstance() .getCreativeCommonsService(); diff --git a/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java b/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java index 81966fedc9..edb7fc977c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/CompleteStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -16,7 +16,7 @@ public class CompleteStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(CompleteStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CompleteStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java b/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java index c1d679eab1..ae58efc1c3 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/DescribeStep.java @@ -7,7 +7,8 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) @@ -16,6 +17,6 @@ public class DescribeStep extends MetadataStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(DescribeStep.class); + private static final Logger log = LogManager.getLogger(); } diff --git a/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java b/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java index d54dbac79c..8eddebee2c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/LicenseStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -17,7 +17,7 @@ public class LicenseStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(LicenseStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java b/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java index 1c8b411eb5..0ef9fb00ce 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/MetadataStep.java @@ -19,7 +19,7 @@ import java.util.Set; import gr.ekt.bte.core.DataLoader; import gr.ekt.bte.core.Record; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; @@ -33,6 +33,7 @@ import org.dspace.submit.AbstractProcessingStep; import org.dspace.submit.listener.MetadataListener; import org.dspace.submit.lookup.SubmissionLookupDataLoader; +//FIXME move to the ExtractionStep /** * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ diff --git a/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java b/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java index 11b9b3e126..ff3e97023c 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/SelectCollectionStep.java @@ -7,14 +7,14 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; public class SelectCollectionStep extends AbstractProcessingStep { - private static final Logger log = Logger.getLogger(SelectCollectionStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SelectCollectionStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java b/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java index 903100d1f6..b10b1895bb 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/StartSubmissionLookupStep.java @@ -7,7 +7,8 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -16,8 +17,7 @@ public class StartSubmissionLookupStep extends AbstractProcessingStep { /** * log4j logger */ - private static Logger log = Logger - .getLogger(StartSubmissionLookupStep.class); + private static Logger log = LogManager.getLogger(StartSubmissionLookupStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java b/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java index 8e528eb0a4..764f332c1d 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/UploadStep.java @@ -7,7 +7,7 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; import org.dspace.submit.AbstractProcessingStep; @@ -16,7 +16,7 @@ public class UploadStep extends AbstractProcessingStep { /** * log4j logger */ - private static final Logger log = Logger.getLogger(UploadStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(UploadStep.class); @Override public void doPreProcessing(Context context, InProgressSubmission wsi) { diff --git a/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java b/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java index 572b252773..d67887ccb5 100644 --- a/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java +++ b/dspace-api/src/main/java/org/dspace/submit/step/UploadWithEmbargoStep.java @@ -7,12 +7,12 @@ */ package org.dspace.submit.step; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; public class UploadWithEmbargoStep extends UploadStep { /** * log4j logger */ - private static Logger log = Logger.getLogger(UploadWithEmbargoStep.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(UploadWithEmbargoStep.class); } diff --git a/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java b/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java index e5b51cf95b..85c1fe7266 100644 --- a/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java +++ b/dspace-api/src/main/java/org/dspace/submit/util/SubmissionLookupPublication.java @@ -17,7 +17,7 @@ import java.util.Set; import gr.ekt.bte.core.MutableRecord; import gr.ekt.bte.core.StringValue; import gr.ekt.bte.core.Value; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.submit.lookup.SubmissionLookupDataLoader; /** diff --git a/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java b/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java index 52c5599b3e..ec20f3f911 100644 --- a/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java +++ b/dspace-api/src/main/java/org/dspace/testing/PubMedToImport.java @@ -21,8 +21,8 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; 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.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; @@ -46,7 +46,7 @@ import org.xml.sax.helpers.DefaultHandler; * which can then be loaded into DSpace using ItemImport. */ public class PubMedToImport { - private static final Logger log = Logger.getLogger(PubMedToImport.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PubMedToImport.class); private static File outputDir = null; diff --git a/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java b/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java index 3985f19320..c82b9ccfcf 100644 --- a/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java +++ b/dspace-api/src/main/java/org/dspace/text/filter/MARC21InitialArticleWord.java @@ -15,8 +15,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.services.factory.DSpaceServicesFactory; /** diff --git a/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java b/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java index 9ffcf78110..aa24db0775 100644 --- a/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java +++ b/dspace-api/src/main/java/org/dspace/usage/LoggerUsageEventListener.java @@ -7,7 +7,7 @@ */ package org.dspace.usage; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.core.Constants; @@ -23,8 +23,7 @@ public class LoggerUsageEventListener extends AbstractUsageEventListener { /** * log4j category */ - private static Logger log = Logger - .getLogger(LoggerUsageEventListener.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(LoggerUsageEventListener.class); @Override public void receiveEvent(Event event) { diff --git a/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java b/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java index b0ab3b4005..2d5449637f 100644 --- a/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java +++ b/dspace-api/src/main/java/org/dspace/util/SolrImportExport.java @@ -27,8 +27,8 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.apache.commons.io.FileUtils; -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.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; @@ -95,7 +95,7 @@ public class SolrImportExport { private static final String MULTIPLE_VALUES_SPLITTER = ","; - private static final Logger log = Logger.getLogger(SolrImportExport.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SolrImportExport.class); /** * Default constructor diff --git a/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java new file mode 100644 index 0000000000..aa3cba4618 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/util/SolrUpgradePre6xStatistics.java @@ -0,0 +1,699 @@ +/** + * 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.util; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +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.log4j.Logger; +import org.apache.solr.client.solrj.SolrQuery; +import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.impl.HttpSolrServer; +import org.apache.solr.client.solrj.response.FacetField; +import org.apache.solr.client.solrj.response.QueryResponse; +import org.apache.solr.client.solrj.util.ClientUtils; +import org.apache.solr.common.SolrDocument; +import org.apache.solr.common.SolrDocumentList; +import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.SolrInputField; +import org.dspace.content.Bitstream; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.BitstreamService; +import org.dspace.content.service.CollectionService; +import org.dspace.content.service.CommunityService; +import org.dspace.content.service.ItemService; +import org.dspace.core.Constants; +import org.dspace.core.Context; +import org.dspace.eperson.EPerson; +import org.dspace.eperson.Group; +import org.dspace.eperson.factory.EPersonServiceFactory; +import org.dspace.eperson.service.EPersonService; +import org.dspace.eperson.service.GroupService; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +/** + * CLI tool to upgrade legacy id references in SOLR statistics to DSpace 6 UUID's. + * + * This command will need to be run iteratively over each statistics shard until all legacy id values have + * been replaced. + * + * If a legacy id cannot be resolved from the database, the id will remain unchanged. + * "field:* AND NOT(field:*-*)" can be used to locate legacy ids + * + * See DS-3602 for the origin of this issue. This code is targeted for inclusion in the DSpace 6.1 release. + * + * Recommendation: for a large repository, run this command with -Xmx2000m if possible. + * + * To process 1,000,000 statistics records, it took 60 min to complete. + * + * @author Terry Brady, Georgetown University Library + */ +public class SolrUpgradePre6xStatistics { + //Command line parameter constants + private static final String INDEX_NAME_OPTION = "i"; + private static final String NUMREC_OPTION = "n"; + private static final String BATCH_OPTION = "b"; + private static final String TYPE_OPTION = "t"; + private static final String HELP_OPTION = "h"; + private static final int NUMREC_DEFAULT = 100000; + private static final int BATCH_DEFAULT = 10000; + + //After processing each batch of updates to SOLR, evaulate if the hibernate cache needs to be cleared + private static final int CACHE_LIMIT = 20000; + + private static final String INDEX_DEFAULT = "statistics"; + private static final String MIGQUERY = + "(id:* AND -(id:*-*)) OR (scopeId:* AND -(scopeId:*-*)) OR (epersonid:* AND -(epersonid:*-*))"; + + //Counters to determine the number of items to process + private int numRec = NUMREC_DEFAULT; + private int batchSize = BATCH_DEFAULT; + + //Cache management + private int numProcessed = 0; + private long totalCache = 0; + private long numUncache = 0; + private List docs = new ArrayList(); + private Context context; + + //Enum to identify the named SOLR statistics fields to update + private enum FIELD { + id, + scopeId, + owningComm, + owningColl, + owningItem, + epersonid, + owner, + submitter, + actor; + } + + //Logger + private static final Logger log = Logger.getLogger(SolrUpgradePre6xStatistics.class); + + //DSpace Servcies + private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); + protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); + protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); + protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); + protected EPersonService epersonService = EPersonServiceFactory.getInstance().getEPersonService(); + protected GroupService groupService = EPersonServiceFactory.getInstance().getGroupService(); + + // This code will operate on one shard at a time, therefore the SOLR web service will be accessed directly rather + // than make use of the DSpace Solr Logger which only writes to the current shard + private HttpSolrServer server; + + //Allows for smart use of hibernate cache + private Item lastItem = null; + private Bitstream lastBitstream = null; + + //Report on process times + private long startTime = -1; + private long lastTime = -1; + + + /** + * Construct the utility class from the command line options + * @param indexName name of the statistics shard to update + * @param numRec maximum number of records to process + * @throws IOException + * @throws SolrServerException + */ + public SolrUpgradePre6xStatistics(String indexName, int numRec, int batchSize) + throws SolrServerException, IOException { + String serverPath = configurationService.getProperty("solr-statistics.server"); + serverPath = serverPath.replaceAll("statistics$", indexName); + System.out.println("Connecting to " + serverPath); + server = new HttpSolrServer(serverPath); + server.setMaxTotalConnections(1); + this.numRec = numRec; + this.batchSize = batchSize; + refreshContext(); + } + + /* + * Process a batch of updates to SOLR + */ + private void batchUpdateStats() throws SolrServerException, IOException { + if (docs.size() > 0) { + server.add(docs); + server.commit(true, true); + docs.clear(); + } + } + + /** + * Refresh the DSpace Context object in order to periodically release objects from memory + * @throws IOException + * @throws SolrServerException + */ + private void refreshContext() throws SolrServerException, IOException { + if (context != null) { + try { + totalCache += numUncache + context.getCacheSize(); + } catch (SQLException e) { + log.warn(e.getMessage()); + } + } + this.context = new Context(Context.Mode.READ_ONLY); + lastItem = null; + lastBitstream = null; + numUncache = 0; + } + + /* + * Compute the number of items that were cached by hibernate since the context was cleared. + */ + private long getCacheCounts(boolean fromStart) { + long count = 0; + try { + count = context.getCacheSize(); + } catch (Exception e) { + //no action + } + count += this.numUncache; + if (fromStart) { + count += totalCache; + } + return count; + } + + /** + * Compute the time since the last batch was processed + * + * @param fromStart + * if true, report on processing time since the start of the program + * @return the time in ms since the start time + */ + private long logTime(boolean fromStart) { + long ret = 0; + long cur = new Date().getTime(); + if (lastTime == -1) { + startTime = cur; + } else if (fromStart) { + ret = cur - startTime; + } else { + ret = cur - lastTime; + } + lastTime = cur; + return ret; + } + + /* + * Format ms count as h:mm:ss + * + * @param dur Duration in ms + * + * @return duration formatted as h:mm:ss + */ + private String duration(long dur) { + long sec = dur / 1000; + long hh = sec / 3600; + long mm = (sec % 3600) / 60; + long ss = (sec % 60); + return String.format("%d:%02d:%02d", hh, mm, ss); + } + + /** + * Print a status message appended with the processing time for the operation + * + * @param header + * Message to display + * @param fromStart + * if true, report on processing time since the start of the program + */ + private void printTime(int numProcessed, boolean fromStart) { + long dur = logTime(fromStart); + long totalDur = logTime(true); + String stotalDur = duration(totalDur); + long cacheSize = 0; + try { + cacheSize = context.getCacheSize(); + } catch (SQLException e) { + log.error("Cannot get cache size", e); + } + String label = fromStart ? "TOTAL" : "Processed"; + System.out.println(String.format("%s (%s; %s; %s)", + String.format("\t%,12d %10s...", numProcessed, label), + String.format("%,6d sec; %s", dur / 1000, stotalDur), + String.format("DB cache: %,6d/%,8d", cacheSize, getCacheCounts(fromStart)), + String.format("Docs: %,6d", docs.size()))); + } + + /* + * Create command line option processor + */ + private static Options makeOptions() { + Options options = new Options(); + options.addOption(HELP_OPTION, "help", false, "Get help on options for this command."); + options.addOption(INDEX_NAME_OPTION, "index-name", true, + "The names of the indexes to process. At least one is required (default=statistics)"); + options.addOption(NUMREC_OPTION, "num-rec", true, "Total number of records to update (defaut=100,000)."); + options.addOption(BATCH_OPTION, "batch-size", true, + "Number of records to batch update to SOLR at one time (default=10,000)."); + return options; + } + + /** + * A utility method to print out all available command-line options and exit + * given the specified code. + * + * @param options + * the supported options. + * @param exitCode + * the exit code to use. The method will call System#exit(int) with + * the given code. + */ + private static void printHelpAndExit(Options options, int exitCode) { + HelpFormatter myhelp = new HelpFormatter(); + myhelp.printHelp(SolrUpgradePre6xStatistics.class.getSimpleName() + "\n", options); + System.out.println("\n\nCommand Defaults"); + System.out.println( + "\tsolr-upgrade-statistics-6x [-i statistics] [-n num_recs_to_process] [-b num_rec_to_update_at_once]"); + System.out.println(""); + System.out.println( + "\tAfter upgrading to DSpace 6, this process should be run iteratively over every statistics shard "); + System.out.println("\t\tuntil there are no remaining records with legacy ids present."); + System.out.println("\t\tThis process can be run while the system is in use."); + System.out.println(""); + System.out.println("\tIt will take 20-30 min to process 1,000,000 legacy records. "); + System.out.println(""); + System.out.println("\tUse the -n option to manage the workload on your server. "); + System.out.println("\t\tTo process all records, set -n to 10000000 or to 100000000 (10M or 100M)"); + System.out.println("\tIf possible, please allocate 2GB of memory to this process (e.g. -Xmx2000m)"); + System.out.println(""); + System.out.println("\tThis process will rewrite most solr statistics records and may temporarily double "); + System.out.println( + "\t\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); + + System.exit(exitCode); + } + + /** + * Entry point for command-line invocation + * + * @param args + * command-line arguments; see help for description + * @throws ParseException + * if the command-line arguments cannot be parsed + */ + public static void main(String[] args) throws ParseException { + CommandLineParser parser = new PosixParser(); + Options options = makeOptions(); + + System.out.println(" * This process should be run iteratively over every statistics shard "); + System.out.println(" * until there are no remaining records with legacy ids present."); + System.out.println(" * This process can be run while the system is in use."); + System.out.println(" * It is likely to take 1 hour/1,000,000 legacy records to be udpated."); + System.out.println(" *"); + System.out.println(" * This process will rewrite most solr statistics records and may temporarily double "); + System.out.println( + " *\tthe size of your statistics repositories. Consider optimizing your solr repos when complete."); + System.out.println(" * -------------------------------------------------------------------"); + + String indexName = INDEX_DEFAULT; + int numrec = NUMREC_DEFAULT; + int batchSize = BATCH_DEFAULT; + try { + CommandLine line = parser.parse(options, args); + if (line.hasOption(HELP_OPTION)) { + printHelpAndExit(options, 0); + } + + if (line.hasOption(INDEX_NAME_OPTION)) { + indexName = line.getOptionValue(INDEX_NAME_OPTION, INDEX_DEFAULT); + } else { + System.err.println("No index name provided, defaulting to : " + INDEX_DEFAULT); + } + + if (line.hasOption(NUMREC_OPTION)) { + numrec = Integer.parseInt(line.getOptionValue(NUMREC_OPTION, "" + NUMREC_DEFAULT)); + } + if (line.hasOption(BATCH_OPTION)) { + batchSize = Integer.parseInt(line.getOptionValue(BATCH_OPTION, "" + BATCH_DEFAULT)); + } + + } catch (ParseException e) { + System.err.println("Cannot read command options"); + printHelpAndExit(options, 1); + } + + try { + SolrUpgradePre6xStatistics upgradeStats = new SolrUpgradePre6xStatistics(indexName, numrec, batchSize); + upgradeStats.run(); + } catch (SolrServerException e) { + log.error("Error querying stats", e); + } catch (SQLException e) { + log.error("Error querying stats", e); + } catch (IOException e) { + log.error("Error querying stats", e); + } + } + + /* + * Report on the existence of legacy id records within a shard + */ + private void runReport() throws SolrServerException { + System.out.println(); + System.out.println("================================================================="); + System.out.println("\t*** Statistics Records with Legacy Id ***\n"); + long total = runReportQuery(); + System.out.println("\t--------------------------------------"); + System.out.println(String.format("\t%,12d\t%s", total, "TOTAL")); + System.out.println("================================================================="); + System.out.println(); + } + + /* + * Report on the existence of specific legacy id records within a shard + */ + private long runReportQuery() throws SolrServerException { + StringBuilder sb = new StringBuilder(MIGQUERY); + SolrQuery sQ = new SolrQuery(); + sQ.setQuery(sb.toString()); + sQ.setFacet(true); + sQ.addFacetField("type"); + sQ.addFacetField("scopeType"); + QueryResponse sr = server.query(sQ); + + long total = 0; + long unexpected = 0; + for (FacetField ff : sr.getFacetFields()) { + String s = ff.getName().equals("type") ? "View" : "Search"; + for (FacetField.Count count : ff.getValues()) { + String name = count.getName(); + int id = Integer.parseInt(name); + if (id == Constants.COMMUNITY) { + name = "Community " + s; + } else if (id == Constants.COLLECTION) { + name = "Collection " + s; + } else if (id == Constants.ITEM) { + name = "Item " + s; + } else if (id == Constants.BITSTREAM) { + name = "Bistream " + s; + } else { + /* + * In testing, I discovered some unexpected values in the scopeType field. It + * looks like they may have been a result of a CSV import/export error. This + * will group any unexpected values into one report line. + */ + unexpected += count.getCount(); + continue; + } + System.out.println(String.format("\t%,12d\t%s", count.getCount(), name)); + total += count.getCount(); + } + } + if (unexpected > 0) { + System.out.println(String.format("\t%,12d\t%s", unexpected, "Unexpected Type & Full Site")); + total += unexpected; + } + long rem = sr.getResults().getNumFound() - total; + if (rem > 0) { + System.out.println(String.format("\t%,12d\t%s", rem, "Other Records")); + total += rem; + } + return total; + } + + /* + * Process records with a legacy id. From the command line, the user may specify + * records of a specific type to update Otherwise, the following sequence will + * be applied in order to optimize hibernate caching. + * + * Communities and Collections - retain in the cache since each is likely to be + * re-used Items - retain in the cache until a new item is processed Bitstreams + * - retain in the cache until a new bitstream is processed + */ + private void run() throws SolrServerException, SQLException, IOException { + runReport(); + logTime(false); + for (int processed = updateRecords(MIGQUERY); (processed != 0) + && (numProcessed < numRec); processed = updateRecords(MIGQUERY)) { + printTime(numProcessed, false); + batchUpdateStats(); + if (context.getCacheSize() > CACHE_LIMIT) { + refreshContext(); + } + } + printTime(numProcessed, true); + + if (numProcessed > 0) { + runReport(); + } + } + + /* + * Update records associated with a particular object id + * + * @param query Query to retrieve all of the statistics records associated with + * a particular object + * + * @param field Field to use for grouping records + * + * @return number of items processed. 0 indicates that no more work is available + * (or the max processed has been reached). + */ + private int updateRecords(String query) throws SolrServerException, SQLException, IOException { + int initNumProcessed = numProcessed; + SolrQuery sQ = new SolrQuery(); + sQ.setQuery(query); + sQ.setRows(batchSize); + + // Ensure that items are grouped by id + // Sort by id fails due to presense of id and string fields. The ord function + // seems to help + sQ.addSort("type", SolrQuery.ORDER.desc); + sQ.addSort("scopeType", SolrQuery.ORDER.desc); + sQ.addSort("ord(owningItem)", SolrQuery.ORDER.desc); + sQ.addSort("id", SolrQuery.ORDER.asc); + sQ.addSort("scopeId", SolrQuery.ORDER.asc); + + QueryResponse sr = server.query(sQ); + SolrDocumentList sdl = sr.getResults(); + + for (int i = 0; i < sdl.size() && (numProcessed < numRec); i++) { + SolrDocument sd = sdl.get(i); + SolrInputDocument input = ClientUtils.toSolrInputDocument(sd); + input.remove("_version_"); + for (FIELD col : FIELD.values()) { + mapField(input, col); + } + + docs.add(input); + ++numProcessed; + } + return numProcessed - initNumProcessed; + } + + /* + * Map solr fields from legacy ids to UUIDs. + * + * The id field is interpreted by the type field. The scopeId field is + * interpreted by scopeType field. + * + * Legacy ids will be unchanged if they cannot be mapped + * + * @param input The SOLR statistics document to be updated + * + * @param col The SOLR field to update (if present) + */ + private void mapField(SolrInputDocument input, FIELD col) throws SQLException { + SolrInputField ifield = input.get(col.name()); + if (ifield != null) { + Collection vals = ifield.getValues(); + ArrayList newvals = new ArrayList<>(); + for (Object ovalx : vals) { + //DS-3436 documented an issue in which multi-values in shards were converted to a comma separated string + //It also produced strings containing "\" at the end of a value + for (String oval: ovalx.toString().split(",")) { + oval = oval.replace("\\",""); + try { + UUID uuid = null; + if (col == FIELD.owner) { + if (oval.length() > 1) { + String owntype = oval.substring(0, 1); + int legacy = Integer.parseInt(oval.substring(1)); + uuid = mapOwner(owntype, legacy); + } + } else { + int legacy = Integer.parseInt(oval); + if (col == FIELD.id) { + Object otype = input.getFieldValue("type"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else if (col == FIELD.scopeId) { + Object otype = input.getFieldValue("scopeType"); + if (otype != null) { + int type = Integer.parseInt(otype.toString()); + uuid = mapType(type, legacy); + } + } else { + uuid = mapId(col, legacy); + } + } + if (uuid != null) { + if (!newvals.contains(uuid.toString())) { + newvals.add(uuid.toString()); + } + } else { + String s = oval + "-unmigrated"; + if (!newvals.contains(s)) { + newvals.add(s); + } + } + } catch (NumberFormatException e) { + log.warn("Non numeric legacy id " + col.name() + ":" + oval); + } + } + } + if (newvals.size() > 0) { + input.removeField(col.name()); + for (String nv : newvals) { + input.addField(col.name(), nv); + } + } + } + } + + /* + * Determine if the last processed item should be cleared from the hibernate + * cache + * + * @param item Current item being processed + */ + private void checkLastItem(Item item) throws SQLException { + if (item != null) { + if (lastItem == null) { + lastItem = item; + } else if (!lastItem.getID().equals(item.getID())) { + numUncache++; + context.uncacheEntity(lastItem); + lastItem = item; + } + } + } + + /* + * Determine if the last processed bitstream should be cleared from the + * hibernate cache + * + * @param bitstream Current bitstream being processed + */ + private void checkLastBitstream(Bitstream bitstream) throws SQLException { + if (bitstream != null) { + if (lastBitstream == null) { + lastBitstream = bitstream; + } else if (!lastBitstream.getID().equals(bitstream.getID())) { + numUncache++; + context.uncacheEntity(lastBitstream); + lastBitstream = bitstream; + } + } + } + + /* + * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics + * record + * + * @param col Solr Statistic Field being processed + * + * @param val Value to lookup as a legacy id + */ + private UUID mapId(FIELD col, int val) throws SQLException { + + if (col == FIELD.owningComm) { + Community comm = communityService.findByLegacyId(context, val); + return comm == null ? null : comm.getID(); + } + if (col == FIELD.owningColl) { + org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); + return coll == null ? null : coll.getID(); + } + if (col == FIELD.owningItem) { + Item item = itemService.findByLegacyId(context, val); + checkLastItem(item); + return item == null ? null : item.getID(); + } + if (col == FIELD.epersonid || col == FIELD.actor || col == FIELD.submitter) { + EPerson per = epersonService.findByLegacyId(context, val); + return per == null ? null : per.getID(); + } + return null; + } + + /* + * Retrieve the UUID corresponding to a legacy id found in a SOLR statistics + * record + * + * @param type Identifying type field for id OR scopeType field for scopeId + * + * @param val Value to lookup as a legacy id + */ + private UUID mapType(int type, int val) throws SQLException { + if (type == Constants.COMMUNITY) { + Community comm = communityService.findByLegacyId(context, val); + return comm == null ? null : comm.getID(); + } + if (type == Constants.COLLECTION) { + org.dspace.content.Collection coll = collectionService.findByLegacyId(context, val); + return coll == null ? null : coll.getID(); + } + if (type == Constants.ITEM) { + Item item = itemService.findByLegacyId(context, val); + checkLastItem(item); + return item == null ? null : item.getID(); + } + if (type == Constants.BITSTREAM) { + Bitstream bit = bitstreamService.findByLegacyId(context, val); + UUID uuid = bit == null ? null : bit.getID(); + // A bitstream is unlikely to be processed more than once, to clear immediately + checkLastBitstream(bit); + return uuid; + } + return null; + } + + /* + * Retrieve the UUID corresponding to a legacy owner found in a SOLR statistics + * record Legacy owner fields are prefixed in solr with "e" or "g" + * + * @param owntype Identifying type field (e - eperson, g - group) + * + * @param val Value to lookup as a legacy id + */ + private UUID mapOwner(String owntype, int val) throws SQLException { + if (owntype.equals("e")) { + EPerson per = epersonService.findByLegacyId(context, val); + return per == null ? null : per.getID(); + } else if (owntype.equals("g")) { + Group perg = groupService.findByLegacyId(context, val); + return perg == null ? null : perg.getID(); + } + return null; + } + +} \ No newline at end of file diff --git a/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java b/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java index 9f02b18a95..7903a49c31 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java +++ b/dspace-api/src/main/java/org/dspace/versioning/DefaultItemVersionProvider.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.content.Item; @@ -32,7 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class DefaultItemVersionProvider extends AbstractVersionProvider implements ItemVersionProvider { - Logger log = Logger.getLogger(DefaultItemVersionProvider.class); + Logger log = org.apache.logging.log4j.LogManager.getLogger(DefaultItemVersionProvider.class); @Autowired(required = true) protected WorkspaceItemService workspaceItemService; diff --git a/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java b/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java index a8efdc329a..0f5b9384bd 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java +++ b/dspace-api/src/main/java/org/dspace/versioning/VersionHistory.java @@ -20,7 +20,7 @@ import javax.persistence.OrderBy; import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; import org.hibernate.proxy.HibernateProxyHelper; @@ -35,7 +35,7 @@ import org.hibernate.proxy.HibernateProxyHelper; @Table(name = "versionhistory") public class VersionHistory implements ReloadableEntity { - private static final Logger log = Logger.getLogger(VersionHistory.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(VersionHistory.class); @Id @Column(name = "versionhistory_id") diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java index d93026bd44..6633c892ea 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionDAOImpl.java @@ -8,18 +8,20 @@ package org.dspace.versioning.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.Item; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.versioning.Version; import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; import org.dspace.versioning.dao.VersionDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the Version object. @@ -39,9 +41,12 @@ public class VersionDAOImpl extends AbstractHibernateDAO implements Ver @Override public Version findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, Version.class); - criteria.add(Restrictions.eq("item", item)); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); + Root versionRoot = criteriaQuery.from(Version.class); + criteriaQuery.select(versionRoot); + criteriaQuery.where(criteriaBuilder.equal(versionRoot.get(Version_.item), item)); + return singleResult(context, criteriaQuery); } @Override @@ -51,17 +56,28 @@ public class VersionDAOImpl extends AbstractHibernateDAO implements Ver + "FROM Version WHERE versionHistory.id = :historyId"); q.setParameter("historyId", vh.getID()); - int next = (Integer) q.uniqueResult(); + int next = (Integer) q.getSingleResult(); return next; } @Override public List findVersionsWithItems(Context context, VersionHistory versionHistory) throws SQLException { - Criteria criteria = createCriteria(context, Version.class); - criteria.add(Restrictions.eq("versionHistory", versionHistory)); - criteria.add(Restrictions.and(Restrictions.isNotNull("item"))); - criteria.addOrder(Order.desc("versionNumber")); - return list(criteria); + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, Version.class); + Root versionRoot = criteriaQuery.from(Version.class); + criteriaQuery.select(versionRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(versionRoot.get(Version_.versionHistory), versionHistory), + criteriaBuilder.isNotNull(versionRoot.get(Version_.item)) + ) + ); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(versionRoot.get(Version_.versionNumber))); + criteriaQuery.orderBy(orderList); + + return list(context, criteriaQuery, false, Version.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java index 49e3331b23..eac78c3e62 100644 --- a/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/versioning/dao/impl/VersionHistoryDAOImpl.java @@ -8,15 +8,20 @@ package org.dspace.versioning.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; import org.dspace.content.Item; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; +import org.dspace.versioning.Version; import org.dspace.versioning.VersionHistory; +import org.dspace.versioning.Version_; import org.dspace.versioning.dao.VersionHistoryDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the VersionHistory object. @@ -35,10 +40,17 @@ public class VersionHistoryDAOImpl extends AbstractHibernateDAO @Override public VersionHistory findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, VersionHistory.class); - criteria.createAlias("versions", "v"); - criteria.add(Restrictions.eq("v.item", item)); - criteria.addOrder(Order.desc("v.versionNumber")); - return singleResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, VersionHistory.class); + Root versionHistoryRoot = criteriaQuery.from(VersionHistory.class); + Join join = versionHistoryRoot.join("versions"); + criteriaQuery.select(versionHistoryRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(Version_.item), item)); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.desc(join.get(Version_.versionNumber))); + criteriaQuery.orderBy(orderList); + + return singleResult(context, criteriaQuery); } } diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java index d577f03d2d..f3a9bc2d52 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowItemServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -38,7 +38,7 @@ public class BasicWorkflowItemServiceImpl implements BasicWorkflowItemService { /** * log4j category */ - protected static Logger log = Logger.getLogger(BasicWorkflowItem.class); + protected static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowItem.class); @Autowired(required = true) protected BasicWorkflowItemDAO workflowItemDAO; diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java index c20de75ff8..79dfa0ae3d 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/BasicWorkflowServiceImpl.java @@ -21,8 +21,8 @@ import java.util.UUID; import javax.mail.MessagingException; import org.apache.commons.collections4.CollectionUtils; -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.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.AuthorizeService; @@ -104,7 +104,7 @@ public class BasicWorkflowServiceImpl implements BasicWorkflowService { /** * log4j logger */ - private final Logger log = Logger.getLogger(BasicWorkflowServiceImpl.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowServiceImpl.class); @Override public int getWorkflowID(String state) { diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java index 358e0923a6..d3ae4ba884 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/BasicWorkflowItemDAOImpl.java @@ -8,19 +8,23 @@ package org.dspace.workflowbasic.dao.impl; import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.content.Item; +import org.dspace.content.Item_; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.workflowbasic.BasicWorkflowItem; +import org.dspace.workflowbasic.BasicWorkflowItem_; import org.dspace.workflowbasic.dao.BasicWorkflowItemDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Order; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the BasicWorkflowItem object. @@ -37,27 +41,42 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(basicWorkflowItemRoot.get(BasicWorkflowItem_.item), i)); + return uniqueResult(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override public List findBySubmitter(Context context, EPerson ep) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.createAlias("item", "i"); - criteria.add(Restrictions.eq("i.submitter", ep)); - criteria.addOrder(Order.asc("workflowitemId")); - return list(criteria); + + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + Join join = basicWorkflowItemRoot.join("item"); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(Item_.submitter), ep)); + + List orderList = new LinkedList<>(); + orderList.add(criteriaBuilder.asc(basicWorkflowItemRoot.get(BasicWorkflowItem_.workflowitemId))); + criteriaQuery.orderBy(orderList); + + + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override public List findByCollection(Context context, Collection c) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.add(Restrictions.eq("collection", c)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(basicWorkflowItemRoot.get(BasicWorkflowItem_.collection), c)); + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override @@ -71,9 +90,12 @@ public class BasicWorkflowItemDAOImpl extends AbstractHibernateDAO findByOwner(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, BasicWorkflowItem.class); - criteria.add(Restrictions.eq("owner", ePerson)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, BasicWorkflowItem.class); + Root basicWorkflowItemRoot = criteriaQuery.from(BasicWorkflowItem.class); + criteriaQuery.select(basicWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(basicWorkflowItemRoot.get(BasicWorkflowItem_.owner), ePerson)); + return list(context, criteriaQuery, false, BasicWorkflowItem.class, -1, -1); } @Override diff --git a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java index 173d09dcc0..ec92faec03 100644 --- a/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/workflowbasic/dao/impl/TaskListItemDAOImpl.java @@ -9,16 +9,18 @@ package org.dspace.workflowbasic.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.workflowbasic.BasicWorkflowItem; import org.dspace.workflowbasic.TaskListItem; +import org.dspace.workflowbasic.TaskListItem_; import org.dspace.workflowbasic.dao.TaskListItemDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the TaskListItem object. @@ -42,8 +44,11 @@ public class TaskListItemDAOImpl extends AbstractHibernateDAO impl @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, TaskListItem.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, TaskListItem.class); + Root taskListItemRoot = criteriaQuery.from(TaskListItem.class); + criteriaQuery.select(taskListItemRoot); + criteriaQuery.where(criteriaBuilder.equal(taskListItemRoot.get(TaskListItem_.ePerson), ePerson)); + return list(context, criteriaQuery, false, TaskListItem.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java index 872ff2b21c..8c62ed919b 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/WorkflowUtils.java @@ -17,8 +17,8 @@ import java.util.HashMap; import java.util.LinkedHashMap; import javax.servlet.http.HttpServletRequest; -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.util.Util; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -47,7 +47,7 @@ public class WorkflowUtils extends Util { /** * log4j category */ - public static Logger log = Logger.getLogger(WorkflowUtils.class); + public static Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkflowUtils.class); protected static final CollectionRoleService collectionRoleService = XmlWorkflowServiceFactory.getInstance().getCollectionRoleService(); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java index 7f1076b206..950dd4318e 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowFactoryImpl.java @@ -18,7 +18,7 @@ import javax.annotation.PostConstruct; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.TransformerException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.apache.xpath.XPathAPI; import org.dspace.content.Collection; import org.dspace.services.ConfigurationService; @@ -45,7 +45,7 @@ import org.w3c.dom.NodeList; */ public class XmlWorkflowFactoryImpl implements XmlWorkflowFactory { - private Logger log = Logger.getLogger(XmlWorkflowFactoryImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowFactoryImpl.class); @Autowired(required = true) protected ConfigurationService configurationService; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java index 2d1a62e582..f9fc96bed0 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/XmlWorkflowServiceImpl.java @@ -27,7 +27,7 @@ import javax.mail.MessagingException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.AuthorizeService; @@ -93,7 +93,7 @@ public class XmlWorkflowServiceImpl implements XmlWorkflowService { /* support for 'no notification' */ protected Map noEMail = new HashMap<>(); - private Logger log = Logger.getLogger(XmlWorkflowServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowServiceImpl.class); @Autowired(required = true) protected AuthorizeService authorizeService; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java index d64fa66843..a67a6d0cc3 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/migration/RestartWorkflow.java @@ -15,7 +15,7 @@ import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; import org.apache.commons.cli.PosixParser; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Item; import org.dspace.content.WorkspaceItem; import org.dspace.core.Context; @@ -41,7 +41,7 @@ public class RestartWorkflow { /** * log4j category */ - private static Logger log = Logger.getLogger(RestartWorkflow.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(RestartWorkflow.class); public static boolean useWorkflowSendEmail = false; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java index d77ac39aaf..3c6ce50b0d 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/AutoAssignAction.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.List; import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.core.LogManager; @@ -42,7 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class AutoAssignAction extends UserSelectionAction { - private final Logger log = Logger.getLogger(AutoAssignAction.class); + private final Logger log = org.apache.logging.log4j.LogManager.getLogger(AutoAssignAction.class); @Autowired(required = true) protected GroupService groupService; diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java index b80496ab4a..bbeb7cd173 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/state/actions/userassignment/UserSelectionAction.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Context; import org.dspace.xmlworkflow.RoleMembers; @@ -36,7 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public abstract class UserSelectionAction extends Action { - protected Logger log = Logger.getLogger(UserSelectionAction.class); + protected Logger log = org.apache.logging.log4j.LogManager.getLogger(UserSelectionAction.class); public abstract boolean isFinished(XmlWorkflowItem wfi); diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java index 18081034a3..b7efb741f6 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/XmlWorkflowItemServiceImpl.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -53,7 +53,7 @@ public class XmlWorkflowItemServiceImpl implements XmlWorkflowItemService { /* * The current step in the workflow system in which this workflow item is present */ - private Logger log = Logger.getLogger(XmlWorkflowItemServiceImpl.class); + private Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowItemServiceImpl.class); protected XmlWorkflowItemServiceImpl() { diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java index 9db89d6317..bb5a167237 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/ClaimedTaskDAOImpl.java @@ -9,15 +9,17 @@ package org.dspace.xmlworkflow.storedcomponents.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.ClaimedTask; +import org.dspace.xmlworkflow.storedcomponents.ClaimedTask_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.ClaimedTaskDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the ClaimedTask object. @@ -33,79 +35,99 @@ public class ClaimedTaskDAOImpl extends AbstractHibernateDAO implem @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override public ClaimedTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("owner", ePerson) - )); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson) + ) + ); + return uniqueResult(context, criteriaQuery, false, ClaimedTask.class, -1, -1); + - return uniqueResult(criteria); } @Override public List findByEperson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.eq("owner", ePerson)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson)); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override public List findByWorkflowItemAndStepId(Context context, XmlWorkflowItem workflowItem, String stepID) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("stepId", stepID) - )); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID) + ) + ); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override public ClaimedTask findByEPersonAndWorkflowItemAndStepIdAndActionId(Context context, EPerson ePerson, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("owner", ePerson), - Restrictions.eq("stepId", stepID), - Restrictions.eq("actionId", actionID) - )); - - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.owner), ePerson), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) + ) + ); + return uniqueResult(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override public List findByWorkflowItemAndStepIdAndActionId(Context context, XmlWorkflowItem workflowItem, String stepID, String actionID) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("stepId", stepID), - Restrictions.eq("actionId", actionID) - )); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.workflowItem), workflowItem), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID), + criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.actionId), actionID) + ) + ); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } @Override public List findByStep(Context context, String stepID) throws SQLException { - Criteria criteria = createCriteria(context, ClaimedTask.class); - criteria.add(Restrictions.eq("stepId", stepID)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, ClaimedTask.class); + Root claimedTaskRoot = criteriaQuery.from(ClaimedTask.class); + criteriaQuery.select(claimedTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(claimedTaskRoot.get(ClaimedTask_.stepId), stepID)); + return list(context, criteriaQuery, false, ClaimedTask.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java index db83d472e5..c4218d7109 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/CollectionRoleDAOImpl.java @@ -9,15 +9,17 @@ package org.dspace.xmlworkflow.storedcomponents.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.Query; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.content.Collection; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.xmlworkflow.storedcomponents.CollectionRole; +import org.dspace.xmlworkflow.storedcomponents.CollectionRole_; import org.dspace.xmlworkflow.storedcomponents.dao.CollectionRoleDAO; -import org.hibernate.Criteria; -import org.hibernate.Query; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the CollectionRole object. @@ -33,23 +35,27 @@ public class CollectionRoleDAOImpl extends AbstractHibernateDAO @Override public List findByCollection(Context context, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, CollectionRole.class); - criteria.add(Restrictions.eq("collection", collection)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); + Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); + criteriaQuery.select(collectionRoleRoot); + criteriaQuery.where(criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.collection), collection)); + return list(context, criteriaQuery, false, CollectionRole.class, -1, -1); } @Override public CollectionRole findByCollectionAndRole(Context context, Collection collection, String role) throws SQLException { - Criteria criteria = createCriteria(context, CollectionRole.class); - criteria.add(Restrictions.and( - Restrictions.eq("collection", collection), - Restrictions.eq("roleId", role) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, CollectionRole.class); + Root collectionRoleRoot = criteriaQuery.from(CollectionRole.class); + criteriaQuery.select(collectionRoleRoot); + criteriaQuery.where( + criteriaBuilder.and(criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.collection), collection), + criteriaBuilder.equal(collectionRoleRoot.get(CollectionRole_.roleId), role) + ) ); - - return uniqueResult(criteria); + return uniqueResult(context, criteriaQuery, false, CollectionRole.class, -1, -1); } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java index 60e9316c6b..cdba1600a8 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/InProgressUserDAOImpl.java @@ -9,15 +9,17 @@ package org.dspace.xmlworkflow.storedcomponents.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.InProgressUser; +import org.dspace.xmlworkflow.storedcomponents.InProgressUser_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.InProgressUserDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the InProgressUser object. @@ -34,54 +36,70 @@ public class InProgressUserDAOImpl extends AbstractHibernateDAO @Override public InProgressUser findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("ePerson", ePerson) - ) + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + criteriaQuery.select(inProgressUserRoot); + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.ePerson), ePerson) + ) ); - return uniqueResult(criteria); + return uniqueResult(context, criteriaQuery, false, InProgressUser.class, -1, -1); + } @Override public List findByEperson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + criteriaQuery.select(inProgressUserRoot); + criteriaQuery.where(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.ePerson), ePerson)); + return list(context, criteriaQuery, false, InProgressUser.class, -1, -1); } @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, InProgressUser.class); + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + criteriaQuery.select(inProgressUserRoot); + criteriaQuery.where(criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, InProgressUser.class, -1, -1); } @Override public int countInProgressUsers(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("finished", false) - ) - ); - return count(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), false) + ) + ); + return count(context, criteriaQuery, criteriaBuilder, inProgressUserRoot); } @Override public int countFinishedUsers(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, InProgressUser.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("finished", true) - ) + + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root inProgressUserRoot = criteriaQuery.from(InProgressUser.class); + + criteriaQuery.where(criteriaBuilder.and( + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.workflowItem), workflowItem), + criteriaBuilder.equal(inProgressUserRoot.get(InProgressUser_.finished), true) + ) ); - return count(criteria); + return count(context, criteriaQuery, criteriaBuilder, inProgressUserRoot); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java index ea20e79db5..b38041da39 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/PoolTaskDAOImpl.java @@ -9,16 +9,18 @@ package org.dspace.xmlworkflow.storedcomponents.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.xmlworkflow.storedcomponents.PoolTask; +import org.dspace.xmlworkflow.storedcomponents.PoolTask_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.PoolTaskDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the PoolTask object. @@ -34,53 +36,62 @@ public class PoolTaskDAOImpl extends AbstractHibernateDAO implements P @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.ePerson), ePerson)); + return list(context, criteriaQuery, false, PoolTask.class, -1, -1); - return list(criteria); } @Override public List findByGroup(Context context, Group group) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add(Restrictions.eq("group", group)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.group), group)); + return list(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery.where(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem)); + return list(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override public PoolTask findByWorkflowItemAndEPerson(Context context, XmlWorkflowItem workflowItem, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("ePerson", ePerson) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), + criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.ePerson), ePerson) + ) ); - - return uniqueResult(criteria); + return uniqueResult(context, criteriaQuery, false, PoolTask.class, -1, -1); } @Override public PoolTask findByWorkflowItemAndGroup(Context context, Group group, XmlWorkflowItem workflowItem) throws SQLException { - Criteria criteria = createCriteria(context, PoolTask.class); - criteria.add( - Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("group", group) - ) + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, PoolTask.class); + Root poolTaskRoot = criteriaQuery.from(PoolTask.class); + criteriaQuery.select(poolTaskRoot); + criteriaQuery + .where(criteriaBuilder.and(criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.workflowItem), workflowItem), + criteriaBuilder.equal(poolTaskRoot.get(PoolTask_.group), group) + ) ); - - return uniqueResult(criteria); + return uniqueResult(context, criteriaQuery, false, PoolTask.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java index dfc75fd069..fdc2413b5f 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/WorkflowItemRoleDAOImpl.java @@ -9,15 +9,17 @@ package org.dspace.xmlworkflow.storedcomponents.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole; +import org.dspace.xmlworkflow.storedcomponents.WorkflowItemRole_; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.dspace.xmlworkflow.storedcomponents.dao.WorkflowItemRoleDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the WorkflowItemRole object. @@ -27,37 +29,49 @@ import org.hibernate.criterion.Restrictions; * @author kevinvandevelde at atmire.com */ public class WorkflowItemRoleDAOImpl extends AbstractHibernateDAO implements WorkflowItemRoleDAO { + protected WorkflowItemRoleDAOImpl() { super(); } @Override - public List findByWorkflowItemAndRole(Context context, XmlWorkflowItem workflowItem, String role) - throws SQLException { - Criteria criteria = createCriteria(context, WorkflowItemRole.class); - criteria.add(Restrictions.and( - Restrictions.eq("workflowItem", workflowItem), - Restrictions.eq("role", role) - ) + public List findByWorkflowItemAndRole(Context context, + XmlWorkflowItem workflowItem, + String role) throws SQLException { + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); + Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); + criteriaQuery.select(workflowItemRoleRoot); + criteriaQuery.where(criteriaBuilder.and(criteriaBuilder + .equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), + workflowItem), + criteriaBuilder + .equal(workflowItemRoleRoot.get(WorkflowItemRole_.roleId), + role) + ) ); - - return list(criteria); + return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } @Override - public List findByWorkflowItem(Context context, XmlWorkflowItem workflowItem) - throws SQLException { - Criteria criteria = createCriteria(context, WorkflowItemRole.class); - criteria.add(Restrictions.eq("workflowItem", workflowItem)); - - return list(criteria); + public List findByWorkflowItem(Context context, + XmlWorkflowItem workflowItem) throws SQLException { + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); + Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); + criteriaQuery.select(workflowItemRoleRoot); + criteriaQuery.where(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.workflowItem), + workflowItem)); + return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } @Override public List findByEPerson(Context context, EPerson ePerson) throws SQLException { - Criteria criteria = createCriteria(context, WorkflowItemRole.class); - criteria.add(Restrictions.eq("ePerson", ePerson)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, WorkflowItemRole.class); + Root workflowItemRoleRoot = criteriaQuery.from(WorkflowItemRole.class); + criteriaQuery.select(workflowItemRoleRoot); + criteriaQuery.where(criteriaBuilder.equal(workflowItemRoleRoot.get(WorkflowItemRole_.ePerson), ePerson)); + return list(context, criteriaQuery, false, WorkflowItemRole.class, -1, -1); } } diff --git a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java index f32e3d9db7..3c14e42a5b 100644 --- a/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java +++ b/dspace-api/src/main/java/org/dspace/xmlworkflow/storedcomponents/dao/impl/XmlWorkflowItemDAOImpl.java @@ -10,15 +10,20 @@ package org.dspace.xmlworkflow.storedcomponents.dao.impl; import java.sql.SQLException; import java.util.List; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; + import org.dspace.content.Collection; import org.dspace.content.Item; +import org.dspace.content.Item_; import org.dspace.core.AbstractHibernateDAO; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; +import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem_; import org.dspace.xmlworkflow.storedcomponents.dao.XmlWorkflowItemDAO; -import org.hibernate.Criteria; -import org.hibernate.criterion.Restrictions; /** * Hibernate implementation of the Database Access Object interface class for the XmlWorkflowItem object. @@ -34,21 +39,24 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO findAllInCollection(Context context, Integer offset, Integer limit, + public List findAllInCollection(Context context, Integer offset, + Integer limit, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + criteriaQuery.select(xmlWorkflowItemRoot); if (collection != null) { - criteria.add(Restrictions.eq("collection", collection)); + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), + collection)); } - - if (offset != null) { - criteria.setFirstResult(offset); + if (offset == null) { + offset = -1; } - if (limit != null) { - criteria.setMaxResults(limit); + if (limit == null) { + limit = -1; } - - return list(criteria); + return list(context, criteriaQuery, false, XmlWorkflowItem.class, limit, offset); } @Override @@ -58,35 +66,48 @@ public class XmlWorkflowItemDAOImpl extends AbstractHibernateDAO criteriaQuery = criteriaBuilder.createQuery(Long.class); + + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); if (collection != null) { - criteria.add(Restrictions.eq("collection", collection)); + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), + collection)); } - return count(criteria); + return count(context, criteriaQuery, criteriaBuilder, xmlWorkflowItemRoot); } @Override public List findBySubmitter(Context context, EPerson ep) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - criteria.createAlias("item", "i"); - criteria.add(Restrictions.eq("i.submitter", ep)); - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + Join join = xmlWorkflowItemRoot.join("item"); + criteriaQuery.select(xmlWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(join.get(Item_.submitter), ep)); + return list(context, criteriaQuery, false, XmlWorkflowItem.class, -1, -1); } @Override public List findByCollection(Context context, Collection collection) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - criteria.add(Restrictions.eq("collection", collection)); - - return list(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + criteriaQuery.select(xmlWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.collection), collection)); + return list(context, criteriaQuery, false, XmlWorkflowItem.class, -1, -1); } @Override public XmlWorkflowItem findByItem(Context context, Item item) throws SQLException { - Criteria criteria = createCriteria(context, XmlWorkflowItem.class); - criteria.add(Restrictions.eq("item", item)); - - return uniqueResult(criteria); + CriteriaBuilder criteriaBuilder = getCriteriaBuilder(context); + CriteriaQuery criteriaQuery = getCriteriaQuery(criteriaBuilder, XmlWorkflowItem.class); + Root xmlWorkflowItemRoot = criteriaQuery.from(XmlWorkflowItem.class); + criteriaQuery.select(xmlWorkflowItemRoot); + criteriaQuery.where(criteriaBuilder.equal(xmlWorkflowItemRoot.get(XmlWorkflowItem_.item), item)); + return uniqueResult(context, criteriaQuery, false, XmlWorkflowItem.class, -1, -1); } } diff --git a/dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json b/dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json deleted file mode 100644 index e873b976ec..0000000000 --- a/dspace-api/src/main/resources/org/dspace/statistics/elasticsearch-statistics-mapping.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "stats": { - "properties": { - "bundleName": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "city": { - "type": "multi_field", - "fields": { - "city": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "continent": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "country": { - "type": "multi_field", - "fields": { - "country": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "countryCode": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "dns": { - "type": "multi_field", - "fields": { - "dns": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "epersonid": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "geo": { - "type": "geo_point" - }, - "id": { - "type": "integer" - }, - "ip": { - "type": "multi_field", - "fields": { - "ip": { - "type": "string" - }, - "untouched": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs", - "include_in_all": false - } - } - }, - "isBot": { - "type": "boolean" - }, - "latitude": { - "type": "double" - }, - "longitude": { - "type": "double" - }, - "message": { - "type": "string" - }, - "owningColl": { - "type": "integer" - }, - "owningComm": { - "type": "integer" - }, - "owningItem": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "postDate": { - "type": "date", - "format": "dateOptionalTime" - }, - "time": { - "type": "date", - "format": "dateOptionalTime" - }, - "type": { - "type": "string", - "index": "not_analyzed", - "norms": { - "enabled": false - }, - "index_options": "docs" - }, - "typeIndex": { - "type": "long" - }, - "user": { - "type": "string" - }, - "userAgent": { - "type": "string" - } - } - } -} \ No newline at end of file diff --git a/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml index dfdd1a2c8c..402d5d8287 100644 --- a/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml +++ b/dspace-api/src/main/resources/spring/spring-dspace-core-services.xml @@ -45,6 +45,4 @@ - - diff --git a/dspace-api/src/test/data/dspaceFolder/config/local.cfg b/dspace-api/src/test/data/dspaceFolder/config/local.cfg index 96ebb8b5e7..4be509b8b7 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/local.cfg +++ b/dspace-api/src/test/data/dspaceFolder/config/local.cfg @@ -105,3 +105,7 @@ plugin.sequence.java.util.Collection = \ java.util.LinkedList, \ java.util.Stack, \ java.util.TreeSet + +#### OpenSearch Settings #### +# enable open search +websvc.opensearch.enable = true diff --git a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml index 3467ef2ec7..10e9578c88 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml +++ b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml @@ -4,402 +4,416 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - -
- - dc - title - - false - - onebox - Enter the name of the file. - You must enter a main title for this item. - + + + + + dc + title + + false + + onebox + Enter the name of the file. + You must enter a main title for this item. + + + + + dc + description + true + + textarea + Enter a description for the file + + + + + +
+ + + dc + contributor + author + true + + name + Enter the names of the authors of this item. + + + + + + dc + title + + false + + onebox + Enter the main title of the item. + You must enter a main title for this item. + + + + + + dc + title + alternative + true + + onebox + If the item has any alternative titles, please enter them here. + + + + + + dc + date + issued + false + + + date + Please give the date of previous publication or public distribution. + You can leave out the day and/or month if they aren't + applicable. + You must enter at least the year. + - - dc - description - true - - textarea - Enter a description for the file - - - + + dc + publisher + + false + + + onebox + Enter the name of the publisher of the previously issued instance of this item. + + +
+ + + dc + identifier + citation + false + + onebox + Enter the standard citation for the previously issued instance of this item. + + + + + + dc + relation + ispartofseries + true + + series + Enter the series and number assigned to this item by your community. + + + + + + dc + identifier + + + true + + qualdrop_value + If the item has any identification numbers or codes associated with +it, please enter the types and the actual numbers or codes. + + + + + + dc + type + + true + + dropdown + Select the type(s) of content of the item. To select more than one value in the list, you may have to hold down the "CTRL" or "Shift" key. + + + + + + dc + language + iso + false + + dropdown + Select the language of the main content of the item. If the language does not appear in the list, please select 'Other'. If the content does not really have a language (for example, if it is a dataset or an image) please select 'N/A'. + + + + + +
+ + + dc + subject + + + true + + twobox + Enter appropriate subject keywords or phrases. + + srsc + + + + + dc + description + abstract + false + + textarea + Enter the abstract of the item. + + + + + + dc + description + sponsorship + false + + textarea + Enter the names of any sponsors and/or funding codes in the box. + + + + + + dc + description + + false + + textarea + Enter any other description or comments in this box. + + + +
-
- - dc - contributor - author - true - - name - Enter the names of the authors of this item. - - - - - dc - title - - false - - onebox - Enter the main title of the item. - You must enter a main title for this item. - - - - dc - title - alternative - true - - onebox - If the item has any alternative titles, please enter them here. - - - - - dc - date - issued - false - - date - Please give the date of previous publication or public distribution. - You can leave out the day and/or month if they aren't - applicable. - - You must enter at least the year. - - - - dc - publisher - - false - - onebox - Enter the name of the publisher of the previously issued instance of this item. - - - - - dc - identifier - citation - false - - onebox - Enter the standard citation for the previously issued instance of this item. - - - - - dc - relation - ispartofseries - true - - series - Enter the series and number assigned to this item by your community. - - - - - dc - identifier - - - true - - qualdrop_value - If the item has any identification numbers or codes associated with - it, please enter the types and the actual numbers or codes. - - - - - - dc - type - - true - - dropdown - Select the type(s) of content of the item. To select more than one value in the list, you may have - to hold down the "CTRL" or "Shift" key. - - - - - - dc - language - iso - false - - dropdown - Select the language of the main content of the item. If the language does not appear in the list, - please select 'Other'. If the content does not really have a language (for example, if it is a - dataset or an image) please select 'N/A'. - - - -
- -
- - dc - subject - - - true - - twobox - Enter appropriate subject keywords or phrases. - - srsc - - - - dc - description - abstract - false - - textarea - Enter the abstract of the item. - - - - - dc - description - sponsorship - false - - textarea - Enter the names of any sponsors and/or funding codes in the box. - - - - - dc - description - - false - - textarea - Enter any other description or comments in this box. - - -
- -
+
- - - - - - - - - - - - + + + + + + + + + + + + - - - - ISSN - issn - - - Other - other - - - ISMN - ismn - - - Gov't Doc # - govdoc - - - URI - uri - - - ISBN - isbn - - + + + + ISSN + issn + + + Other + other + + + ISMN + ismn + + + Gov't Doc # + govdoc + + + URI + uri + + + ISBN + isbn + + - - - Animation - Animation - - - Article - Article - - - Book - Book - - - Book chapter - Book chapter - - - Dataset - Dataset - - - Learning Object - Learning Object - - - Image - Image - - - Image, 3-D - Image, 3-D - - - Map - Map - - - Musical Score - Musical Score - - - Plan or blueprint - Plan or blueprint - - - Preprint - Preprint - - - Presentation - Presentation - - - Recording, acoustical - Recording, acoustical - - - Recording, musical - Recording, musical - - - Recording, oral - Recording, oral - - - Software - Software - - - Technical Report - Technical Report - - - Thesis - Thesis - - - Video - Video - - - Working Paper - Working Paper - - - Other - Other - - + + + Animation + Animation + + + Article + Article + + + Book + Book + + + Book chapter + Book chapter + + + Dataset + Dataset + + + Learning Object + Learning Object + + + Image + Image + + + Image, 3-D + Image, 3-D + + + Map + Map + + + Musical Score + Musical Score + + + Plan or blueprint + Plan or blueprint + + + Preprint + Preprint + + + Presentation + Presentation + + + Recording, acoustical + Recording, acoustical + + + Recording, musical + Recording, musical + + + Recording, oral + Recording, oral + + + Software + Software + + + Technical Report + Technical Report + + + Thesis + Thesis + + + Video + Video + + + Working Paper + Working Paper + + + Other + Other + + - - - - N/A - - - - English (United States) - en_US - - - English - en - - - Spanish - es - - - German - de - - - French - fr - - - Italian - it - - - Japanese - ja - - - Chinese - zh - - - Turkish - tr - - - (Other) - other - - + + + + N/A + + + + English (United States) + en_US + + + English + en + + + Spanish + es + + + German + de + + + French + fr + + + Italian + it + + + Japanese + ja + + + Chinese + zh + + + Turkish + tr + + + (Other) + other + + - +
diff --git a/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java b/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java index f62db49e4c..7326b7188e 100644 --- a/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java +++ b/dspace-api/src/test/java/org/dspace/AbstractDSpaceTest.java @@ -16,7 +16,7 @@ import java.util.Properties; import java.util.TimeZone; import mockit.integration.junit4.JMockit; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.MockUtil; import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelInit; @@ -50,7 +50,7 @@ public class AbstractDSpaceTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractDSpaceTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceTest.class); /** * Test properties. These configure our general test environment diff --git a/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java b/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java index c008b76d17..cf8a50fcf6 100644 --- a/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java +++ b/dspace-api/src/test/java/org/dspace/AbstractUnitTest.java @@ -11,7 +11,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -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; @@ -43,7 +43,7 @@ public class AbstractUnitTest extends AbstractDSpaceTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractUnitTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractUnitTest.class); /** * Context mock object to use in the tests. diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java index c4261f0b02..1ddba1a011 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/DSpaceCSVTest.java @@ -18,7 +18,7 @@ import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.junit.Test; @@ -32,7 +32,7 @@ public class DSpaceCSVTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(DSpaceCSVTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceCSVTest.class); /** * Test the reading and parsing of CSV files diff --git a/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java b/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java index a03b46ad57..3a64c5482c 100644 --- a/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java +++ b/dspace-api/src/test/java/org/dspace/app/util/GoogleMetadataTest.java @@ -15,7 +15,7 @@ import java.io.IOException; import java.sql.SQLException; import org.apache.commons.io.Charsets; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; @@ -37,7 +37,7 @@ public class GoogleMetadataTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(GoogleMetadataTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GoogleMetadataTest.class); /** * Item instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java b/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java index 952e091db8..2e33d96d73 100644 --- a/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java +++ b/dspace-api/src/test/java/org/dspace/checker/dao/impl/ChecksumHistoryDAOImplTest.java @@ -15,6 +15,7 @@ import java.sql.SQLException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; +import javax.persistence.Query; import org.dspace.AbstractUnitTest; import org.dspace.checker.ChecksumResultCode; @@ -23,7 +24,6 @@ import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; import org.dspace.core.CoreHelpers; import org.dspace.core.HibernateDBConnection; -import org.hibernate.Query; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -87,9 +87,9 @@ public class ChecksumHistoryDAOImplTest cal.add(Calendar.DATE, -1); Date matchDate = cal.getTime(); checkId++; - qry.setInteger("id", checkId); - qry.setDate("date", matchDate); - qry.setString("result", ChecksumResultCode.CHECKSUM_MATCH.name()); + qry.setParameter("id", checkId); + qry.setParameter("date", matchDate); + qry.setParameter("result", ChecksumResultCode.CHECKSUM_MATCH.name()); qry.setParameter("bitstream", bs.getID()); // FIXME identifier not being set??? qry.executeUpdate(); @@ -97,9 +97,9 @@ public class ChecksumHistoryDAOImplTest cal.add(Calendar.DATE, -1); Date noMatchDate = cal.getTime(); checkId++; - qry.setInteger("id", checkId); - qry.setDate("date", noMatchDate); - qry.setString("result", ChecksumResultCode.CHECKSUM_NO_MATCH.name()); + qry.setParameter("id", checkId); + qry.setParameter("date", noMatchDate); + qry.setParameter("result", ChecksumResultCode.CHECKSUM_NO_MATCH.name()); qry.setParameter("bitstream", bs.getID()); // FIXME identifier not being set??? qry.executeUpdate(); @@ -107,9 +107,9 @@ public class ChecksumHistoryDAOImplTest cal.add(Calendar.DATE, +3); Date futureDate = cal.getTime(); checkId++; - qry.setInteger("id", checkId); - qry.setDate("date", new java.sql.Date(futureDate.getTime())); - qry.setString("result", ChecksumResultCode.CHECKSUM_MATCH.name()); + qry.setParameter("id", checkId); + qry.setParameter("date", new java.sql.Date(futureDate.getTime())); + qry.setParameter("result", ChecksumResultCode.CHECKSUM_MATCH.name()); qry.setParameter("bitstream", bs.getID()); // FIXME identifier not being set??? qry.executeUpdate(); @@ -125,18 +125,18 @@ public class ChecksumHistoryDAOImplTest "SELECT COUNT(*) FROM ChecksumHistory WHERE process_end_date = :date"); long count; - qry.setDate("date", matchDate); - count = (Long) qry.uniqueResult(); + qry.setParameter("date", matchDate); + count = (Long) qry.getSingleResult(); assertEquals("Should find no row at matchDate", count, 0); // See if nonmatching old row is still present. - qry.setDate("date", noMatchDate); - count = (Long) qry.uniqueResult(); + qry.setParameter("date", noMatchDate); + count = (Long) qry.getSingleResult(); assertEquals("Should find one row at noMatchDate", count, 1); // See if new row is still present. - qry.setDate("date", futureDate); - count = (Long) qry.uniqueResult(); + qry.setParameter("date", futureDate); + count = (Long) qry.getSingleResult(); assertEquals("Should find one row at futureDate", count, 1); } diff --git a/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java b/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java index 07b83c3755..c12234635c 100644 --- a/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java +++ b/dspace-api/src/test/java/org/dspace/content/BitstreamFormatTest.java @@ -22,7 +22,7 @@ import java.util.Collections; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.AuthorizeServiceImpl; @@ -45,7 +45,7 @@ public class BitstreamFormatTest extends AbstractUnitTest { /** * log4j category */ - private final static Logger log = Logger.getLogger(BitstreamFormatTest.class); + private final static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormatTest.class); /** * Object to use in the tests diff --git a/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java b/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java index fd46c3ec17..b390de4598 100644 --- a/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java +++ b/dspace-api/src/test/java/org/dspace/content/BitstreamTest.java @@ -24,7 +24,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -43,7 +43,7 @@ public class BitstreamTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(BitstreamTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamTest.class); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() diff --git a/dspace-api/src/test/java/org/dspace/content/BundleTest.java b/dspace-api/src/test/java/org/dspace/content/BundleTest.java index 09ca44ada1..abd9ce6947 100644 --- a/dspace-api/src/test/java/org/dspace/content/BundleTest.java +++ b/dspace-api/src/test/java/org/dspace/content/BundleTest.java @@ -29,7 +29,7 @@ import java.util.UUID; import mockit.NonStrictExpectations; import org.apache.commons.collections4.CollectionUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.core.Constants; @@ -47,7 +47,7 @@ public class BundleTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(BundleTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BundleTest.class); /** * Bundle instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/CollectionTest.java b/dspace-api/src/test/java/org/dspace/content/CollectionTest.java index 1e05353dcf..48f16dcbfe 100644 --- a/dspace-api/src/test/java/org/dspace/content/CollectionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/CollectionTest.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Constants; @@ -48,7 +48,7 @@ public class CollectionTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(CollectionTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionTest.class); private LicenseService licenseService = CoreServiceFactory.getInstance().getLicenseService(); diff --git a/dspace-api/src/test/java/org/dspace/content/CommunityTest.java b/dspace-api/src/test/java/org/dspace/content/CommunityTest.java index 65bf7f6f73..e15e567520 100644 --- a/dspace-api/src/test/java/org/dspace/content/CommunityTest.java +++ b/dspace-api/src/test/java/org/dspace/content/CommunityTest.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Constants; @@ -45,7 +45,7 @@ public class CommunityTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(CommunityTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CommunityTest.class); /** * Community instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/DCDateTest.java b/dspace-api/src/test/java/org/dspace/content/DCDateTest.java index ced07c72b2..e827fb4434 100644 --- a/dspace-api/src/test/java/org/dspace/content/DCDateTest.java +++ b/dspace-api/src/test/java/org/dspace/content/DCDateTest.java @@ -18,8 +18,8 @@ import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; -import org.apache.commons.lang.time.DateUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.logging.log4j.Logger; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -31,7 +31,7 @@ public class DCDateTest { /** * log4j category */ - private static Logger log = Logger.getLogger(DCDateTest.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DCDateTest.class); /** * Object to use in the tests diff --git a/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java b/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java index eb2b79c9dd..4e0711aac0 100644 --- a/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java +++ b/dspace-api/src/test/java/org/dspace/content/FormatIdentifierTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.assertThat; import java.io.File; import java.io.FileInputStream; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -33,7 +33,7 @@ public class FormatIdentifierTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(FormatIdentifierTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(FormatIdentifierTest.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory.getInstance() diff --git a/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java b/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java index 2d7271896d..e7f9c29794 100644 --- a/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java +++ b/dspace-api/src/test/java/org/dspace/content/ITCommunityCollection.java @@ -19,7 +19,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -51,7 +51,7 @@ public class ITCommunityCollection extends AbstractIntegrationTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ITCommunityCollection.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ITCommunityCollection.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/ITMetadata.java b/dspace-api/src/test/java/org/dspace/content/ITMetadata.java index e8bc5e5414..10afd4d85f 100644 --- a/dspace-api/src/test/java/org/dspace/content/ITMetadata.java +++ b/dspace-api/src/test/java/org/dspace/content/ITMetadata.java @@ -16,7 +16,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -40,7 +40,7 @@ public class ITMetadata extends AbstractIntegrationTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ITMetadata.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ITMetadata.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); diff --git a/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java b/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java index 28f56a790a..78be99bb01 100644 --- a/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/InProgressSubmissionTest.java @@ -7,7 +7,7 @@ */ package org.dspace.content; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.junit.After; import org.junit.Before; @@ -26,7 +26,7 @@ public class InProgressSubmissionTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(InProgressSubmissionTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(InProgressSubmissionTest.class); /** * This method will be run before every test as per @Before. It will diff --git a/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java b/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java index 72a7f626b8..129727bd14 100644 --- a/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/InstallItemTest.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.TimeZone; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -60,7 +60,7 @@ public class InstallItemTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(InstallItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(InstallItemTest.class); /** * Used to check/verify thrown exceptions in below tests diff --git a/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java b/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java index 71fdcb41e8..73c8bc0eb5 100644 --- a/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ItemComparatorTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -40,7 +40,7 @@ public class ItemComparatorTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ItemComparatorTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemComparatorTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/ItemTest.java b/dspace-api/src/test/java/org/dspace/content/ItemTest.java index 32e6e5deb5..c337b1e46b 100644 --- a/dspace-api/src/test/java/org/dspace/content/ItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ItemTest.java @@ -29,8 +29,8 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.commons.lang.time.DateUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.logging.log4j.Logger; import org.dspace.app.util.AuthorizeUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; @@ -56,7 +56,7 @@ public class ItemTest extends AbstractDSpaceObjectTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemTest.class); /** * Item instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java b/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java index c1dee50994..ab96d0cde3 100644 --- a/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java +++ b/dspace-api/src/test/java/org/dspace/content/LicenseUtilsTest.java @@ -20,7 +20,7 @@ import java.util.Locale; import java.util.Map; import org.apache.commons.io.IOUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -49,7 +49,7 @@ public class LicenseUtilsTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(LicenseUtilsTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(LicenseUtilsTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java index b41e8acd97..55c5315bb0 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataFieldTest.java @@ -18,7 +18,7 @@ import java.sql.SQLException; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -38,7 +38,7 @@ public class MetadataFieldTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataFieldTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldTest.class); /** * MetadataField instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java index 35a82a9cec..13f7468543 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataSchemaTest.java @@ -19,7 +19,7 @@ import java.sql.SQLException; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -37,7 +37,7 @@ public class MetadataSchemaTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataSchemaTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaTest.class); /** * MetadataSchema instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java b/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java index bee228aa05..947720ef87 100644 --- a/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java +++ b/dspace-api/src/test/java/org/dspace/content/MetadataValueTest.java @@ -18,7 +18,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -42,7 +42,7 @@ public class MetadataValueTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MetadataValueTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataValueTest.class); /** * MetadataValue instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java b/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java index 52a8e0fe17..b99e44c7f2 100644 --- a/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java +++ b/dspace-api/src/test/java/org/dspace/content/NonUniqueMetadataExceptionTest.java @@ -9,7 +9,8 @@ package org.dspace.content; import static org.junit.Assert.assertTrue; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.junit.Test; /** @@ -23,7 +24,8 @@ public class NonUniqueMetadataExceptionTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(NonUniqueMetadataExceptionTest.class); + private static final Logger log = LogManager + .getLogger(NonUniqueMetadataExceptionTest.class); /** * Dummy test to avoid initialization errors diff --git a/dspace-api/src/test/java/org/dspace/content/SiteTest.java b/dspace-api/src/test/java/org/dspace/content/SiteTest.java index f0d0e4243c..421ce4b1bc 100644 --- a/dspace-api/src/test/java/org/dspace/content/SiteTest.java +++ b/dspace-api/src/test/java/org/dspace/content/SiteTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; @@ -35,7 +35,7 @@ public class SiteTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(SiteTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SiteTest.class); /** * Site instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java b/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java index f0c289442b..406b8ab1b3 100644 --- a/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/SupervisedItemTest.java @@ -18,7 +18,7 @@ import java.sql.SQLException; import java.util.List; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -45,7 +45,7 @@ public class SupervisedItemTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(SupervisedItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SupervisedItemTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java b/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java index a350d3d0b8..93e231da1d 100644 --- a/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java +++ b/dspace-api/src/test/java/org/dspace/content/ThumbnailTest.java @@ -15,7 +15,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamService; @@ -34,7 +34,7 @@ public class ThumbnailTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ThumbnailTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ThumbnailTest.class); protected BitstreamService bitstreamService = ContentServiceFactory.getInstance().getBitstreamService(); diff --git a/dspace-api/src/test/java/org/dspace/content/VersioningTest.java b/dspace-api/src/test/java/org/dspace/content/VersioningTest.java index 00ad114097..f66619f615 100644 --- a/dspace-api/src/test/java/org/dspace/content/VersioningTest.java +++ b/dspace-api/src/test/java/org/dspace/content/VersioningTest.java @@ -16,7 +16,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -47,7 +47,7 @@ import org.junit.Test; */ public class VersioningTest extends AbstractUnitTest { - private static final Logger log = Logger.getLogger(VersioningTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(VersioningTest.class); private String originalHandle; private Item originalItem; diff --git a/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java b/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java index 02a2953498..250ff35090 100644 --- a/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java +++ b/dspace-api/src/test/java/org/dspace/content/WorkspaceItemTest.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.UUID; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.factory.ContentServiceFactory; @@ -48,7 +48,7 @@ public class WorkspaceItemTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(WorkspaceItemTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(WorkspaceItemTest.class); /** * WorkspaceItem instance for the tests diff --git a/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java b/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java index 9ea23718b7..963da2bfab 100644 --- a/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java +++ b/dspace-api/src/test/java/org/dspace/content/packager/ITDSpaceAIP.java @@ -23,7 +23,7 @@ import java.util.Iterator; import java.util.List; import mockit.NonStrictExpectations; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; @@ -80,7 +80,7 @@ public class ITDSpaceAIP extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(ITDSpaceAIP.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ITDSpaceAIP.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java b/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java index a0b21f8221..c33c5d25d8 100644 --- a/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java +++ b/dspace-api/src/test/java/org/dspace/content/packager/PackageUtilsTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -44,7 +44,7 @@ import org.junit.Test; * for the University of Waikato's Institutional Research Repositories */ public class PackageUtilsTest extends AbstractUnitTest { - private static final Logger log = Logger.getLogger(PackageUtilsTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(PackageUtilsTest.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java new file mode 100644 index 0000000000..5761ee7ec7 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java @@ -0,0 +1,83 @@ +/** + * 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.curate; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.dspace.AbstractUnitTest; +import org.dspace.content.DSpaceObject; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.SiteService; +import org.dspace.services.ConfigurationService; +import org.junit.Test; + +/** + * + * @author mhwood + */ +public class CuratorTest + extends AbstractUnitTest { + private static final SiteService SITE_SERVICE = ContentServiceFactory.getInstance().getSiteService(); + + static final String RUN_PARAMETER_NAME = "runParameter"; + static final String RUN_PARAMETER_VALUE = "a parameter"; + static final String TASK_PROPERTY_NAME = "taskProperty"; + static final String TASK_PROPERTY_VALUE = "a property"; + + /** Value of a known runtime parameter, if any. */ + static String runParameter; + + /** Value of a known task property, if any. */ + static String taskProperty; + + /** + * Test of curate method, of class Curator. + * Currently this just tests task properties and run parameters. + * @throws java.lang.Exception passed through. + */ + @Test + public void testCurate_DSpaceObject() + throws Exception { + System.out.println("curate"); + + final String TASK_NAME = "dummyTask"; + + // Configure the task to be run. + ConfigurationService cfg = kernelImpl.getConfigurationService(); + cfg.setProperty("plugin.named.org.dspace.curate.CurationTask", + DummyTask.class.getName() + " = " + TASK_NAME); + cfg.setProperty(TASK_NAME + '.' + TASK_PROPERTY_NAME, TASK_PROPERTY_VALUE); + + // Get and configure a Curator. + Curator instance = new Curator(); + instance.setReporter("-"); // Send any report to standard out. FIXME when DS-3989 is merged + instance.addTask(TASK_NAME); + + // Configure the run. + Map parameters = new HashMap<>(); + parameters.put(RUN_PARAMETER_NAME, RUN_PARAMETER_VALUE); + instance.addParameters(parameters); + + // Curate the site. + DSpaceObject dso = SITE_SERVICE.findSite(context); + instance.curate(context, dso); + + // Check the result. + System.out.format("Task %s result was '%s'%n", + TASK_NAME, instance.getResult(TASK_NAME)); + System.out.format("Task %s status was %d%n", + TASK_NAME, instance.getStatus(TASK_NAME)); + assertEquals("Unexpected task status", + Curator.CURATE_SUCCESS, instance.getStatus(TASK_NAME)); + assertEquals("Wrong run parameter", RUN_PARAMETER_VALUE, runParameter); + assertEquals("Wrong task property", TASK_PROPERTY_VALUE, taskProperty); + } +} diff --git a/dspace-api/src/test/java/org/dspace/curate/DummyTask.java b/dspace-api/src/test/java/org/dspace/curate/DummyTask.java new file mode 100644 index 0000000000..22492a1e16 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/curate/DummyTask.java @@ -0,0 +1,30 @@ +/** + * 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.curate; + +import java.io.IOException; + +import org.dspace.content.DSpaceObject; + +/** + * Makes no model changes, but records certain property values for inspection. + */ +public class DummyTask + extends AbstractCurationTask { + public DummyTask() { + // This constructor intentionally left blank. + } + + @Override + public int perform(DSpaceObject dso) + throws IOException { + CuratorTest.runParameter = taskProperty(CuratorTest.RUN_PARAMETER_NAME); + CuratorTest.taskProperty = taskProperty(CuratorTest.TASK_PROPERTY_NAME); + return Curator.CURATE_SUCCESS; + } +} diff --git a/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java b/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java index 5e5e9c0fcc..8950bfa409 100644 --- a/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java +++ b/dspace-api/src/test/java/org/dspace/eperson/EPersonTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.fail; import java.sql.SQLException; import org.apache.commons.codec.DecoderException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.core.Constants; @@ -28,7 +28,7 @@ import org.junit.Test; */ public class EPersonTest extends AbstractUnitTest { protected EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); - private static final Logger log = Logger.getLogger(EPersonTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(EPersonTest.class); public EPersonTest() { diff --git a/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java b/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java index 2dbd4c1428..d2cd08af72 100644 --- a/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java +++ b/dspace-api/src/test/java/org/dspace/eperson/GroupTest.java @@ -21,7 +21,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.eperson.factory.EPersonServiceFactory; @@ -38,7 +38,7 @@ import org.junit.Test; */ public class GroupTest extends AbstractUnitTest { - private static final Logger log = Logger.getLogger(GroupTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(GroupTest.class); //TODO: test duplicate names ? diff --git a/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java b/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java index 8285e2552d..1560a5d04c 100644 --- a/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java +++ b/dspace-api/src/test/java/org/dspace/handle/dao/impl/HandleDAOImplTest.java @@ -13,7 +13,7 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -46,7 +46,7 @@ public class HandleDAOImplTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(HandleDAOImplTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(HandleDAOImplTest.class); /** * Item instances for the tests diff --git a/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java b/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java index 51b0556401..c1c7b8ee7d 100644 --- a/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java +++ b/dspace-api/src/test/java/org/dspace/identifier/DOIIdentifierProviderTest.java @@ -21,8 +21,8 @@ import java.util.Date; import java.util.List; import java.util.Random; -import org.apache.commons.lang.ObjectUtils; -import org.apache.log4j.Logger; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Collection; @@ -58,7 +58,7 @@ public class DOIIdentifierProviderTest /** * log4j category */ - private static final Logger log = Logger.getLogger(DOIIdentifierProviderTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DOIIdentifierProviderTest.class); private static final String PREFIX = "10.5072"; private static final String NAMESPACE_SEPARATOR = "dspaceUnitTests-"; diff --git a/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java b/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java index 496620e941..038611fe80 100644 --- a/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java +++ b/dspace-api/src/test/java/org/dspace/identifier/EZIDIdentifierProviderTest.java @@ -466,7 +466,7 @@ public class EZIDIdentifierProviderTest PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); System.out.println(sw.toString()); - org.apache.log4j.Logger.getLogger(EZIDIdentifierProviderTest.class).fatal("Caught NPE", ex); + org.apache.logging.log4j.LogManager.getLogger(EZIDIdentifierProviderTest.class).fatal("Caught NPE", ex); throw ex; } } diff --git a/dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java b/dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java new file mode 100644 index 0000000000..42c78944e1 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/service/impl/ClientInfoServiceImplTest.java @@ -0,0 +1,165 @@ +/** + * 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.service.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.dspace.AbstractDSpaceTest; +import org.dspace.service.ClientInfoService; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +import org.dspace.statistics.util.DummyHttpServletRequest; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +/** + * Unit test class for the {@link ClientInfoServiceImpl} class which implements + * the {@link ClientInfoService} interface + * + * @author tom dot desair at gmail dot com + */ +@RunWith(MockitoJUnitRunner.class) +public class ClientInfoServiceImplTest extends AbstractDSpaceTest { + + private ClientInfoService clientInfoService; + + private ConfigurationService configurationService; + + @Before + public void init() { + configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + } + + @Test + public void getClientIpFromRequest() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "127.0.0"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + DummyHttpServletRequest req = new DummyHttpServletRequest(); + req.setAddress("127.0.0.1"); + req.addHeader("X-Forwarded-For", "192.168.1.24"); + + assertEquals("192.168.1.24", clientInfoService.getClientIp(req)); + } + + @Test + public void getClientIpWithTrustedProxy() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "127.0.0"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "192.168.1.24"; + + assertEquals("192.168.1.24", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + + @Test + public void getClientIpWithUntrustedProxy() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "192.168.1.1"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "10.24.64.14"; + String xForwardedFor = "192.168.1.24"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + @Test + public void getClientIpWithMultipleTrustedProxies() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", "127.0.0,192.168.1"); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "10.24.64.14,192.168.1.24"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + xForwardedFor = "192.168.1.24,10.24.64.14"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + @Test + public void getClientIpWithoutTrustedProxies() { + configurationService.setProperty("useProxies", true); + configurationService.setProperty("proxies.trusted.ipranges", ""); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "10.24.64.14"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + xForwardedFor = "127.0.0.1,10.24.64.14"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + xForwardedFor = "10.24.64.14,127.0.0.1"; + + assertEquals("10.24.64.14", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + } + + @Test + public void getClientIpWithoutUseProxies() { + configurationService.setProperty("useProxies", false); + configurationService.setProperty("proxies.trusted.ipranges", ""); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + String remoteIp = "127.0.0.1"; + String xForwardedFor = "10.24.64.14"; + + assertEquals("127.0.0.1", + clientInfoService.getClientIp(remoteIp, xForwardedFor)); + + assertEquals("127.0.0.1", + clientInfoService.getClientIp(remoteIp, null)); + + assertEquals("127.0.0.1", + clientInfoService.getClientIp(remoteIp, "")); + } + + @Test + public void isUseProxiesEnabledTrue() { + configurationService.setProperty("useProxies", true); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + assertTrue(clientInfoService.isUseProxiesEnabled()); + } + + @Test + public void isUseProxiesEnabledFalse() { + configurationService.setProperty("useProxies", false); + + clientInfoService = new ClientInfoServiceImpl(configurationService); + + assertFalse(clientInfoService.isUseProxiesEnabled()); + } +} \ No newline at end of file diff --git a/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java b/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java index 9716fc8892..0c02c0a100 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java @@ -38,7 +38,6 @@ public class MockSolrLoggerServiceImpl File locationDb = new File(locationDbPath); locationDb.createNewFile(); locationService = new DatabaseReader.Builder(locationDb).build(); - useProxies = configurationService.getBooleanProperty("useProxies"); } } diff --git a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java index 447e2c7728..b255db3e04 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/util/DummyHttpServletRequest.java @@ -10,29 +10,47 @@ package org.dspace.statistics.util; import java.io.BufferedReader; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.security.Principal; +import java.util.Collection; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; import java.util.Locale; import java.util.Map; +import javax.servlet.AsyncContext; +import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; import javax.servlet.ServletInputStream; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import javax.servlet.http.HttpUpgradeHandler; +import javax.servlet.http.Part; + +import org.apache.commons.collections.CollectionUtils; +import org.dspace.core.Utils; /** * A mock request for testing. * * @author mwood */ -class DummyHttpServletRequest implements HttpServletRequest { +public class DummyHttpServletRequest implements HttpServletRequest { private String agent = null; private String address = null; private String remoteHost = null; + private Map> headers = new HashMap<>(); + public void setAgent(String agent) { this.agent = agent; } @@ -45,6 +63,15 @@ class DummyHttpServletRequest implements HttpServletRequest { this.remoteHost = host; } + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#changeSessionId + */ + @Override + public String changeSessionId() { + // TODO Auto-generated method stub + return null; + } + /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#getAuthType() */ @@ -81,6 +108,24 @@ class DummyHttpServletRequest implements HttpServletRequest { return 0; } + /** + * Add a request header to this dummy request + * @param headerName The name of the header to add + * @param headerValue The value of the header + */ + public void addHeader(String headerName, String headerValue) { + List values = headers.computeIfAbsent(headerName, k -> new LinkedList<>()); + values.add(headerValue); + } + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#getDispatcherType() + */ + @Override + public DispatcherType getDispatcherType() { + // TODO Auto-generated method stub + return null; + } + /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String) */ @@ -89,7 +134,7 @@ class DummyHttpServletRequest implements HttpServletRequest { if ("User-Agent".equals(key)) { return agent; } else { - return null; + return CollectionUtils.isEmpty(headers.get(key)) ? null : headers.get(key).get(0); } } @@ -98,8 +143,7 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public Enumeration getHeaderNames() { - // TODO Auto-generated method stub - return null; + return Collections.enumeration(headers.keySet()); } /* (non-Javadoc) @@ -107,8 +151,7 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public Enumeration getHeaders(String arg0) { - // TODO Auto-generated method stub - return null; + return Collections.enumeration(Utils.emptyIfNull(headers.get(arg0))); } /* (non-Javadoc) @@ -116,8 +159,7 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public int getIntHeader(String arg0) { - // TODO Auto-generated method stub - return 0; + return headers.containsKey(arg0) ? Integer.parseInt(getHeader(arg0)) : -1; } /* (non-Javadoc) @@ -255,6 +297,55 @@ class DummyHttpServletRequest implements HttpServletRequest { return false; } + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#authenticate(javax.servlet.http.HttpServletResponse) + */ + @Override + public boolean authenticate(HttpServletResponse httpServletResponse) { + return false; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#login(java.lang.String,java.lang.String) + */ + @Override + public void login(String s, String s1) { + return; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#logout() + */ + @Override + public void logout() { + return; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#getPart(java.lang.String) + */ + @Override + public Part getPart(String arg0) { + // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#getParts() + */ + @Override + public Collection getParts() { + return null; + } + + /* (non-Javadoc) + * @see javax.servlet.http.HttpServletRequest#upgrade(java.lang.Class) + */ + @Override + public T upgrade(Class aClass) throws IOException, ServletException { + return null; + } + /* (non-Javadoc) * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid() */ @@ -309,6 +400,14 @@ class DummyHttpServletRequest implements HttpServletRequest { return 0; } + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#getContentLengthLong() + */ + @Override + public long getContentLengthLong() { + return 0; + } + /* (non-Javadoc) * @see javax.servlet.ServletRequest#getContentType() */ @@ -490,10 +589,51 @@ class DummyHttpServletRequest implements HttpServletRequest { */ @Override public void setCharacterEncoding(String arg0) - throws UnsupportedEncodingException { + throws UnsupportedOperationException { throw new UnsupportedOperationException("Not supported yet."); } + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#startAsync + */ + @Override + public AsyncContext startAsync() throws IllegalStateException { + throw new IllegalStateException("Not supported yet."); + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#startAsync(javax.servlet.ServletRequest,javax.servlet.ServletResponse) + */ + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) + throws IllegalStateException { + throw new IllegalStateException("Not supported yet."); + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#isAsyncStarted + */ + @Override + public boolean isAsyncStarted() { + return false; + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#isAsyncSupported + */ + @Override + public boolean isAsyncSupported() { + return false; + } + + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#getAsyncContext + */ + @Override + public AsyncContext getAsyncContext() { + return null; + } + @Override public int getRemotePort() { throw new UnsupportedOperationException("Not supported yet."); @@ -514,4 +654,12 @@ class DummyHttpServletRequest implements HttpServletRequest { throw new UnsupportedOperationException("Not supported yet."); } + /* (non-Javadoc) + * @see javax.servlet.ServletRequest#getServletContext + */ + @Override + public ServletContext getServletContext() { + return null; + } + } diff --git a/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java b/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java index 5566562580..6abda2b13e 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java +++ b/dspace-api/src/test/java/org/dspace/statistics/util/SpiderDetectorServiceImplTest.java @@ -13,6 +13,8 @@ import static org.junit.Assert.assertTrue; import mockit.Mock; import mockit.MockUp; import org.dspace.AbstractDSpaceTest; +import org.dspace.core.factory.CoreServiceFactory; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.statistics.SolrLoggerServiceImpl; @@ -32,14 +34,15 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { private ConfigurationService configurationService; + private ClientInfoService clientInfoService; private SpiderDetectorService spiderDetectorService; @Before public void init() { configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); - + clientInfoService = CoreServiceFactory.getInstance().getClientInfoService(); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); } @Test @@ -60,7 +63,7 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { @Test public void testCaseInsensitiveMatching() throws Exception { configurationService.setProperty("usage-statistics.bots.case-insensitive", true); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); DummyHttpServletRequest req = new DummyHttpServletRequest(); req.setAddress(NOT_A_BOT_ADDRESS); // avoid surprises @@ -265,7 +268,7 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { public void testBothLowerAndUpperCaseGetMatched() { configurationService.setProperty("usage-statistics.bots.case-insensitive", true); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); DummyHttpServletRequest req = new DummyHttpServletRequest(); req.setAddress(NOT_A_BOT_ADDRESS); // avoid surprises @@ -297,7 +300,7 @@ public class SpiderDetectorServiceImplTest extends AbstractDSpaceTest { @Test public void testNonBooleanConfig() { configurationService.setProperty("usage-statistics.bots.case-insensitive", "RandomNonBooleanString"); - spiderDetectorService = new SpiderDetectorServiceImpl(configurationService); + spiderDetectorService = new SpiderDetectorServiceImpl(configurationService, clientInfoService); DummyHttpServletRequest req = new DummyHttpServletRequest(); req.setAddress(NOT_A_BOT_ADDRESS); // avoid surprises diff --git a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java index 1bf2bc1ba8..e38f153d8f 100644 --- a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java +++ b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationIT.java @@ -12,7 +12,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractDSpaceTest; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; @@ -62,7 +62,7 @@ public class BasicWorkflowAuthorizationIT /** * log4j category */ - private static final Logger log = Logger.getLogger(BasicWorkflowAuthorizationIT.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowAuthorizationIT.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java index cdaf38077d..83647738ea 100644 --- a/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java +++ b/dspace-api/src/test/java/org/dspace/workflowbasic/BasicWorkflowAuthorizationRolesIT.java @@ -17,7 +17,7 @@ import java.util.Date; import java.util.HashMap; import java.util.UUID; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.AbstractDSpaceTest; import org.dspace.AbstractIntegrationTest; import org.dspace.authorize.AuthorizeException; @@ -65,7 +65,7 @@ public class BasicWorkflowAuthorizationRolesIT /** * log4j category */ - private static final Logger log = Logger.getLogger(BasicWorkflowAuthorizationIT.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicWorkflowAuthorizationIT.class); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-api/src/test/resources/log4j.properties b/dspace-api/src/test/resources/log4j.properties index 93a4ec7ff5..4e7fbff3e3 100644 --- a/dspace-api/src/test/resources/log4j.properties +++ b/dspace-api/src/test/resources/log4j.properties @@ -19,10 +19,10 @@ log4j.rootCategory=INFO, A1 # A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n # block passwords from being exposed in Axis logs. @@ -44,9 +44,9 @@ log4j.logger.org.dspace.servicemanager=ERROR log4j.logger.org.dspace.providers=ERROR log4j.logger.org.dspace.utils=ERROR -log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # # Root logger option diff --git a/dspace-oai/pom.xml b/dspace-oai/pom.xml index 77472986e4..9a66c4c86a 100644 --- a/dspace-oai/pom.xml +++ b/dspace-oai/pom.xml @@ -16,7 +16,6 @@ ${basedir}/.. - 3.2.5.RELEASE 3.2.10 2.0.1 @@ -81,8 +80,8 @@ commons-io - commons-lang - commons-lang + org.apache.commons + commons-lang3 @@ -107,7 +106,15 @@ org.apache.commons commons-lang3 - + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + @@ -144,10 +151,6 @@ jtwig-spring ${jtwig.version} - - org.ow2.asm - asm - com.google.guava guava @@ -160,6 +163,18 @@ org.apache.commons commons-lang3 + + javax.servlet + servlet-api + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + @@ -185,18 +200,26 @@ javax.servlet - servlet-api + javax.servlet-api provided - 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-impl runtime @@ -224,10 +247,12 @@ junit test + + org.hamcrest hamcrest-all - test + compile org.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..eae538b50b 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; @@ -326,7 +326,7 @@ public class XOAI { List dates = new LinkedList(); List policies = authorizeService.getPoliciesActionFilter(context, item, Constants.READ); for (ResourcePolicy policy : policies) { - if (policy.getGroup().getName().equals("Anonymous")) { + if ((policy.getGroup() != null) && (policy.getGroup().getName().equals("Anonymous"))) { if (policy.getStartDate() != null) { dates.add(policy.getStartDate()); } @@ -450,8 +450,7 @@ public class XOAI { private boolean willChangeStatus(Item item) throws SQLException { List policies = authorizeService.getPoliciesActionFilter(context, item, Constants.READ); for (ResourcePolicy policy : policies) { - if (policy.getGroup().getName().equals("Anonymous")) { - + if ((policy.getGroup() != null) && (policy.getGroup().getName().equals("Anonymous"))) { if (policy.getStartDate() != null && policy.getStartDate().after(new Date())) { return true; } 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-databind com.fasterxml.jackson.core + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + pom @@ -64,16 +76,26 @@ javax.servlet - servlet-api + javax.servlet-api provided + - 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.request org.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.servlet javax.servlet-api - 3.1.0 provided @@ -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.dspace dspace-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-api provided @@ -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 + *

+ * See: https://stackoverflow.com/a/36718301/3750035 + *

+ * 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-xml org.eclipse.jetty + + org.apache.zookeeper + zookeeper + + + log4j + log4j + @@ -224,6 +232,10 @@ jetty-xml org.eclipse.jetty + + log4j + log4j + org.apache.zookeeper zookeeper @@ -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-logging commons-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}/solr java.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 - - Zookeeper org.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.boot spring-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.boot spring-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 c09cebfde6..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; @@ -27,6 +27,7 @@ import org.dspace.content.BitstreamFormat; import org.dspace.content.service.BitstreamService; import org.dspace.core.Context; import org.dspace.disseminate.service.CitationDocumentService; +import org.dspace.services.ConfigurationService; import org.dspace.services.EventService; import org.dspace.usage.UsageEvent; import org.springframework.beans.factory.annotation.Autowired; @@ -56,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; @@ -70,6 +72,9 @@ public class BitstreamContentRestController { @Autowired private CitationDocumentService citationDocumentService; + @Autowired + private ConfigurationService configurationService; + @PreAuthorize("hasPermission(#uuid, 'BITSTREAM', 'READ')") @RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD}) public void retrieve(@PathVariable UUID uuid, HttpServletResponse response, @@ -104,6 +109,12 @@ public class BitstreamContentRestController { .with(request) .with(response); + //Determine if we need to send the file as a download or if the browser can open it inline + long dispositionThreshold = configurationService.getLongProperty("webui.content_disposition_threshold"); + if (dispositionThreshold >= 0 && bitstreamTuple.getRight() > dispositionThreshold) { + sender.withDisposition(MultipartFileSender.CONTENT_DISPOSITION_ATTACHMENT); + } + if (sender.isNoRangeRequest() && isNotAnErrorResponse(response)) { //We only log a download request when serving a request without Range header. This is because //a browser always sends a regular request first to check for Range support. 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..4afde3df07 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,9 @@ 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.LogManager; +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; @@ -27,7 +28,6 @@ import org.dspace.app.rest.model.hateoas.SearchResultsResource; import org.dspace.app.rest.model.hateoas.SearchSupportResource; import org.dspace.app.rest.parameter.SearchFilter; import org.dspace.app.rest.repository.DiscoveryRestRepository; -import org.dspace.app.rest.utils.ScopeResolver; import org.dspace.app.rest.utils.Utils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -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 = LogManager.getLogger(); @Autowired protected Utils utils; @@ -109,7 +109,7 @@ public class DiscoveryRestController implements InitializingBean { log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope) + ", configuration name: " + StringUtils.trimToEmpty(configurationName) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) - + ", query: " + StringUtils.trimToEmpty(dsoType) + + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters)); } @@ -136,13 +136,14 @@ public class DiscoveryRestController implements InitializingBean { log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope) + ", configuration name: " + StringUtils.trimToEmpty(configurationName) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) - + ", query: " + StringUtils.trimToEmpty(dsoType) + + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters) + ", page: " + Objects.toString(page)); } //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 @@ -181,7 +182,7 @@ public class DiscoveryRestController implements InitializingBean { log.trace("Facetting on facet " + facetName + " with scope: " + StringUtils.trimToEmpty(dsoScope) + ", dsoType: " + StringUtils.trimToEmpty(dsoType) + ", prefix: " + StringUtils.trimToEmpty(prefix) - + ", query: " + StringUtils.trimToEmpty(dsoType) + + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters) + ", page: " + Objects.toString(page)); } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java new file mode 100644 index 0000000000..ebba89fff9 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/OpenSearchController.java @@ -0,0 +1,243 @@ +/** + * 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; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.log4j.Logger; + +import org.dspace.app.rest.utils.ContextUtil; +import org.dspace.app.rest.utils.ScopeResolver; +import org.dspace.app.util.SyndicationFeed; +import org.dspace.app.util.factory.UtilServiceFactory; +import org.dspace.app.util.service.OpenSearchService; +import org.dspace.authorize.factory.AuthorizeServiceFactory; +import org.dspace.authorize.service.AuthorizeService; +import org.dspace.content.DSpaceObject; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.CollectionService; +import org.dspace.content.service.CommunityService; +import org.dspace.core.Context; +import org.dspace.core.LogManager; +import org.dspace.discovery.DiscoverQuery; +import org.dspace.discovery.DiscoverResult; +import org.dspace.discovery.SearchServiceException; +import org.dspace.discovery.SearchUtils; +import org.dspace.discovery.configuration.DiscoveryConfiguration; +import org.dspace.discovery.configuration.DiscoverySearchFilter; + +import org.springframework.boot.autoconfigure.web.ErrorController; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import org.w3c.dom.Document; + +/** + * This class provides a controller for OpenSearch support. + * It creates a namespace /opensearch in the DSpace REST webapp. + * + * @author Oliver Goldschmidt (o.goldschmidt at tuhh.de) + */ +@Controller +@RequestMapping("/opensearch") +public class OpenSearchController implements ErrorController { + + private static final Logger log = Logger.getLogger(ScopeResolver.class); + private static final String errorpath = "/error"; + private List searchIndices = null; + + private CommunityService communityService; + private CollectionService collectionService; + private AuthorizeService authorizeService; + private OpenSearchService openSearchService; + + private Context context; + + /** + * This method provides the OpenSearch query on the path /search + * It will pass the result as a OpenSearchDocument directly to the client + */ + @GetMapping("/search") + public void search(HttpServletRequest request, + HttpServletResponse response, + @RequestParam(name = "query", required = false) String query, + @RequestParam(name = "start", required = false) Integer start, + @RequestParam(name = "rpp", required = false) Integer count, + @RequestParam(name = "format", required = false) String format, + Model model) throws IOException, ServletException { + context = ContextUtil.obtainContext(request); + if (start == null) { + start = 0; + } + if (count == null) { + count = -1; + } + if (openSearchService == null) { + openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + } + if (openSearchService.isEnabled()) { + init(); + // get enough request parameters to decide on action to take + if (format == null || "".equals(format)) { + // default to atom + format = "atom"; + } + + log.debug("Searching for " + query + " in format " + format); + + // do some sanity checking + if (!openSearchService.getFormats().contains(format)) { + String err = "Format " + format + " is not supported."; + response.setContentType("text/html"); + response.setContentLength(err.length()); + response.getWriter().write(err); + } + + // then the rest - we are processing the query + DSpaceObject container = null; + + // support pagination parameters + DiscoverQuery queryArgs = new DiscoverQuery(); + queryArgs.setQuery(query); + queryArgs.setStart(start); + queryArgs.setMaxResults(count); + + // Perform the search + DiscoverResult qResults = null; + try { + qResults = SearchUtils.getSearchService().search(context, + container, queryArgs); + } catch (SearchServiceException e) { + log.error( + LogManager.getHeader(context, "opensearch", "query=" + + queryArgs.getQuery() + + ",error=" + e.getMessage()), e); + throw new RuntimeException(e.getMessage(), e); + } + + // Log + log.info("opensearch done, query=\"" + query + "\",results=" + + qResults.getTotalSearchResults()); + + // format and return results + Map labelMap = getLabels(request); + List dsoResults = qResults.getDspaceObjects(); + Document resultsDoc = openSearchService.getResultsDoc(context, format, query, + (int) qResults.getTotalSearchResults(), qResults.getStart(), + qResults.getMaxResults(), container, dsoResults, labelMap); + try { + Transformer xf = TransformerFactory.newInstance().newTransformer(); + response.setContentType(openSearchService.getContentType(format)); + xf.transform(new DOMSource(resultsDoc), + new StreamResult(response.getWriter())); + } catch (TransformerException e) { + log.error(e); + throw new ServletException(e.toString()); + } + } else { + log.debug("OpenSearch Service is disabled"); + String err = "OpenSearch Service is disabled"; + response.setStatus(404); + response.setContentType("text/html"); + response.setContentLength(err.length()); + response.getWriter().write(err); + } + } + + /** + * This method provides the OpenSearch servicedescription document on the path /service + * It will pass the result as a OpenSearchDocument directly to the client + */ + @GetMapping("/service") + public void service(HttpServletRequest request, + HttpServletResponse response) throws IOException { + log.debug("Show OpenSearch Service document"); + if (openSearchService == null) { + openSearchService = UtilServiceFactory.getInstance().getOpenSearchService(); + } + if (openSearchService.isEnabled()) { + String svcDescrip = openSearchService.getDescription(null); + log.debug("opensearchdescription is " + svcDescrip); + response.setContentType(openSearchService + .getContentType("opensearchdescription")); + response.setContentLength(svcDescrip.length()); + response.getWriter().write(svcDescrip); + } else { + log.debug("OpenSearch Service is disabled"); + String err = "OpenSearch Service is disabled"; + response.setStatus(404); + response.setContentType("text/html"); + response.setContentLength(err.length()); + response.getWriter().write(err); + } + } + + @RequestMapping(value = errorpath) + public String error() { + return "Error handling"; + } + + @Override + public String getErrorPath() { + return errorpath; + } + + /** + * Internal method for controller initialization + */ + private void init() { + if (searchIndices == null) { + searchIndices = new ArrayList(); + DiscoveryConfiguration discoveryConfiguration = SearchUtils + .getDiscoveryConfiguration(); + searchIndices.add("any"); + for (DiscoverySearchFilter sFilter : discoveryConfiguration.getSearchFilters()) { + searchIndices.add(sFilter.getIndexFieldName()); + } + } + communityService = ContentServiceFactory.getInstance().getCommunityService(); + collectionService = ContentServiceFactory.getInstance().getCollectionService(); + authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); + } + + public void setOpenSearchService(OpenSearchService oSS) { + openSearchService = oSS; + } + + + /** + * Internal method to get labels for the returned document + */ + private Map getLabels(HttpServletRequest request) { + // TODO: get strings from translation file or configuration + Map labelMap = new HashMap(); + labelMap.put(SyndicationFeed.MSG_UNTITLED, "notitle"); + labelMap.put(SyndicationFeed.MSG_LOGO_TITLE, "logo.title"); + labelMap.put(SyndicationFeed.MSG_FEED_DESCRIPTION, "general-feed.description"); + labelMap.put(SyndicationFeed.MSG_UITYPE, SyndicationFeed.UITYPE_JSPUI); + for (String selector : SyndicationFeed.getDescriptionSelectors()) { + labelMap.put("metadata." + selector, selector); + } + return labelMap; + } +} 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 bfd5296e22..51d146ec43 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; @@ -678,8 +725,16 @@ public class RestResourceController implements InitializingBean { if (Page.class.isAssignableFrom(linkMethod.getReturnType())) { Page pageResult = (Page) linkMethod .invoke(linkRepository, request, uuid, page, projection); - Link link = linkTo(this.getClass(), apiCategory, model).slash(uuid).slash(subpath) - .withSelfRel(); + + Link link = null; + String querystring = request.getQueryString(); + if (querystring != null && querystring.length() > 0) { + link = linkTo(this.getClass(), apiCategory, model).slash(uuid) + .slash(subpath + '?' + querystring).withSelfRel(); + } else { + link = linkTo(this.getClass(), apiCategory, model).slash(uuid).withSelfRel(); + } + Page halResources = pageResult.map(linkRepository::wrapResource); halResources.forEach(linkService::addLinks); @@ -736,8 +791,9 @@ public class RestResourceController implements InitializingBean { EmbeddedPage ep = (EmbeddedPage) resource.getEmbeddedResources().get(rel); List 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()); @@ -759,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); } @@ -877,11 +932,7 @@ public class RestResourceController implements InitializingBean { result = assembler.toResource(resources, link); } else { if (searchResult == null) { - try { - response.sendError(HttpServletResponse.SC_NOT_FOUND); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } + response.setStatus(HttpServletResponse.SC_NO_CONTENT); return null; } DSpaceResource dsResource = repository.wrapResource((T) searchResult); 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/DiscoverResultConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java index f148d4cc64..45470c3e8e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java @@ -12,7 +12,7 @@ import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.rest.converter.query.SearchQueryConverter; import org.dspace.app.rest.model.DSpaceObjectRest; 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/WorkflowItemConverter.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkflowItemConverter.java index 56f628f29e..94bc408602 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkflowItemConverter.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/converter/WorkflowItemConverter.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.converter; import java.sql.SQLException; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.dspace.app.rest.model.ErrorRest; import org.dspace.app.rest.model.SubmissionDefinitionRest; 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 4b8bcd9700..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; @@ -37,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; @@ -85,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); @@ -108,6 +112,7 @@ public class WorkspaceItemConverter (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)); 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/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/BrowseEntryLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java index 52fe6a894b..998c5eb8bd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseEntryLinkRepository.java @@ -61,8 +61,11 @@ public class BrowseEntryLinkRepository extends AbstractDSpaceRestRepository // FIXME this should be bind automatically and available as method // argument String scope = null; + String startsWith = null; + if (request != null) { scope = request.getParameter("scope"); + startsWith = request.getParameter("startsWith"); } @@ -103,7 +106,7 @@ public class BrowseEntryLinkRepository extends AbstractDSpaceRestRepository // bs.setJumpToItem(focus); // bs.setJumpToValue(valueFocus); // bs.setJumpToValueLang(valueFocusLang); - // bs.setStartsWith(startsWith); + bs.setStartsWith(startsWith); if (pageable != null) { bs.setOffset(pageable.getOffset()); bs.setResultsPerPage(pageable.getPageSize()); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java index 348e24152d..243100983e 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/BrowseItemLinkRepository.java @@ -61,11 +61,13 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository String scope = null; String filterValue = null; String filterAuthority = null; + String startsWith = null; if (request != null) { scope = request.getParameter("scope"); filterValue = request.getParameter("filterValue"); filterAuthority = request.getParameter("filterAuthority"); + startsWith = request.getParameter("startsWith"); } Context context = obtainContext(); BrowseEngine be = new BrowseEngine(context); @@ -128,7 +130,7 @@ public class BrowseItemLinkRepository extends AbstractDSpaceRestRepository // bs.setJumpToItem(focus); // bs.setJumpToValue(valueFocus); // bs.setJumpToValueLang(valueFocusLang); - // bs.setStartsWith(startsWith); + bs.setStartsWith(startsWith); if (pageable != null) { bs.setOffset(pageable.getOffset()); bs.setResultsPerPage(pageable.getPageSize()); 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: @@ -68,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 { @@ -122,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 { @@ -174,16 +272,58 @@ public abstract class DSpaceRestRepository upload(HttpServletRequest request, MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { Context context = obtainContext(); @@ -224,9 +399,24 @@ public abstract class DSpaceRestRepository upload(Context context, HttpServletRequest request, MultipartFile uploadfile) + /** + * 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 RuntimeException("No implementation found; Method not allowed!"); + 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..ec73a24e2c 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,10 @@ 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.LogManager; +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 +49,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 = LogManager.getLogger(); @Autowired private DiscoveryConfigurationService searchConfigurationService; @@ -91,7 +94,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 +111,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 upload(Context context, HttpServletRequest request, MultipartFile uploadfile) + public Iterable upload(Context context, HttpServletRequest request, + MultipartFile uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { File file = Utils.getFile(uploadfile, "upload-loader", "filedataloader"); List results = new ArrayList<>(); @@ -360,7 +363,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository 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(); @@ -383,7 +393,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository()); log.debug("BTE transformation is about to start!"); - transformationEngine1.transform(new TransformationSpec()); + transformationEngine1.transform(spec); log.debug("BTE transformation finished!"); tmpResult.addAll(outputGenerator.getDtoList()); if (!tmpResult.isEmpty()) { @@ -417,7 +427,7 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository { /** - * 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. + *

+ * Example: + * curl -X PATCH http://${dspace.url}/api/item/<:id-item> -H " + * Content-Type: application/json" -d '[{ "op": "replace", "path": " + * /withdrawn", "value": true|false]' + * + * + * @author Michael Spalti + */ +@Component +public class ItemWithdrawReplaceOperation extends ReplacePatchOperation { + + private static final Logger log = Logger.getLogger(ItemWithdrawReplaceOperation.class); + + @Override + public ItemRest replace(ItemRest item, Operation operation) { + + Boolean withdraw = getBooleanOperationValue(operation.getValue()); + + // This is a request to withdraw the item. + if (withdraw) { + // The item is currently not withdrawn and also not archived. Is this a possible situation? + if (!item.getWithdrawn() && !item.getInArchive()) { + throw new UnprocessableEntityException("Cannot withdraw item when it is not in archive."); + } + // Item is already withdrawn. No-op, 200 response. + // (The operation is not idempotent since it results in a provenance note in the record.) + if (item.getWithdrawn()) { + return item; + } + item.setWithdrawn(true); + return 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 (!item.getWithdrawn()) { + return item; + } + item.setWithdrawn(false); + return item; + } + + + } + + @Override + void checkModelForExistingValue(ItemRest resource) { + if ((Object) resource.getWithdrawn() == 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/PatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java new file mode 100644 index 0000000000..baf1bca9c8 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/PatchOperation.java @@ -0,0 +1,115 @@ +/** + * 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 java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.BooleanUtils; +import org.dspace.app.rest.exception.PatchBadRequestException; +import org.dspace.app.rest.model.RestModel; +import org.dspace.app.rest.model.patch.Operation; +import org.springframework.data.rest.webmvc.json.patch.LateObjectEvaluator; + +/** + * Base class for all resource patch operations. + * + * @author Michael Spalti + */ +public abstract class PatchOperation + implements ResourcePatchOperation { + + /** + * Updates the rest model by applying the patch operation. + * + * @param resource the rest model. + * @param operation the patch operation. + * @return the updated rest model. + * @throws PatchBadRequestException + */ + public abstract R perform(R resource, Operation operation); + + /** + * Throws PatchBadRequestException for missing operation value. + * + * @param value the value to test + */ + void checkOperationValue(Object value) { + if (value == null) { + throw new PatchBadRequestException("No value provided for the operation."); + } + } + + /** + * Allows clients to use either a boolean or a string representation of boolean value. + * + * @param value the operation value + * @return the original or derived boolean value + * @throws PatchBadRequestException + */ + Boolean getBooleanOperationValue(Object value) { + Boolean bool; + + if (value instanceof String) { + bool = BooleanUtils.toBooleanObject((String) value); + if (bool == null) { + // make sure the string was converted to boolean. + throw new PatchBadRequestException("Boolean value not provided."); + } + } else { + bool = (Boolean) value; + } + return bool; + } + + // This is duplicated code (see org.dspace.app.rest.submit.factory.impl.PatchOperation) + // If it stays here, it should be DRY. Current patch resource patch operations do not + // use these methods since operation values are either strings or booleans. + // These methods handle JsonValueEvaluator instances for json objects and arrays, + // as returned by the JsonPatchConverter. A complete implementation of the PatchOperation + // class will need these methods. + public List evaluateArrayObject(LateObjectEvaluator value) { + List results = new ArrayList(); + T[] list = null; + if (value != null) { + LateObjectEvaluator object = (LateObjectEvaluator) value; + list = (T[]) object.evaluate(getArrayClassForEvaluation()); + } + + for (T t : list) { + results.add(t); + } + return results; + } + + public T evaluateSingleObject(LateObjectEvaluator value) { + T single = null; + if (value != null) { + LateObjectEvaluator object = (LateObjectEvaluator) value; + single = (T) object.evaluate(getClassForEvaluation()); + } + return single; + } + + /** + * This method should return the typed array to be used in the + * LateObjectEvaluator evaluation of json arrays. + * + * @return + */ + protected abstract Class getArrayClassForEvaluation(); + + /** + * This method should return the object type to be used in the + * LateObjectEvaluator evaluation of json objects. + * + * @return + */ + protected abstract Class getClassForEvaluation(); + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java new file mode 100644 index 0000000000..64a1615437 --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ReplacePatchOperation.java @@ -0,0 +1,64 @@ +/** + * 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.exception.UnprocessableEntityException; +import org.dspace.app.rest.model.RestModel; +import org.dspace.app.rest.model.patch.Operation; + +/** + * Base class for replace patch operations. + * + * @author Michael Spalti + */ +public abstract class ReplacePatchOperation + extends PatchOperation { + + /** + * Implements the patch operation for replace operations. + * Before performing the replace operation this method checks + * for a non-null operation value and a non-null value on the rest model + * (replace operations should only be applied to an existing value). + * @param resource the rest model. + * @param operation the replace patch operation. + * @return the updated rest model. + * @throws PatchBadRequestException + * @throws UnprocessableEntityException + */ + @Override + public R perform(R resource, Operation operation) { + + checkOperationValue(operation.getValue()); + checkModelForExistingValue(resource); + return replace(resource, operation); + + } + + /** + * Executes the replace patch operation. + * + * @param resource the rest model. + * @param operation the replace patch operation. + * @return the updated rest model. + * @throws PatchBadRequestException + * @throws UnprocessableEntityException + */ + abstract R replace(R resource, Operation operation); + + /** + * Replace operations are not allowed on non-existent values. + * Null values may exist in the RestModel for certain fields + * (usually non-boolean). This method should be implemented + * to assure that the replace operation acts only on an existing value. + * @param resource the rest model. + * @throws PatchBadRequestException + */ + abstract void checkModelForExistingValue(R resource); + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java new file mode 100644 index 0000000000..dc531b40fe --- /dev/null +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/repository/patch/factories/impl/ResourcePatchOperation.java @@ -0,0 +1,23 @@ +/** + * 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.RestModel; +import org.dspace.app.rest.model.patch.Operation; + +/** + * The patch interface used by repository classes. + * @param + */ +public interface ResourcePatchOperation { + + R perform(R resource, Operation operation) + throws PatchBadRequestException; + +} diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java index 15f73b1be6..50801bf13b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenHandler.java @@ -38,6 +38,7 @@ import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.eperson.service.EPersonService; +import org.dspace.service.ClientInfoService; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +72,9 @@ public class JWTTokenHandler implements InitializingBean { @Autowired private EPersonService ePersonService; + @Autowired + private ClientInfoService clientInfoService; + private String jwtKey; private long expirationTime; private boolean includeIP; @@ -276,11 +280,7 @@ public class JWTTokenHandler implements InitializingBean { } private String getIpAddress(HttpServletRequest request) { - String ipAddress = request.getHeader("X-FORWARDED-FOR"); - if (ipAddress == null) { - ipAddress = request.getRemoteAddr(); - } - return ipAddress; + return clientInfoService.getClientIp(request); } private EPerson updateSessionSalt(final Context context, final Date previousLoginDate) throws SQLException { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenRestAuthenticationServiceImpl.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenRestAuthenticationServiceImpl.java index 4ec9f0ae00..5e17a17701 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenRestAuthenticationServiceImpl.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/security/jwt/JWTTokenRestAuthenticationServiceImpl.java @@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.nimbusds.jose.JOSEException; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.rest.security.DSpaceAuthentication; import org.dspace.app.rest.security.RestAuthenticationService; import org.dspace.app.rest.utils.ContextUtil; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java index bd1a133609..58bfaba27b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/AbstractRestProcessingStep.java @@ -21,9 +21,10 @@ import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.services.model.Request; /** - * Interface to retrieve information about section + * Interface for the submission steps to populate sections in the in progress submission and react to patch requests. * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public interface AbstractRestProcessingStep extends ListenerProcessingStep { @@ -37,11 +38,35 @@ public interface AbstractRestProcessingStep extends ListenerProcessingStep { public static final String UPLOAD_STEP_METADATA_PATH = "metadata"; + /** + * Method to expose data in the a dedicated section of the in progress submission. The step needs to return a + * serializable object that will be included in a section with the name (id) assigned to the step in the + * item-submission.xml file + * + * @param submissionService + * the submission service + * @param obj + * the in progress submission + * @param config + * the submission step configuration + * @return the serializable object to include in the step generated section + * @throws Exception + */ public T getData(SubmissionService submissionService, InProgressSubmission obj, - SubmissionStepConfig config) throws Exception; + SubmissionStepConfig config) throws Exception; + /** + * The method will expose the list of validation errors identified by the step. The default implementation will + * found a {@link Validation} spring bean in the context with the same name that the step id + * + * @param submissionService + * @param obj + * @param config + * @return + * @throws Exception + */ default public List validate(SubmissionService submissionService, InProgressSubmission obj, - SubmissionStepConfig config) throws Exception { + SubmissionStepConfig config) throws Exception { List errors = new ArrayList(); List validations = DSpaceServicesFactory.getInstance().getServiceManager() @@ -56,7 +81,20 @@ public interface AbstractRestProcessingStep extends ListenerProcessingStep { return errors; } + /** + * Method to react to a patch request against the step managed section data + * + * @param context + * the DSpace context + * @param currentRequest + * the http request + * @param source + * the in progress submission + * @param op + * the json patch operation + * @throws Exception + */ public void doPatchProcessing(Context context, Request currentRequest, InProgressSubmission source, Operation op) - throws Exception; + throws Exception; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java index 72bcc35da8..f2e3513fab 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/ListenerProcessingStep.java @@ -11,7 +11,13 @@ import org.dspace.content.InProgressSubmission; import org.dspace.core.Context; /** + * This interface allows a submission step to access and modify if needed an inprogress submission also when changes are + * requested to sections other than the one managed by the step itself. + * + * This could be useful to allow a step wide validations or changes over multiple sections. + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public interface ListenerProcessingStep { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java index 92516e5888..0319cb75c6 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/SubmissionService.java @@ -16,12 +16,13 @@ import java.util.UUID; import javax.servlet.http.HttpServletRequest; -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.atteo.evo.inflector.English; import org.dspace.app.rest.converter.BitstreamFormatConverter; import org.dspace.app.rest.converter.ResourcePolicyConverter; import org.dspace.app.rest.converter.WorkspaceItemConverter; +import org.dspace.app.rest.exception.RESTAuthorizationException; import org.dspace.app.rest.exception.UnprocessableEntityException; import org.dspace.app.rest.model.BitstreamRest; import org.dspace.app.rest.model.CheckSumRest; @@ -51,6 +52,7 @@ import org.dspace.workflow.WorkflowItemService; import org.dspace.workflow.WorkflowService; import org.dspace.xmlworkflow.storedcomponents.XmlWorkflowItem; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.datasource.init.UncategorizedScriptException; import org.springframework.stereotype.Component; /** @@ -61,7 +63,7 @@ import org.springframework.stereotype.Component; @Component public class SubmissionService { - private static final Logger log = Logger.getLogger(SubmissionService.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SubmissionService.class); @Autowired protected ConfigurationService configurationService; @@ -86,18 +88,36 @@ public class SubmissionService { public WorkspaceItem createWorkspaceItem(Context context, Request request) throws SQLException, AuthorizeException { WorkspaceItem wsi = null; - String uuid = request.getHttpServletRequest().getParameter("collection"); - if (StringUtils.isBlank(uuid)) { - uuid = configurationService.getProperty("submission.default.collection"); + Collection collection = null; + String collectionUUID = request.getHttpServletRequest().getParameter("collection"); + + if (StringUtils.isBlank(collectionUUID)) { + collectionUUID = configurationService.getProperty("submission.default.collection"); } - Collection collection = null; - if (StringUtils.isNotBlank(uuid)) { - collection = collectionService.find(context, UUID.fromString(uuid)); - } else { - collection = collectionService.findAll(context, 1, 0).get(0); + try { + if (StringUtils.isNotBlank(collectionUUID)) { + collection = collectionService.find(context, UUID.fromString(collectionUUID)); + } else { + final List findAuthorizedOptimized = collectionService.findAuthorizedOptimized(context, + Constants.ADD); + if (findAuthorizedOptimized != null && findAuthorizedOptimized.size() > 0) { + collection = findAuthorizedOptimized.get(0); + } else { + throw new RESTAuthorizationException("No collection suitable for submission for the current user"); + } + } + + if (collection == null) { + throw new RESTAuthorizationException("collectionUUID=" + collectionUUID + " not found"); + } + wsi = workspaceItemService.create(context, collection, true); + } catch (SQLException e) { + // wrap in a runtime exception as we cannot change the method signature + throw new UncategorizedScriptException(e.getMessage(), e); + } catch (AuthorizeException ae) { + throw new RESTAuthorizationException(ae); } - wsi = workspaceItemService.create(context, collection, true); context.addEvent(new Event(Event.MODIFY, Constants.ITEM, wsi.getItem().getID(), null, itemService.getIdentifiers(context, wsi.getItem()))); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java index e416b4cddd..1c281bc7f4 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/UploadableStep.java @@ -16,11 +16,31 @@ import org.dspace.core.Context; import org.springframework.web.multipart.MultipartFile; /** + * The interface for submission Steps that need to deal with file upload + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public interface UploadableStep extends ListenerProcessingStep { + /** + * The method to implement to support upload of a file in the submission section (aka panel / step) + * + * @param context + * the dspace context + * @param submissionService + * the submission service + * @param stepConfig + * the configuration of the submission section + * @param wsi + * the inprogress submission + * @param file + * the multipart file, please note that it is a complex object containing additional information other + * than just the binary such as the filename and the mimetype + * @return the encountered error if any + * @throws IOException + */ public ErrorRest upload(Context context, SubmissionService submissionService, SubmissionStepConfig stepConfig, - InProgressSubmission wsi, MultipartFile file, String extraField) throws IOException; + InProgressSubmission wsi, MultipartFile file) throws IOException; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java index 2ff6dfa1f2..986ef3955b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseAddPatchOperation.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.submit.factory.impl; -import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang3.BooleanUtils; import org.dspace.content.InProgressSubmission; import org.dspace.content.Item; import org.dspace.content.LicenseUtils; @@ -52,7 +52,13 @@ public class LicenseAddPatchOperation extends AddPatchOperation { void add(Context context, Request currentRequest, InProgressSubmission source, String path, Object value) throws Exception { - Boolean grant = BooleanUtils.toBooleanObject((String) value); + Boolean grant = null; + // we are friendly with the client and accept also a string representation for the boolean + if (value instanceof String) { + grant = BooleanUtils.toBooleanObject((String) value); + } else { + grant = (Boolean) value; + } if (grant == null) { throw new IllegalArgumentException( diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java index 491ce1b1d9..228802ba61 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/factory/impl/LicenseReplacePatchOperation.java @@ -7,7 +7,7 @@ */ package org.dspace.app.rest.submit.factory.impl; -import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang3.BooleanUtils; import org.dspace.content.InProgressSubmission; import org.dspace.content.Item; import org.dspace.content.LicenseUtils; @@ -33,7 +33,13 @@ public class LicenseReplacePatchOperation extends ReplacePatchOperation void replace(Context context, Request currentRequest, InProgressSubmission source, String path, Object value) throws Exception { - Boolean grant = BooleanUtils.toBooleanObject((String) value); + Boolean grant = null; + // we are friendly with the client and accept also a string representation for the boolean + if (value instanceof String) { + grant = BooleanUtils.toBooleanObject((String) value); + } else { + grant = (Boolean) value; + } if (grant == null) { throw new IllegalArgumentException( diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java index 827d58bf3a..2fa8e264c7 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/DescribeStep.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.submit.step; 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.MetadataValueRest; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.model.step.DataDescribe; @@ -30,13 +30,15 @@ import org.dspace.core.Utils; import org.dspace.services.model.Request; /** - * Describe step for DSpace Spring Rest. Handle the exposition of metadata own by the in progress submission. + * Describe step for DSpace Spring Rest. Expose and allow patching of the in progress submission metadata. It is + * configured via the config/submission-forms.xml file * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) + * @author Andrea Bollini (andrea.bollini at 4science.it) */ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements AbstractRestProcessingStep { - private static final Logger log = Logger.getLogger(DescribeStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DescribeStep.class); private DCInputsReader inputReader; @@ -50,7 +52,17 @@ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements DataDescribe data = new DataDescribe(); try { DCInputSet inputConfig = inputReader.getInputsByFormName(config.getId()); - for (DCInput input : inputConfig.getFields()) { + readField(obj, config, data, inputConfig); + } catch (DCInputsReaderException e) { + log.error(e.getMessage(), e); + } + return data; + } + + private void readField(InProgressSubmission obj, SubmissionStepConfig config, DataDescribe data, + DCInputSet inputConfig) throws DCInputsReaderException { + for (DCInput[] row : inputConfig.getFields()) { + for (DCInput input : row) { List fieldsName = new ArrayList(); if (input.isQualdropValue()) { @@ -94,10 +106,7 @@ public class DescribeStep extends org.dspace.submit.step.DescribeStep implements } } } - } catch (DCInputsReaderException e) { - log.error(e.getMessage(), e); } - return data; } @Override diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java index ebd9bc8124..8aaf683808 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/ExtractMetadataStep.java @@ -17,8 +17,8 @@ import gr.ekt.bte.core.RecordSet; import gr.ekt.bte.core.Value; import gr.ekt.bte.dataloader.FileDataLoader; import org.apache.commons.io.FilenameUtils; -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.repository.WorkspaceItemRestRepository; import org.dspace.app.rest.submit.SubmissionService; @@ -34,15 +34,19 @@ import org.dspace.submit.step.ExtractionStep; import org.springframework.web.multipart.MultipartFile; /** + * This submission step allows to extract metadata from an uploaded file to enrich or initialize a submission. The + * processing is delegated to a list of extractor specialized by format (i.e. a Grobid extractor to get data from a PDF + * file, an extractor to get data from bibliographic file such as BibTeX, etc) + * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ public class ExtractMetadataStep extends ExtractionStep implements UploadableStep { - private static final Logger log = Logger.getLogger(ExtractMetadataStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ExtractMetadataStep.class); @Override public ErrorRest upload(Context context, SubmissionService submissionService, SubmissionStepConfig stepConfig, - InProgressSubmission wsi, MultipartFile multipartFile, String extraField) + InProgressSubmission wsi, MultipartFile multipartFile) throws IOException { Item item = wsi.getItem(); @@ -61,7 +65,7 @@ public class ExtractMetadataStep extends ExtractionStep implements UploadableSte } FileDataLoader fdl = (FileDataLoader) dataLoader; - fdl.setFilename(file.getAbsolutePath()); + fdl.setFilename(Utils.getFileName(multipartFile)); recordSet = convertFields(dataLoader.getRecords(), bteBatchImportService.getOutputMap()); @@ -80,7 +84,7 @@ public class ExtractMetadataStep extends ExtractionStep implements UploadableSte return null; } - public RecordSet convertFields(RecordSet recordSet, Map fieldMap) { + private RecordSet convertFields(RecordSet recordSet, Map fieldMap) { RecordSet result = new RecordSet(); for (Record publication : recordSet.getRecords()) { for (String fieldName : fieldMap.keySet()) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java index 3721d803ec..ca46e5608b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/UploadStep.java @@ -11,7 +11,7 @@ import java.io.BufferedInputStream; import java.io.InputStream; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.ErrorRest; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.model.step.DataUpload; @@ -22,6 +22,7 @@ import org.dspace.app.rest.submit.SubmissionService; import org.dspace.app.rest.submit.UploadableStep; import org.dspace.app.rest.submit.factory.PatchOperationFactory; import org.dspace.app.rest.submit.factory.impl.PatchOperation; +import org.dspace.app.rest.utils.Utils; import org.dspace.app.util.SubmissionStepConfig; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -40,9 +41,9 @@ import org.springframework.web.multipart.MultipartFile; * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ public class UploadStep extends org.dspace.submit.step.UploadStep - implements AbstractRestProcessingStep, UploadableStep { + implements AbstractRestProcessingStep, UploadableStep { - private static final Logger log = Logger.getLogger(UploadStep.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(UploadStep.class); @Override public DataUpload getData(SubmissionService submissionService, InProgressSubmission obj, @@ -90,10 +91,9 @@ public class UploadStep extends org.dspace.submit.step.UploadStep } - @Override public ErrorRest upload(Context context, SubmissionService submissionService, SubmissionStepConfig stepConfig, - InProgressSubmission wsi, MultipartFile file, String extraField) { + InProgressSubmission wsi, MultipartFile file) { Bitstream source = null; BitstreamFormat bf = null; @@ -113,9 +113,8 @@ public class UploadStep extends org.dspace.submit.step.UploadStep source = bitstreamService.create(context, bundles.get(0), inputStream); } - source.setName(context, file.getOriginalFilename()); - // TODO how retrieve this information? - source.setSource(context, extraField); + source.setName(context, Utils.getFileName(file)); + source.setSource(context, file.getOriginalFilename()); // Identify the format bf = bitstreamFormatService.guessFormat(context, source); diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java index cf97d044c4..4bb0fd6099 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/AbstractValidation.java @@ -10,11 +10,11 @@ package org.dspace.app.rest.submit.step.validation; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.rest.model.ErrorRest; /** - * Abstract class to manage errors on validation during submission process + * Abstract class to provide basic management of errors resulting from a validation on a submission * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ @@ -24,6 +24,9 @@ public abstract class AbstractValidation implements Validation { private List errors = new ArrayList(); + /** + * An unique name to identify the validation implementation + */ public String getName() { return name; } @@ -32,6 +35,15 @@ public abstract class AbstractValidation implements Validation { this.name = name; } + /** + * Add an error message (i18nKey) for a specific json path + * + * @param i18nKey + * the validation error message as a key to internationalize + * @param path + * the json path that identify the wrong data in the submission. It could be as specific as a single + * value in a multivalued attribute or general of a "whole" section + */ public void addError(String i18nKey, String path) { boolean found = false; if (StringUtils.isNotBlank(i18nKey)) { @@ -51,6 +63,11 @@ public abstract class AbstractValidation implements Validation { } } + /** + * Expose the identified errors + * + * @return the list of identified {@link ErrorRest} + */ public List getErrors() { return errors; } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java index 9fb37c5496..97c066e313 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/LicenseValidation.java @@ -23,7 +23,8 @@ import org.dspace.core.Constants; import org.springframework.beans.factory.annotation.Autowired; /** - * Execute check on license bundle + * This submission validation check that the license has been grant for the inprogress submission looking for the + * presence of a license bitstream in the license bundle, * * @author Luigi Andrea Pascarelli (luigiandrea.pascarelli at 4science.it) */ diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java index 20a74dcd49..55fc667a6d 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/MetadataValidation.java @@ -11,8 +11,8 @@ import java.sql.SQLException; import java.util.ArrayList; 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.repository.WorkspaceItemRestRepository; import org.dspace.app.rest.submit.SubmissionService; @@ -42,7 +42,7 @@ public class MetadataValidation extends AbstractValidation { private static final String ERROR_VALIDATION_REGEX = "error.validation.regex"; - private static final Logger log = Logger.getLogger(MetadataValidation.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataValidation.class); private DCInputsReader inputReader; @@ -55,43 +55,46 @@ public class MetadataValidation extends AbstractValidation { SubmissionStepConfig config) throws DCInputsReaderException, SQLException { DCInputSet inputConfig = getInputReader().getInputsByFormName(config.getId()); - for (DCInput input : inputConfig.getFields()) { + for (DCInput[] row : inputConfig.getFields()) { + for (DCInput input : row) { + String fieldKey = + metadataAuthorityService.makeFieldKey(input.getSchema(), input.getElement(), input.getQualifier()); + boolean isAuthorityControlled = metadataAuthorityService.isAuthorityControlled(fieldKey); - String fieldKey = metadataAuthorityService.makeFieldKey(input.getSchema(), input.getElement(), - input.getQualifier()); - boolean isAuthorityControlled = metadataAuthorityService.isAuthorityControlled(fieldKey); - - List fieldsName = new ArrayList(); - if (input.isQualdropValue()) { - for (Object qualifier : input.getPairs()) { - fieldsName.add(input.getFieldName() + "." + (String) qualifier); - } - } else { - fieldsName.add(input.getFieldName()); - } - - for (String fieldName : fieldsName) { - List mdv = itemService.getMetadataByMetadataString(obj.getItem(), fieldName); - for (MetadataValue md : mdv) { - if (!(input.validate(md.getValue()))) { - addError(ERROR_VALIDATION_REGEX, "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" - + config.getId() + "/" + input.getFieldName() + "/" + md.getPlace()); + List fieldsName = new ArrayList(); + if (input.isQualdropValue()) { + for (Object qualifier : input.getPairs()) { + fieldsName.add(input.getFieldName() + "." + (String) qualifier); } - if (isAuthorityControlled) { - String authKey = md.getAuthority(); - if (metadataAuthorityService.isAuthorityRequired(fieldKey) && StringUtils.isNotBlank(authKey)) { - addError(ERROR_VALIDATION_AUTHORITY_REQUIRED, - "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() - + "/" + input.getFieldName() + "/" + md.getPlace()); + } else { + fieldsName.add(input.getFieldName()); + } + + for (String fieldName : fieldsName) { + List mdv = itemService.getMetadataByMetadataString(obj.getItem(), fieldName); + for (MetadataValue md : mdv) { + if (!(input.validate(md.getValue()))) { + addError(ERROR_VALIDATION_REGEX, + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() + "/" + + input.getFieldName() + "/" + md.getPlace()); + } + if (isAuthorityControlled) { + String authKey = md.getAuthority(); + if (metadataAuthorityService.isAuthorityRequired(fieldKey) && + StringUtils.isNotBlank(authKey)) { + addError(ERROR_VALIDATION_AUTHORITY_REQUIRED, + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() + + "/" + input.getFieldName() + "/" + md.getPlace()); + } } } - } - - if ((input.isRequired() && mdv.size() == 0) && input.isVisible(DCInput.SUBMISSION_SCOPE)) { - // since this field is missing add to list of error - // fields - addError(ERROR_VALIDATION_REQUIRED, "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" - + config.getId() + "/" + input.getFieldName()); + if ((input.isRequired() && mdv.size() == 0) && input.isVisible(DCInput.SUBMISSION_SCOPE)) { + // since this field is missing add to list of error + // fields + addError(ERROR_VALIDATION_REQUIRED, + "/" + WorkspaceItemRestRepository.OPERATION_PATH_SECTIONS + "/" + config.getId() + "/" + + input.getFieldName()); + } } } } diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/UploadValidation.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/UploadValidation.java index bcb702413c..f1e8172b8b 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/UploadValidation.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/submit/step/validation/UploadValidation.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.submit.step.validation; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.model.ErrorRest; import org.dspace.app.rest.repository.WorkspaceItemRestRepository; import org.dspace.app.rest.submit.SubmissionService; @@ -30,7 +30,7 @@ public class UploadValidation extends AbstractValidation { private static final String ERROR_VALIDATION_FILEREQUIRED = "error.validation.filerequired"; - private static final Logger log = Logger.getLogger(UploadValidation.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(UploadValidation.class); private ItemService itemService; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ContextUtil.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ContextUtil.java index 4999110f7a..4d746628c1 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ContextUtil.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ContextUtil.java @@ -11,7 +11,7 @@ import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; /** @@ -25,7 +25,7 @@ public class ContextUtil { /** * The log4j logger */ - private static final Logger log = Logger.getLogger(ContextUtil.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ContextUtil.class); /** * Where the context is stored on an HTTP Request object diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java index 3de1ad2e53..70d97906ae 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java @@ -14,7 +14,7 @@ import java.util.List; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.converter.query.SearchQueryConverter; import org.dspace.app.rest.exception.InvalidDSpaceObjectTypeException; import org.dspace.app.rest.exception.InvalidRequestException; @@ -52,7 +52,7 @@ import org.springframework.stereotype.Component; @Component public class DiscoverQueryBuilder implements InitializingBean { - private static final Logger log = Logger.getLogger(DiscoverQueryBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DiscoverQueryBuilder.class); @Autowired private SearchService searchService; @@ -181,9 +181,7 @@ public class DiscoverQueryBuilder implements InitializingBean { //Set search query if (StringUtils.isNotBlank(query)) { - //Note that these quotes are needed incase we try to query OR for example. - //If the quotes aren't present, it'll crash. - queryArgs.setQuery("\"" + searchService.escapeQueryChars(query) + "\""); + queryArgs.setQuery(query); } //Limit results to DSO type diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java index 5133431b61..4ae836bccf 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/MultipartFileSender.java @@ -41,8 +41,8 @@ public class MultipartFileSender { private static final String MULTIPART_BOUNDARY = "MULTIPART_BYTERANGES"; private static final String CONTENT_TYPE_MULTITYPE_WITH_BOUNDARY = "multipart/byteranges; boundary=" + MULTIPART_BOUNDARY; - private static final String CONTENT_DISPOSITION_INLINE = "inline"; - private static final String CONTENT_DISPOSITION_ATTACHMENT = "attachment"; + public static final String CONTENT_DISPOSITION_INLINE = "inline"; + public static final String CONTENT_DISPOSITION_ATTACHMENT = "attachment"; private static final String IF_NONE_MATCH = "If-None-Match"; private static final String IF_MODIFIED_SINCE = "If-Modified-Since"; private static final String ETAG = "ETag"; @@ -134,6 +134,10 @@ public class MultipartFileSender { } return this; } + public MultipartFileSender withDisposition(String contentDisposition) { + this.disposition = contentDisposition; + return this; + } public void serveResource() throws IOException { @@ -172,9 +176,9 @@ public class MultipartFileSender { CONTENT_DISPOSITION_ATTACHMENT; } - response.setHeader(CONTENT_DISPOSITION, String.format(CONTENT_DISPOSITION_FORMAT, disposition, fileName)); - log.debug("Content-Disposition : {}", disposition); } + response.setHeader(CONTENT_DISPOSITION, String.format(CONTENT_DISPOSITION_FORMAT, disposition, fileName)); + log.debug("Content-Disposition : {}", disposition); // Content phase if (METHOD_HEAD.equals(request.getMethod())) { diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ScopeResolver.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ScopeResolver.java index 1895005804..22083beccd 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ScopeResolver.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/ScopeResolver.java @@ -10,8 +10,8 @@ package org.dspace.app.rest.utils; import java.sql.SQLException; import java.util.UUID; -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.content.service.CollectionService; import org.dspace.content.service.CommunityService; @@ -25,7 +25,7 @@ import org.springframework.stereotype.Component; @Component public class ScopeResolver { - private static final Logger log = Logger.getLogger(ScopeResolver.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ScopeResolver.class); @Autowired CollectionService collectionService; diff --git a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/Utils.java b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/Utils.java index 404205956f..afbc3d243a 100644 --- a/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/Utils.java +++ b/dspace-spring-rest/src/main/java/org/dspace/app/rest/utils/Utils.java @@ -165,6 +165,20 @@ public class Utils { return org.dspace.core.Utils.standardize(schema, element, qualifier, "."); } + /** + * Create a temporary file from a multipart file upload + * + * @param multipartFile + * the multipartFile representing the uploaded file. Please note that it is a complex object including + * additional information other than the binary like the orginal file name and the mimetype + * @param prefixTempName + * the prefix to use to generate the filename of the temporary file + * @param suffixTempName + * the suffic to use to generate the filename of the temporary file + * @return the temporary file on the server + * @throws IOException + * @throws FileNotFoundException + */ public static File getFile(MultipartFile multipartFile, String prefixTempName, String suffixTempName) throws IOException, FileNotFoundException { // TODO after change item-submission into @@ -183,4 +197,26 @@ public class Utils { org.dspace.core.Utils.bufferedCopy(io, out); return file; } + + /** + * Return the filename part from a multipartFile upload that could eventually contains the fullpath on the client + * filesystem + * + * @param multipartFile + * the file uploaded + * @return the filename part of the file on the client filesystem + * @throws IOException + * @throws FileNotFoundException + */ + public static String getFileName(MultipartFile multipartFile) + throws IOException, FileNotFoundException { + String originalFilename = multipartFile.getOriginalFilename(); + if (originalFilename != null) { + // split by \ or / as we don't know the client OS (Win, Linux) + String[] parts = originalFilename.split("[\\/]"); + return parts[parts.length - 1]; + } else { + return multipartFile.getName(); + } + } } diff --git a/dspace-spring-rest/src/main/resources/application.properties b/dspace-spring-rest/src/main/resources/application.properties index cc29bc7e3c..9ab234c642 100644 --- a/dspace-spring-rest/src/main/resources/application.properties +++ b/dspace-spring-rest/src/main/resources/application.properties @@ -112,4 +112,8 @@ spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSou # #logging.level.org.springframework.boot=DEBUG #logging.level.org.springframework.web=DEBUG -#logging.level.org.hibernate=ERROR \ No newline at end of file +#logging.level.org.hibernate=ERROR + +######################### +# Log4J configuration +logging.config = ${dspace.dir}/config/log4j2.xml diff --git a/dspace-spring-rest/src/main/webapp/js/hal/http/client.js b/dspace-spring-rest/src/main/webapp/js/hal/http/client.js index 9e1871abae..20f80156aa 100644 --- a/dspace-spring-rest/src/main/webapp/js/hal/http/client.js +++ b/dspace-spring-rest/src/main/webapp/js/hal/http/client.js @@ -7,13 +7,55 @@ */ HAL.Http.Client = function(opts) { this.vent = opts.vent; - this.defaultHeaders = { 'Accept': 'application/hal+json, application/json, */*; q=0.01' }; - cookie = document.cookie.match('(^|;)\\s*' + 'MyHalBrowserToken' + '\\s*=\\s*([^;]+)'); - cookie ? this.defaultHeaders.Authorization = 'Bearer ' + cookie.pop() : ''; + this.defaultHeaders = {'Accept': 'application/hal+json, application/json, */*; q=0.01'}; + var authorizationHeader = getAuthorizationHeader(); + authorizationHeader ? this.defaultHeaders.Authorization = authorizationHeader : ''; console.log(this.defaultHeaders); this.headers = this.defaultHeaders; }; +function getAuthorizationHeader() { + var cookie = document.cookie.match('(^|;)\\s*' + 'MyHalBrowserToken' + '\\s*=\\s*([^;]+)'); + if(cookie != undefined) { + return 'Bearer ' + cookie.pop(); + } else { + return undefined; + } +} +function downloadFile(url) { + var request = new XMLHttpRequest(); + request.open('GET', url, true); + request.responseType = 'blob'; + var authorizationHeader = getAuthorizationHeader(); + if (authorizationHeader != undefined) { + request.setRequestHeader("Authorization", authorizationHeader); + } + request.onload = function () { + // Only handle status code 200 + if (request.status === 200) { + // Try to find out the filename from the content disposition `filename` value + var disposition = request.getResponseHeader('content-disposition'); + var matches = /"([^"]*)"/.exec(disposition); + var filename = (matches != null && matches[1] ? matches[1] : 'content'); + // The actual download + var contentTypeHeader = request.getResponseHeader("content-type"); + if (contentTypeHeader === undefined || contentTypeHeader === "") { + contentTypeHeader = "application/octet-stream"; + } + var blob = new Blob([request.response], {type: contentTypeHeader}); + var link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = filename; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + // some error handling should be done here... + }; + request.send(); +} + + HAL.Http.Client.prototype.get = function(url) { var self = this; this.vent.trigger('location-change', { url: url }); @@ -31,9 +73,14 @@ HAL.Http.Client.prototype.get = function(url) { headers: jqXHR.getAllResponseHeaders() }); } - }).error(function() { - self.vent.trigger('fail-response', { jqxhr: jqxhr }); - }); + }).error(function (response) { + self.vent.trigger('fail-response', {jqxhr: jqxhr}); + var contentTypeResponseHeader = jqxhr.getResponseHeader("content-type"); + if (contentTypeResponseHeader != undefined + && !contentTypeResponseHeader.startsWith("application/hal") + && !contentTypeResponseHeader.startsWith("application/json")) { + downloadFile(url); + }}); }; HAL.Http.Client.prototype.request = function(opts) { diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java new file mode 100644 index 0000000000..874519860a --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerDisabledTest.java @@ -0,0 +1,61 @@ +/** + * 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.opensearch; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; + +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +import org.junit.Before; +import org.junit.Test; + +/** + * Integration test to test the /opensearch endpoint + * + * @author Oliver Goldschmidt (o dot goldschmidt at tuhh dot de) + */ +public class OpenSearchControllerDisabledTest extends AbstractControllerIntegrationTest { + + private ConfigurationService configurationService; + + @Before + public void init() throws Exception { + // disable OpenSearch by configuration to test the disabled behaviour although its active in test config + configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + configurationService.setProperty("websvc.opensearch.enable", false); + } + + @Test + public void searchTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "dog")) + //The status has to be 404 Not Found + .andExpect(status().isNotFound()) + //We expect the content type to be "application/html" + .andExpect(content().contentType("text/html")) + .andExpect(content().string("OpenSearch Service is disabled")) + ; + } + + @Test + public void serviceDocumentTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/service")) + //The status has to be 404 Not Found + .andExpect(status().isNotFound()) + .andExpect(content().contentType("text/html")) + .andExpect(content().string("OpenSearch Service is disabled")) + ; + } +} \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java new file mode 100644 index 0000000000..9208fe2122 --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/opensearch/OpenSearchControllerTest.java @@ -0,0 +1,224 @@ +/** + * 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.opensearch; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; + +import org.dspace.app.rest.builder.CollectionBuilder; +import org.dspace.app.rest.builder.CommunityBuilder; +import org.dspace.app.rest.builder.ItemBuilder; + +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; + +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; + +import org.junit.Ignore; +import org.junit.Test; + +/** + * Integration test to test the /opensearch endpoint + * (Class has to start or end with IT to be picked up by the failsafe plugin) + * + * @author Oliver Goldschmidt (o dot goldschmidt at tuhh dot de) + */ +public class OpenSearchControllerTest extends AbstractControllerIntegrationTest { + + @Test + public void searchAtomTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "cats")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + ; + } + + // HTML is an open issue in OpenSearch, so skip this test at the moment + @Test + @Ignore + public void searchHtmlTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "cats") + .param("format", "html")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("text/html;charset=UTF-8")) + ; + } + + @Test + public void searchRssTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "cats") + .param("format", "rss")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/rss+xml;charset=UTF-8" + .andExpect(content().contentType("application/rss+xml;charset=UTF-8")) + ; + } + + @Test + public void noResultsTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "this query is not supposed to have a result")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/totalResults").string("0")) + .andExpect(xpath("feed/Query/@searchTerms").string("this+query+is+not+supposed+to+have+a+result")) + ; + } + + @Test + public void findResultSimpleTest() throws Exception { + //Turn off the authorization system, otherwise we can't make the objects + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Boars at Yellowstone") + .withIssueDate("2017-10-17") + .withAuthor("Ballini, Andreas").withAuthor("Moriarti, Susan") + .build(); + Item publicItem2 = ItemBuilder.createItem(context, col1) + .withTitle("Yellowstone and bisons") + .withIssueDate("2017-10-18") + .withAuthor("Ballini, Andreas").withAuthor("Moriarti, Susan") + .build(); + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "Yellowstone")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/Query/@searchTerms").string("Yellowstone")) + .andExpect(xpath("feed/totalResults").string("2")) + ; + } + + // This test does not find the record, so there are obviously issues with special chars + @Ignore + @Test + public void findResultWithSpecialCharsTest() throws Exception { + //Turn off the authorization system, otherwise we can't make the objects + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Bären im Yellowstonepark") + .withIssueDate("2017-10-17") + .withAuthor("Bäcker, Nick") + .build(); + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "Bär")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/Query/@searchTerms").string("B%C3%A4r")) + .andExpect(xpath("feed/totalResults").string("1")) + ; + } + + // Ignore this test as it is throwing an exception + @Ignore + @Test + public void invalidQueryTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "urn:nbn:de:fake-123")) + // We get an exception for such a query, which is obviously not expected + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/Query/@searchTerms").string("urn:nbn:de:fake-123")) + .andExpect(xpath("feed/totalResults").string("0")) + ; + } + + @Test + public void emptyQueryTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/search") + .param("query", "")) + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/atom+xml;charset=UTF-8" + .andExpect(content().contentType("application/atom+xml;charset=UTF-8")) + .andExpect(xpath("feed/totalResults").string("0")) + ; + } + + @Test + public void serviceDocumentTest() throws Exception { + //When we call the root endpoint + getClient().perform(get("/opensearch/service")) + //The status has to be 200 OK + .andExpect(status().isOk()) + // and the contentType has to be an opensearchdescription + .andExpect(content().contentType("application/opensearchdescription+xml;charset=UTF-8")) + // and there need to be some values taken from the test configuration + .andExpect(xpath("OpenSearchDescription/ShortName").string("DSpace")) + .andExpect(xpath("OpenSearchDescription/LongName").string("DSpace at My University")) + .andExpect(xpath("OpenSearchDescription/Description") + .string("DSpace at My University DSpace repository") + ) + ; + /* Expected response for the service document is: + + + DSpace + DSpace at My University + DSpace at My University DSpace repository + UTF-8 + UTF-8 + + IR DSpace + dspace-help@myu.edu + http://www.dspace.org/images/favicon.ico + + + + + */ + } +} \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index 0365910570..beacc1b838 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -9,6 +9,7 @@ package org.dspace.app.rest; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -498,4 +499,388 @@ public class BrowsesResourceControllerIT extends AbstractControllerIntegrationTe "Item 7", "2016-01-12") ))); } + + @Test + public void testBrowseByEntriesStartsWith() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Turing, Alan Mathison") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Scott, Ridley") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item3 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Van Rossum, Guido") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col2) + .withTitle("Java") + .withAuthor("Gosling, James") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item5 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("T-800") + .withAuthor("Cameron, James") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); + + // ---- BROWSES BY ENTRIES ---- + + //** WHEN ** + //An anonymous user browses the entries in the Browse by Author endpoint + //with startsWith set to U + getClient().perform(get("/api/discover/browses/author/entries?startsWith=U") + .param("size", "2")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the "Universe" entry to be present + .andExpect(jsonPath("$.page.totalElements", is(1))) + //As entry browsing works as a filter, we expect to be on page 0 + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index filters to the "Universe" entries and Counts 2 Items. + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("Universe", 2) + ))) + //Verify startsWith parameter is included in the links + .andExpect(jsonPath("$._links.self.href", containsString("?startsWith=U"))); + + //** WHEN ** + //An anonymous user browses the entries in the Browse by Author endpoint + //with startsWith set to T and scope set to Col 1 + getClient().perform(get("/api/discover/browses/author/entries?startsWith=T") + .param("scope", col1.getID().toString())) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the entry "Turing, Alan Mathison" to be present + .andExpect(jsonPath("$.page.totalElements", is(1))) + //As entry browsing works as a filter, we expect to be on page 0 + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index filters to the "Turing, Alan'" items. + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("Turing, Alan Mathison", 1) + ))) + //Verify that the startsWith paramater is included in the links + .andExpect(jsonPath("$._links.self.href", containsString("?startsWith=T"))); + + //** WHEN ** + //An anonymous user browses the entries in the Browse by Subject endpoint + //with startsWith set to C + getClient().perform(get("/api/discover/browses/subject/entries?startsWith=C")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect only the entry "Computing" to be present + .andExpect(jsonPath("$.page.totalElements", is(1))) + //As entry browsing works as a filter, we expect to be on page 0 + .andExpect(jsonPath("$.page.number", is(0))) + + //Verify that the index filters to the "Computing'" items. + .andExpect(jsonPath("$._embedded.browseEntries", + contains(BrowseEntryResourceMatcher.matchBrowseEntry("Computing", 3) + ))) + //Verify that the startsWith paramater is included in the links + .andExpect(jsonPath("$._links.self.href", containsString("?startsWith=C"))); + + }; + + @Test + public void testBrowseByItemsStartsWith() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Turing, Alan Mathison") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Scott, Ridley") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item3 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Van Rossum, Guido") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col2) + .withTitle("Java") + .withAuthor("Gosling, James") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item5 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("T-800") + .withAuthor("Cameron, James") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); + // ---- BROWSES BY ITEM ---- + + //** WHEN ** + //An anonymous user browses the items in the Browse by date issued endpoint + //with startsWith set to 1990 + getClient().perform(get("/api/discover/browses/dateissued/items?startsWith=1990") + .param("size", "2")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect the totalElements to be the 7 items present in the repository + .andExpect(jsonPath("$.page.totalElements", is(7))) + //We expect to jump to page 1 of the index + .andExpect(jsonPath("$.page.number", is(1))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$._links.first.href", containsString("startsWith=1990"))) + + //Verify that the index jumps to the "Python" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item3, + "Python", "1990"), + ItemMatcher.matchItemWithTitleAndDateIssued(item4, + "Java", "1995-05-23") + ))); + //** WHEN ** + //An anonymous user browses the items in the Browse by Title endpoint + //with startsWith set to T + getClient().perform(get("/api/discover/browses/title/items?startsWith=T") + .param("size", "2")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect the totalElements to be the 7 items present in the repository + .andExpect(jsonPath("$.page.totalElements", is(7))) + //We expect to jump to page 2 in the index + .andExpect(jsonPath("$.page.number", is(2))) + .andExpect(jsonPath("$._links.first.href", containsString("startsWith=T"))) + + //Verify that the index jumps to the "T-800" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item7, + "T-800", "2029"), + ItemMatcher.matchItemWithTitleAndDateIssued(item5, + "Zeta Reticuli", + "2018-01-01") + ))); + + //** WHEN ** + //An anonymous user browses the items in the Browse by Title endpoint + //with startsWith set to Blade and scope set to Col 1 + getClient().perform(get("/api/discover/browses/title/items?startsWith=Blade") + .param("scope", col1.getID().toString()) + .param("size", "2")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect the totalElements to be the 3 items present in the collection + .andExpect(jsonPath("$.page.totalElements", is(3))) + //As this is is a small collection, we expect to go-to page 0 + .andExpect(jsonPath("$.page.number", is(0))) + .andExpect(jsonPath("$._links.first.href", containsString("startsWith=Blade"))) + + //Verify that the index jumps to the "Blade Runner" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item2, + "Blade Runner", + "1982-06-25"), + ItemMatcher.matchItemWithTitleAndDateIssued(item3, + "Python", "1990") + ))); + } + + @Test + public void testBrowseByStartsWithAndPage() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. 7 public items that are readable by Anonymous + Item item1 = ItemBuilder.createItem(context, col1) + .withTitle("Alan Turing") + .withAuthor("Turing, Alan Mathison") + .withIssueDate("1912-06-23") + .withSubject("Computing") + .build(); + + Item item2 = ItemBuilder.createItem(context, col1) + .withTitle("Blade Runner") + .withAuthor("Scott, Ridley") + .withIssueDate("1982-06-25") + .withSubject("Science Fiction") + .build(); + + Item item3 = ItemBuilder.createItem(context, col2) + .withTitle("Java") + .withAuthor("Gosling, James") + .withIssueDate("1995-05-23") + .withSubject("Computing") + .build(); + + Item item4 = ItemBuilder.createItem(context, col2) + .withTitle("Moon") + .withAuthor("Universe") + .withIssueDate("2018-01-02") + .withSubject("Astronomy") + .build(); + + Item item5 = ItemBuilder.createItem(context, col1) + .withTitle("Python") + .withAuthor("Van Rossum, Guido") + .withIssueDate("1990") + .withSubject("Computing") + .build(); + + Item item6 = ItemBuilder.createItem(context, col2) + .withTitle("T-800") + .withAuthor("Cameron, James") + .withIssueDate("2029") + .withSubject("Science Fiction") + .build(); + + Item item7 = ItemBuilder.createItem(context, col2) + .withTitle("Zeta Reticuli") + .withAuthor("Universe") + .withIssueDate("2018-01-01") + .withSubject("Astronomy") + .build(); + + // ---- BROWSES BY ITEM ---- + + //** WHEN ** + //An anonymous user browses the items in the Browse by date issued endpoint + //with startsWith set to 1990 and Page to 3 + getClient().perform(get("/api/discover/browses/dateissued/items?startsWith=1990") + .param("size", "2").param("page", "2")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //We expect the content type to be "application/hal+json;charset=UTF-8" + .andExpect(content().contentType(contentType)) + + //We expect the totalElements to be the 7 items present in the repository + .andExpect(jsonPath("$.page.totalElements", is(7))) + //We expect to jump to page 1 of the index + .andExpect(jsonPath("$.page.number", is(2))) + .andExpect(jsonPath("$.page.size", is(2))) + .andExpect(jsonPath("$._links.first.href", containsString("startsWith=1990"))) + + //Verify that the index jumps to the "Zeta Reticuli" item. + .andExpect(jsonPath("$._embedded.items", + contains(ItemMatcher.matchItemWithTitleAndDateIssued(item7, + "Zeta Reticuli", "2018-01-01"), + ItemMatcher.matchItemWithTitleAndDateIssued(item4, + "Moon", "2018-01-02") + ))); + } + } \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java index 83befe969c..d1f77fcdd1 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java @@ -7,17 +7,27 @@ */ package org.dspace.app.rest; +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.Arrays; import java.util.UUID; +import com.fasterxml.jackson.databind.ObjectMapper; + import org.dspace.app.rest.builder.CollectionBuilder; import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.matcher.CommunityMatcher; +import org.dspace.app.rest.matcher.CommunityMetadataMatcher; +import org.dspace.app.rest.model.CommunityRest; +import org.dspace.app.rest.model.MetadataEntryRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -26,6 +36,102 @@ import org.junit.Test; public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest { + @Test + public void createTest() throws Exception { + context.turnOffAuthorisationSystem(); + + ObjectMapper mapper = new ObjectMapper(); + CommunityRest comm = new CommunityRest(); + // We send a name but the created community should set this to the title + comm.setName("Test Top-Level Community"); + + MetadataEntryRest description = new MetadataEntryRest(); + description.setKey("dc.description"); + description.setValue("

Some cool HTML code here

"); + + MetadataEntryRest abs = new MetadataEntryRest(); + abs.setKey("dc.description.abstract"); + abs.setValue("Sample top-level community created via the REST API"); + + MetadataEntryRest contents = new MetadataEntryRest(); + contents.setKey("dc.description.tableofcontents"); + contents.setValue("

HTML News

"); + + MetadataEntryRest copyright = new MetadataEntryRest(); + copyright.setKey("dc.rights"); + copyright.setValue("Custom Copyright Text"); + + MetadataEntryRest title = new MetadataEntryRest(); + title.setKey("dc.title"); + title.setValue("Title Text"); + + comm.setMetadata(Arrays.asList(description, + abs, + contents, + copyright, + title)); + + String authToken = getAuthToken(admin.getEmail(), password); + getClient(authToken).perform(post("/api/core/communities") + .content(mapper.writeValueAsBytes(comm)) + .contentType(contentType)) + .andExpect(status().isCreated()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$", Matchers.allOf( + hasJsonPath("$.id", not(empty())), + hasJsonPath("$.uuid", not(empty())), + hasJsonPath("$.name", is("Title Text")), + hasJsonPath("$.handle", not(empty())), + hasJsonPath("$.type", is("community")), + hasJsonPath("$._links.collections.href", not(empty())), + hasJsonPath("$._links.logo.href", not(empty())), + hasJsonPath("$._links.subcommunities.href", not(empty())), + hasJsonPath("$._links.self.href", not(empty())), + hasJsonPath("$.metadata", Matchers.containsInAnyOrder( + CommunityMetadataMatcher.matchMetadata("dc.description", + "

Some cool HTML code here

"), + CommunityMetadataMatcher.matchMetadata("dc.description.abstract", + "Sample top-level community created via the REST API"), + CommunityMetadataMatcher.matchMetadata("dc.description.tableofcontents", + "

HTML News

"), + CommunityMetadataMatcher.matchMetadata("dc.rights", + "Custom Copyright Text"), + CommunityMetadataMatcher.matchMetadata("dc.title", + "Title Text") + ))))); + + } + + @Test + public void createUnauthorizedTest() throws Exception { + context.turnOffAuthorisationSystem(); + + ObjectMapper mapper = new ObjectMapper(); + CommunityRest comm = new CommunityRest(); + comm.setName("Test Top-Level Community"); + + MetadataEntryRest title = new MetadataEntryRest(); + title.setKey("dc.title"); + title.setValue("Title Text"); + + comm.setMetadata(Arrays.asList(title)); + + // Anonymous user tries to create a community. + // Should fail because user is not authenticated. Error 401. + getClient().perform(post("/api/core/communities") + .content(mapper.writeValueAsBytes(comm)) + .contentType(contentType)) + .andExpect(status().isUnauthorized()); + + // Non-admin Eperson tries to create a community. + // Should fail because user doesn't have permissions. Error 403. + String authToken = getAuthToken(eperson.getEmail(), password); + getClient(authToken).perform(post("/api/core/communities") + .content(mapper.writeValueAsBytes(comm)) + .contentType(contentType)) + .andExpect(status().isForbidden()); + } + @Test public void findAllTest() throws Exception { //We turn off the authorization system in order to create the structure as defined below @@ -191,7 +297,8 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest //Main community has no collections, therefore contentType is not set getClient().perform(get("/api/core/communities/" + parentCommunity.getID().toString() + "/collections")) - .andExpect(status().isNoContent()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient().perform(get("/api/core/communities/" + child1.getID().toString() + "/collections")) .andExpect(status().isOk()) @@ -203,7 +310,8 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest //child1 subcommunity has no subcommunities, therefore contentType is not set getClient().perform(get("/api/core/communities/" + child1.getID().toString() + "/subcommunities")) - .andExpect(status().isNoContent()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java index 56d25ecf8c..f09663f4be 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java @@ -2678,4 +2678,282 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest ; } + + @Test + public void discoverSearchObjectsTestWithDateIssuedQueryTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Test") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Test 2") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("Public item 2") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + String bitstreamContent = "ThisIsSomeDummyText"; + //Add a bitstream to an item + try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) { + Bitstream bitstream = BitstreamBuilder. + createBitstream(context, publicItem1, is) + .withName("Bitstream") + .withMimeType("text/plain") + .build(); + } + + //Run the filter media to make the text in the bitstream searchable through the query + runDSpaceScript("filter-media", "-f", "-i", publicItem1.getHandle()); + + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "dc.date.issued:2010-02-13")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 1) + ))) + //This is the only item that should be returned with the query given + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.contains( + SearchResultMatcher.matchOnItemName("item", "items", "Public item 2") + ))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "dc.date.issued:2013-02-13")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 0, 0) + ))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + } + + @Test + public void discoverSearchObjectsTestWithLuceneSyntaxQueryTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Test") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("TestItem2") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("azeazeazeazeazeaze") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "((dc.date.issued:2010 OR dc.date.issued:1990-02-13)" + + " AND (dc.title:Test OR dc.title:TestItem2))")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 2) + ))) + //This is the only item that should be returned with the query given + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.containsInAnyOrder( + SearchResultMatcher.matchOnItemName("item", "items", "Test"), + SearchResultMatcher.matchOnItemName("item", "items", "TestItem2") + ))) + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.not(Matchers.contains( + SearchResultMatcher.matchOnItemName("item", "items", "azeazeazeazeazeaze") + )))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + } + + @Test + public void discoverSearchObjectsTestWithEscapedLuceneCharactersTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Faithful Infidel: Exploring Conformity (2nd edition)") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Test") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("NotAProperTestTitle") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + getClient().perform(get("/api/discover/search/objects") + .param("query", "\"Faithful Infidel: Exploring Conformity (2nd edition)\"")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + //The page object needs to look like this + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 1) + ))) + //This is the only item that should be returned with the query given + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.contains( + SearchResultMatcher.matchOnItemName + ("item", "items", "Faithful Infidel: Exploring Conformity (2nd edition)") + ))) + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", + Matchers.not(Matchers.containsInAnyOrder( + SearchResultMatcher.matchOnItemName("item", "items", "Test"), + SearchResultMatcher.matchOnItemName("item", "items", "NotAProperTestTitle") + )))) + + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) + ; + + } + @Test + public void discoverSearchObjectsTestWithUnEscapedLuceneCharactersTest() throws Exception { + //We turn off the authorization system in order to create the structure as defined below + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. Three public items that are readable by Anonymous with different subjects + Item publicItem1 = ItemBuilder.createItem(context, col1) + .withTitle("Faithful Infidel: Exploring Conformity (2nd edition)") + .withIssueDate("2010-10-17") + .withAuthor("Smith, Donald") + .withSubject("ExtraEntry") + .build(); + + Item publicItem2 = ItemBuilder.createItem(context, col2) + .withTitle("Test") + .withIssueDate("1990-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane") + .withSubject("TestingForMore").withSubject("ExtraEntry") + .build(); + + Item publicItem3 = ItemBuilder.createItem(context, col2) + .withTitle("NotAProperTestTitle") + .withIssueDate("2010-02-13") + .withAuthor("Smith, Maria").withAuthor("Doe, Jane").withAuthor("test,test") + .withAuthor("test2, test2").withAuthor("Maybe, Maybe") + .withSubject("AnotherTest").withSubject("TestingForMore") + .withSubject("ExtraEntry") + .build(); + //** WHEN ** + getClient().perform(get("/api/discover/search/objects") + .param("query", "OR")) + + .andExpect(status().isBadRequest()) + ; + + } } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index 12eb895ce3..c7aef88e84 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -11,15 +11,20 @@ import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.UUID; +import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; import org.dspace.app.rest.builder.CollectionBuilder; @@ -30,6 +35,8 @@ import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.EPersonMetadataMatcher; import org.dspace.app.rest.model.EPersonRest; import org.dspace.app.rest.model.MetadataEntryRest; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.model.patch.ReplaceOperation; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.content.Collection; import org.dspace.content.Item; @@ -39,7 +46,6 @@ import org.junit.Ignore; import org.junit.Test; - public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { @Test @@ -332,7 +338,7 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { String authToken = getAuthToken(admin.getEmail(), password); getClient(authToken).perform(get("/api/eperson/epersons/search/byEmail") .param("email", "undefined@undefined.com")) - .andExpect(status().isNotFound()); + .andExpect(status().isNoContent()); } @Test @@ -514,4 +520,525 @@ public class EPersonRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(status().isOk()); } + @Test + public void patchByForbiddenUser() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(eperson.getEmail(), password); + + // should be forbidden. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isForbidden()); + + token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(nullValue()))); + + } + + @Test + public void patchByAnonymousUser() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // should be unauthorized. + getClient().perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isUnauthorized()); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(nullValue()))); + + } + + @Test + public void patchNetId() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .withNetId("testId") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // update net id + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is("newNetId"))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); + + } + + @Test + public void patchUsingStringForBoolean() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .withNetId("testId") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + + // String should be converted to boolean. + ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", "true"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // updatecan login + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is("testId"))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); + + // String should be converted to boolean. + replaceOperation = new ReplaceOperation("/canLogin", "false"); + ops.set(0, replaceOperation); + patchBody = getPatchContent(ops); + + // update can login + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is("testId"))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); + + } + + @Test + public void replaceOnNonExistentValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", "newNetId"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // update of netId should fail. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); + + } + + @Test + public void patchNetIdMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .withNetId("testId") + .build(); + + String newId = "newId"; + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/netid", newId); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // initialize to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(newId))); + + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/netid", null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + // value should be unchanged. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.netid", Matchers.is(newId))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); + + + } + + @Test + public void patchCanLogin() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", true); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // updates canLogIn to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); + + + } + + @Test + public void patchCanLoginMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/canLogin", true); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // initialize to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true)));; + + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/canLogin", null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + // value should still be true. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(false))); + + } + + @Test + public void patchRequireCertificate() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + List ops = new ArrayList(); + // Boolean operations should accept either string or boolean as value. Try boolean. + ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", false); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // updates requireCertificate to false + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(false))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.netid", Matchers.nullValue())); + + } + + @Test + public void patchRequireCertificateMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/certificate", true); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // initialize to true + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(true)));; + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/certificate",null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + // value should still be true. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(true))) + .andExpect(jsonPath("$.email", Matchers.is("johndoe@fake-email.com"))) + .andExpect(jsonPath("$.canLogIn", Matchers.is(false))); + + + } + + @Test + public void patchPassword() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .withPassword("7Testpass") + .build(); + + String newPassword = "newpassword"; + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/password", newPassword); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + String token = getAuthToken(admin.getEmail(), password); + + // updates password + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()); + + // login with new password + token = getAuthToken(ePerson.getEmail(), newPassword); + getClient(token).perform(get("/api/")) + .andExpect(status().isOk()); + + } + + @Test + public void patchPasswordMissingValue() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .withPassword("testpass79bC") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + String newPassword = "newpass"; + + List ops = new ArrayList(); + ReplaceOperation replaceOperation = new ReplaceOperation("/password", newPassword); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // initialize passwd + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()); + + + List ops2 = new ArrayList(); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/password", null); + ops2.add(replaceOperation2); + patchBody = getPatchContent(ops2); + + // should return bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + // login with original password + token = getAuthToken(ePerson.getEmail(), newPassword); + getClient(token).perform(get("/api/")) + .andExpect(status().isOk()); + + } + + @Test + public void patchMultipleOperationsWithSuccess() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .withNetId("testId") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + + ReplaceOperation replaceOperation1 = new ReplaceOperation("/canLogin", true); + ops.add(replaceOperation1); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/netid", "multitestId"); + ops.add(replaceOperation2); + ReplaceOperation replaceOperation3 = new ReplaceOperation("/certificate", true); + ops.add(replaceOperation3); + String patchBody = getPatchContent(ops); + + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))) + .andExpect(jsonPath("$.netid", Matchers.is("multitestId"))) + .andExpect(jsonPath("$.requireCertificate", Matchers.is(true))); + + } + + @Test + public void patchMultipleOperationsWithFailure() throws Exception { + + context.turnOffAuthorisationSystem(); + + EPerson ePerson = EPersonBuilder.createEPerson(context) + .withNameInMetadata("John", "Doe") + .withEmail("Johndoe@fake-email.com") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + ReplaceOperation replaceOperation0 = new ReplaceOperation("/canLogin", true); + ops.add(replaceOperation0); + String patchBody = getPatchContent(ops); + + // Initialized canLogIn value is true. + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); + + // The first operation in the series sets canLogIn to be false. + ReplaceOperation replaceOperation1 = new ReplaceOperation("/canLogin", false); + ops.add(replaceOperation1); + ReplaceOperation replaceOperation2 = new ReplaceOperation("/certificate", true); + ops.add(replaceOperation2); + // This will fail. The path does not exist. + ReplaceOperation replaceOperation3 = new ReplaceOperation("/nonexistentPath", "somevalue"); + ops.add(replaceOperation3); + ReplaceOperation replaceOperation4 = new ReplaceOperation("/certificate", false); + ops.add(replaceOperation4); + patchBody = getPatchContent(ops); + + // The 3rd operation should result in bad request + getClient(token).perform(patch("/api/eperson/epersons/" + ePerson.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isBadRequest()); + + // The value of canLogIn should equal the previously initialized value. + getClient(token).perform(get("/api/eperson/epersons/" + ePerson.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.canLogIn", Matchers.is(true))); + + } + } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java index 537876e397..b75c9cf7bb 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java @@ -10,14 +10,17 @@ package org.dspace.app.rest; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.UUID; +import com.fasterxml.jackson.databind.ObjectMapper; import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.matcher.GroupMatcher; +import org.dspace.app.rest.model.GroupRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.eperson.Group; import org.hamcrest.Matchers; @@ -29,6 +32,66 @@ import org.junit.Test; public class GroupRestRepositoryIT extends AbstractControllerIntegrationTest { + @Test + public void createTest() + throws Exception { + + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = new GroupRest(); + String groupName = "testGroup1"; + + groupRest.setName(groupName); + + String authToken = getAuthToken(admin.getEmail(), password); + getClient(authToken).perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isCreated()); + + getClient(authToken).perform(get("/api/eperson/groups")) + //The status has to be 200 OK + .andExpect(status().isOk()) + .andExpect(content().contentType(contentType)) + .andExpect(jsonPath("$._embedded.groups", Matchers.containsInAnyOrder( + GroupMatcher.matchGroupWithName(groupName), + GroupMatcher.matchGroupWithName("Administrator"), + GroupMatcher.matchGroupWithName("Anonymous")))); + + } + + @Test + public void createUnauthauthorizedTest() + throws Exception { + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = new GroupRest(); + String groupName = "testGroupUnauth1"; + + groupRest.setName(groupName); + + String authToken = getAuthToken(eperson.getEmail(), password); + + getClient().perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isUnauthorized()); + + } + + @Test + public void createForbiddenTest() + throws Exception { + ObjectMapper mapper = new ObjectMapper(); + GroupRest groupRest = new GroupRest(); + String groupName = "testGroupForbidden1"; + + groupRest.setName(groupName); + + String authToken = getAuthToken(eperson.getEmail(), password); + + authToken = getAuthToken(eperson.getEmail(), password); + getClient(authToken).perform(post("/api/eperson/groups") + .content(mapper.writeValueAsBytes(groupRest)).contentType(contentType)) + .andExpect(status().isForbidden()); + } + @Test public void findAllTest() throws Exception { diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index cf0cbfc429..55de139f29 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -89,11 +89,15 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(get("/api/core/items")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.items", Matchers.containsInAnyOrder( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, + "Public item 3", "2016-02-13") ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) .andExpect(jsonPath("$.page.size", is(20))) .andExpect(jsonPath("$.page.totalElements", is(3))) ; @@ -143,15 +147,19 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .param("size", "2")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.items", Matchers.containsInAnyOrder( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ))) .andExpect(jsonPath("$._embedded.items", Matchers.not( - Matchers.contains( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13") - ) + Matchers.contains( + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, + "Public item 3", "2016-02-13") + ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) ; getClient(token).perform(get("/api/core/items") @@ -159,15 +167,19 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .param("page", "1")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.items", Matchers.contains( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, "Public item 3", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem3, + "Public item 3", "2016-02-13") ))) .andExpect(jsonPath("$._embedded.items", Matchers.not( Matchers.contains( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17"), - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17"), + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) .andExpect(jsonPath("$.page.size", is(2))) .andExpect(jsonPath("$.page.totalElements", is(3))) ; @@ -214,14 +226,17 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(get("/api/core/items/" + publicItem1.getID())) .andExpect(status().isOk()) .andExpect(jsonPath("$", Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17") ))) .andExpect(jsonPath("$", Matchers.not( Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) ; } @@ -277,14 +292,18 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(get("/api/core/items/" + publicItem1.getID())) .andExpect(status().isOk()) .andExpect(jsonPath("$", Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem1, "Public item 1", "2017-10-17") + ItemMatcher + .matchItemWithTitleAndDateIssued(publicItem1, + "Public item 1", "2017-10-17") ))) .andExpect(jsonPath("$", Matchers.not( Matchers.is( - ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, "Public item 2", "2016-02-13") + ItemMatcher.matchItemWithTitleAndDateIssued(publicItem2, + "Public item 2", "2016-02-13") ) ))) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/items"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/items"))) ; getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/bitstreams")) @@ -297,11 +316,12 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/owningCollection")) .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) - .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/core/collections"))) + .andExpect(jsonPath("$._links.self.href", + Matchers.containsString("/api/core/collections"))) ; getClient().perform(get("/api/core/items/" + publicItem1.getID() + "/templateItemOf")) - .andExpect(status().isNoContent()) + .andExpect(status().isNoContent()); ; } @@ -536,7 +556,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isBadRequest()); + .andExpect(status().isBadRequest()); // check item status after the failed patch (it must be unchanged) getClient(token).perform(get("/api/core/items/" + item2.getID())) @@ -694,7 +714,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .andExpect(status().isForbidden()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) @@ -750,8 +770,8 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { // make discoverable an already discoverable item is a no-op getClient(token).perform(patch("/api/core/items/" + item.getID()) - .content(patchBody) - .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) .andExpect(jsonPath("$.discoverable", Matchers.is(true))); @@ -877,9 +897,56 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) - .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + + // check item status after the patch + getClient(token).perform(get("/api/core/items/" + item.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); + + } + + + @Test + public void useStringForBooleanTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and one collection. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + //2. One public item + Item item = ItemBuilder.createItem(context, col1) + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + List ops = new ArrayList(); + // String value should work. + ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", "false"); + ops.add(replaceOperation); + String patchBody = getPatchContent(ops); + + // make private + getClient(token).perform(patch("/api/core/items/" + item.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.uuid", Matchers.is(item.getID().toString()))) + .andExpect(jsonPath("$.discoverable", Matchers.is(false))); // check item status after the patch getClient(token).perform(get("/api/core/items/" + item.getID())) @@ -922,7 +989,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient().perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isUnauthorized()); + .andExpect(status().isUnauthorized()); // check item status after the failed patch getClient(token).perform(get("/api/core/items/" + item.getID())) @@ -966,7 +1033,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(patch("/api/core/items/" + item.getID()) .content(patchBody) .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) - .andExpect(status().isForbidden()); + .andExpect(status().isForbidden()); // check item status after the failed patch getClient(tokenAdmin).perform(get("/api/core/items/" + item.getID())) @@ -1053,15 +1120,16 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { parentCommunity = CommunityBuilder.createCommunity(context) .withName("Parent Community") .build(); - Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1").build(); + Collection col1 = CollectionBuilder + .createCollection(context, parentCommunity).withName("Collection 1").build(); //2. One public item, one workspace item and one template item. Item publicItem = ItemBuilder.createItem(context, col1) - .withTitle("Public item 1") - .withIssueDate("2017-10-17") - .withAuthor("Smith, Donald").withAuthor("Doe, John") - .withSubject("ExtraEntry") - .build(); + .withTitle("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); //Add a bitstream to an item String bitstreamContent = "ThisIsSomeDummyText"; @@ -1083,13 +1151,13 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(status().isOk()) .andExpect(content().contentType(contentType)) .andExpect(jsonPath("$._links.self.href", Matchers - .containsString("/api/core/items/" + publicItem.getID() + "/bitstreams"))); + .containsString("/api/core/items/" + publicItem.getID() + "/bitstreams"))); String token = getAuthToken(admin.getEmail(), password); //Delete public item getClient(token).perform(delete("/api/core/items/" + publicItem.getID())) - .andExpect(status().is(204)); + .andExpect(status().is(204)); //Trying to get deleted item should fail with 404 getClient().perform(get("/api/core/items/" + publicItem.getID())) @@ -1139,7 +1207,8 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { .withName("Parent Community") .build(); - Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1").build(); + Collection col1 = CollectionBuilder + .createCollection(context, parentCommunity).withName("Collection 1").build(); //2. One workspace item. WorkspaceItem workspaceItem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) @@ -1153,7 +1222,7 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { //Check workspaceItem is available after failed deletion getClient(token).perform(get("/api/core/items/" + workspaceItem.getItem().getID())) - .andExpect(status().isOk()); + .andExpect(status().isOk()); } @Test @@ -1345,4 +1414,4 @@ public class ItemRestRepositoryIT extends AbstractControllerIntegrationTest { Matchers.containsString("/api/core/items"))); } -} +} \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java index 48f805bd13..bf19b4b9c5 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/RootRestResourceControllerIT.java @@ -34,25 +34,25 @@ public class RootRestResourceControllerIT extends AbstractControllerIntegrationT //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) //Check that all required root links are present and that they are absolute - .andExpect(jsonPath("$._links.authorities.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.bitstreamformats.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.bitstreams.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.browses.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.collections.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.communities.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.epersons.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.groups.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.items.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.metadatafields.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.metadataschemas.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.resourcePolicies.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.sites.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissiondefinitions.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissionforms.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissionsections.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.submissionuploads.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.workspaceitems.href", startsWith(REST_SERVER_URL))) - .andExpect(jsonPath("$._links.authn.href", startsWith(REST_SERVER_URL))) + .andExpect(jsonPath("$._links.authorities.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.bitstreamformats.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.bitstreams.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.browses.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.collections.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.communities.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.epersons.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.groups.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.items.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.metadatafields.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.metadataschemas.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.resourcePolicies.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.sites.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissiondefinitions.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissionforms.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissionsections.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.submissionuploads.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.workspaceitems.href", startsWith(BASE_REST_SERVER_URL))) + .andExpect(jsonPath("$._links.authn.href", startsWith(BASE_REST_SERVER_URL))) ; } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java index 1069e95f51..553251633f 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java @@ -129,11 +129,8 @@ public class SubmissionDefinitionsControllerIT extends AbstractControllerIntegra //Match only that a section exists with a submission configuration behind getClient(token).perform(get("/api/config/submissiondefinitions/traditional/collections")) - //TODO - this method should return an empty page - .andExpect(status().isNoContent()); - //this is the expected result - //.andExpect(status().isOk()) - //.andExpect(jsonPath("$.page.totalElements", is(0))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java index 3e3d993602..1d1b0d5ac8 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java @@ -7,7 +7,8 @@ */ package org.dspace.app.rest; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -15,6 +16,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import org.dspace.app.rest.matcher.SubmissionFormFieldMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.hamcrest.Matchers; import org.junit.Test; @@ -25,7 +27,6 @@ import org.junit.Test; */ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTest { - @Test public void findAll() throws Exception { //When we call the root endpoint as anonymous user @@ -42,18 +43,15 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe .andExpect(status().isOk()) //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) - - //By default we expect at least 1 submission forms so this to be reflected in the page object + //The configuration file for the test env includes 3 forms .andExpect(jsonPath("$.page.size", is(20))) - .andExpect(jsonPath("$.page.totalElements", greaterThanOrEqualTo(1))) - .andExpect(jsonPath("$.page.totalPages", greaterThanOrEqualTo(1))) + .andExpect(jsonPath("$.page.totalElements", equalTo(3))) + .andExpect(jsonPath("$.page.totalPages", equalTo(1))) .andExpect(jsonPath("$.page.number", is(0))) .andExpect( jsonPath("$._links.self.href", Matchers.startsWith(REST_SERVER_URL + "config/submissionforms"))) - - //The array of browse index should have a size greater or equals to 1 - .andExpect(jsonPath("$._embedded.submissionforms", hasSize(greaterThanOrEqualTo(1)))) - + //The array of submissionforms should have a size of 3 + .andExpect(jsonPath("$._embedded.submissionforms", hasSize(equalTo(3)))) ; } @@ -64,7 +62,6 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe //The status has to be 403 Not Authorized .andExpect(status().isUnauthorized()); - String token = getAuthToken(admin.getEmail(), password); getClient(token).perform(get("/api/config/submissionforms/traditionalpageone")) @@ -72,13 +69,30 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe .andExpect(status().isOk()) //We expect the content type to be "application/hal+json;charset=UTF-8" .andExpect(content().contentType(contentType)) - //Check that the JSON root matches the expected "traditionalpageone" input forms .andExpect(jsonPath("$.id", is("traditionalpageone"))) .andExpect(jsonPath("$.name", is("traditionalpageone"))) .andExpect(jsonPath("$.type", is("submissionform"))) .andExpect(jsonPath("$._links.self.href", Matchers .startsWith(REST_SERVER_URL + "config/submissionforms/traditionalpageone"))) + // check the first two rows + .andExpect(jsonPath("$.rows[0].fields", contains( + SubmissionFormFieldMatcher.matchFormFieldDefinition("name", "Authors", null, true, + "Enter the names of the authors of this item.", "dc.contributor.author")))) + .andExpect(jsonPath("$.rows[1].fields", contains( + SubmissionFormFieldMatcher.matchFormFieldDefinition("onebox", "Title", + "You must enter a main title for this item.", false, + "Enter the main title of the item.", "dc.title")))) + // check a row with multiple fields + .andExpect(jsonPath("$.rows[3].fields", + contains( + SubmissionFormFieldMatcher.matchFormFieldDefinition("date", "Date of Issue", + "You must enter at least the year.", false, + "Please give the date", "col-sm-4", + "dc.date.issued"), + SubmissionFormFieldMatcher.matchFormFieldDefinition("onebox", "Publisher", null, false, + "Enter the name of", "col-sm-8", + "dc.publisher")))) ; } } \ No newline at end of file diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java new file mode 100644 index 0000000000..885ad2d123 --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java @@ -0,0 +1,1668 @@ +/** + * 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; + +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static org.hamcrest.Matchers.is; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.ws.rs.core.MediaType; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.CharEncoding; +import org.dspace.app.rest.builder.BitstreamBuilder; +import org.dspace.app.rest.builder.CollectionBuilder; +import org.dspace.app.rest.builder.CommunityBuilder; +import org.dspace.app.rest.builder.EPersonBuilder; +import org.dspace.app.rest.builder.WorkspaceItemBuilder; +import org.dspace.app.rest.matcher.CollectionMatcher; +import org.dspace.app.rest.matcher.ItemMatcher; +import org.dspace.app.rest.matcher.WorkspaceItemMatcher; +import org.dspace.app.rest.model.patch.AddOperation; +import org.dspace.app.rest.model.patch.Operation; +import org.dspace.app.rest.model.patch.RemoveOperation; +import org.dspace.app.rest.model.patch.ReplaceOperation; +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.content.Bitstream; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.content.WorkspaceItem; +import org.dspace.eperson.EPerson; +import org.hamcrest.Matchers; +import org.junit.Test; +import org.springframework.mock.web.MockMultipartFile; + +/** + * Test suite for the WorkspaceItem endpoint + * @author Andrea Bollini (andrea.bollini at 4science.it) + * + */ +public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegrationTest { + + @Test + /** + * All the workspaceitem should be returned regardless of the collection where they were created + * + * @throws Exception + */ + public void findAllTest() throws Exception { + context.setCurrentUser(admin); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + + //2. Three workspace items in two different collections + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 2") + .withIssueDate("2016-02-13") + .build(); + + WorkspaceItem workspaceItem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 3") + .withIssueDate("2016-02-13") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/submission/workspaceitems")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", Matchers.containsInAnyOrder( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", + "2016-02-13")))) + .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/submission/workspaceitems"))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(3))); + } + + @Test + /** + * The workspaceitem endpoint must provide proper pagination + * + * @throws Exception + */ + public void findAllWithPaginationTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + + //2. Three workspace items in two different collections + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 2") + .withIssueDate("2016-02-13") + .build(); + + WorkspaceItem workspaceItem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 3") + .withIssueDate("2016-02-13") + .build(); + + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/submission/workspaceitems").param("size", "2")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.containsInAnyOrder( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains(WorkspaceItemMatcher + .matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", "2016-02-13"))))); + + getClient(token).perform(get("/api/submission/workspaceitems").param("size", "2").param("page", "1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.contains(WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, + "Workspace Item 3", "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13"))))) + .andExpect(jsonPath("$.page.size", is(2))).andExpect(jsonPath("$.page.totalElements", is(3))); + } + + @Test + /** + * The workspaceitem resource endpoint must expose the proper structure + * + * @throws Exception + */ + public void findOneTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + //2. a workspace item + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())).andExpect(status().isOk()) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "Workspace Item 1", "2017-10-17", "ExtraEntry")))); + } + + @Test + /** + * The workspaceitem resource endpoint must expose the proper structure + * + * @throws Exception + */ + public void findOneRelsTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + //2. a workspace item + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID() + "/collection")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", Matchers + .is(CollectionMatcher.matchCollectionEntry(col1.getName(), col1.getID(), col1.getHandle())))); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID() + "/item")).andExpect(status().isOk()) + .andExpect(jsonPath("$", Matchers.is(ItemMatcher.matchItemWithTitleAndDateIssued(witem.getItem(), + "Workspace Item 1", "2017-10-17")))); + + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID() + "/submissionDefinition")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", Matchers.is(hasJsonPath("$.id", is("traditional"))))); + + } + + @Test + /** + * Check the response code for unexistent workspaceitem + * + * @throws Exception + */ + public void findOneWrongUUIDTest() throws Exception { + String token = getAuthToken(admin.getEmail(), password); + + getClient(token).perform(get("/api/submission/workspaceitems/" + UUID.randomUUID())) + .andExpect(status().isNotFound()); + } + + @Test + /** + * Removing a workspaceitem should result in delete of all the underline resources (item and bitstreams) + * + * @throws Exception + */ + public void deleteOneTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community with one collection. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, parentCommunity).withName("Collection 1").build(); + + //2. a workspace item + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + Item item = witem.getItem(); + + //Add a bitstream to the item + String bitstreamContent = "ThisIsSomeDummyText"; + Bitstream bitstream = null; + try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) { + bitstream = BitstreamBuilder + .createBitstream(context, item, is) + .withName("Bitstream1") + .withMimeType("text/plain").build(); + } + + String token = getAuthToken(admin.getEmail(), password); + + //Delete the workspaceitem + getClient(token).perform(delete("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().is(204)); + + //Trying to get deleted item should fail with 404 + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().is(404)); + + //Trying to get deleted workspaceitem's item should fail with 404 + getClient().perform(get("/api/core/items/" + item.getID())) + .andExpect(status().is(404)); + + //Trying to get deleted workspaceitem's bitstream should fail with 404 + getClient().perform(get("/api/core/biststreams/" + bitstream.getID())) + .andExpect(status().is(404)); + } + + @Test + /** + * Create three workspaceitem with two different submitter and verify that the findBySubmitter return the proper + * list of workspaceitem for each submitter also paginating + * + * @throws Exception + */ + public void findBySubmitterTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + //2. create two users to use as submitters + EPerson submitter1 = EPersonBuilder.createEPerson(context) + .withEmail("submitter1@example.com") + .build(); + EPerson submitter2 = EPersonBuilder.createEPerson(context) + .withEmail("submitter2@example.com") + .build(); + + // create two workspaceitems with the first submitter + context.setCurrentUser(submitter1); + + + //3. Two workspace items in two different collections + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 2") + .withIssueDate("2016-02-13") + .build(); + + //4. A workspaceitem for the second submitter + context.setCurrentUser(submitter2); + WorkspaceItem workspaceItem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col2) + .withTitle("Workspace Item 3") + .withIssueDate("2016-02-13") + .build(); + + // use our admin to retrieve all the workspace by submitter + String token = getAuthToken(admin.getEmail(), password); + + // the first submitter has two workspace + getClient(token).perform(get("/api/submission/workspaceitems/search/findBySubmitter") + .param("size", "20") + .param("uuid", submitter1.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.containsInAnyOrder( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, "Workspace Item 2", + "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains(WorkspaceItemMatcher + .matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", "2016-02-13"))))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(2))); + + // the first submitter has two workspace so if we paginate with a 1-size windows the page 1 will contains the + // second workspace + getClient(token).perform(get("/api/submission/workspaceitems/search/findBySubmitter") + .param("size", "1") + .param("page", "1") + .param("uuid", submitter1.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.contains(WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem2, + "Workspace Item 2", "2016-02-13")))) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.not(Matchers.contains( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem1, "Workspace Item 1", + "2017-10-17"), + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", + "2016-02-13"))))) + .andExpect(jsonPath("$.page.size", is(1))) + .andExpect(jsonPath("$.page.totalElements", is(2))); + + // the second submitter has a single workspace + getClient(token).perform(get("/api/submission/workspaceitems/search/findBySubmitter") + .param("size", "20") + .param("uuid", submitter2.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems", + Matchers.contains( + WorkspaceItemMatcher.matchItemWithTitleAndDateIssued(workspaceItem3, "Workspace Item 3", + "2016-02-13")))) + .andExpect(jsonPath("$.page.size", is(20))) + .andExpect(jsonPath("$.page.totalElements", is(1))); + } + + @Test + /** + * Test the creation of workspaceitem POSTing to the resource collection endpoint. It should respect the collection + * param if present or use a default if it is not used + * + * @throws Exception + */ + public void createEmptyWorkspateItemTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + // create a workspaceitem explicitly in the col1 + getClient(authToken).perform(post("/api/submission/workspaceitems") + .param("collection", col1.getID().toString())) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$._embedded.collection.id", is(col1.getID().toString()))); + + // create a workspaceitem explicitly in the col2 + getClient(authToken).perform(post("/api/submission/workspaceitems") + .param("collection", col2.getID().toString())) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$._embedded.collection.id", is(col2.getID().toString()))); + + // create a workspaceitem without an explicit collection, this will go in the first valid collection for the + // user: the col1 + getClient(authToken).perform(post("/api/submission/workspaceitems")) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$._embedded.collection.id", is(col1.getID().toString()))); + + // TODO cleanup the context!!! + } + + @Test + /** + * Test the creation of workspaceitems POSTing to the resource collection endpoint a bibtex file + * + * @throws Exception + */ + public void createMultipleWorkspaceItemFromFileTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + Collection col2 = CollectionBuilder.createCollection(context, child1).withName("Collection 2").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + InputStream bibtex = getClass().getResourceAsStream("bibtex-test.bib"); + final MockMultipartFile bibtexFile = new MockMultipartFile("file", "bibtex-test.bib", "application/x-bibtex", + bibtex); + + // bulk create workspaceitems in the default collection (col1) + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile)) + // bulk create should return 200, 201 (created) is better for single resource + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][0].value", + is("My Article"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[0]._embedded.collection.id", is(col1.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[1].sections.traditionalpageone['dc.title'][0].value", + is("My Article 2"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[1]._embedded.collection.id", is(col1.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[2].sections.traditionalpageone['dc.title'][0].value", + is("My Article 3"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[2]._embedded.collection.id", is(col1.getID().toString()))) + .andExpect( + jsonPath("$._embedded.workspaceitems[*]._embedded.upload").doesNotExist()) + ; + + // bulk create workspaceitems explicitly in the col2 + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile) + .param("collection", col2.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][0].value", + is("My Article"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[0]._embedded.collection.id", is(col2.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[1].sections.traditionalpageone['dc.title'][0].value", + is("My Article 2"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[1]._embedded.collection.id", is(col2.getID().toString()))) + .andExpect(jsonPath("$._embedded.workspaceitems[2].sections.traditionalpageone['dc.title'][0].value", + is("My Article 3"))) + .andExpect( + jsonPath("$._embedded.workspaceitems[2]._embedded.collection.id", is(col2.getID().toString()))) + .andExpect( + jsonPath("$._embedded.workspaceitems[*]._embedded.upload").doesNotExist()) + ; + + bibtex.close(); + } + + @Test + /** + * Test the creation of a workspaceitem POSTing to the resource collection endpoint a PDF file. As a single item + * will be created we expect to have the pdf file stored as a bitstream + * + * @throws Exception + */ + public void createWorkspaceItemFromPDFFileTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + InputStream pdf = getClass().getResourceAsStream("simple-article.pdf"); + final MockMultipartFile pdfFile = new MockMultipartFile("file", "/local/path/myfile.pdf", "application/pdf", + pdf); + + // bulk create a workspaceitem + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(pdfFile)) + // bulk create should return 200, 201 (created) is better for single resource + .andExpect(status().isOk()) + //FIXME it will be nice to setup a mock grobid server for end to end testing + // no metadata for now +// .andExpect(jsonPath("$._embedded.workspaceitems[0]._embedded.traditionalpageone['dc.title'][0].value", +// is("This is a simple test file"))) + // we can just check that the pdf is stored in the item + .andExpect( + jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0].metadata['dc.title'][0].value", + is("myfile.pdf"))) + .andExpect(jsonPath( + "$._embedded.workspaceitems[0].sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/myfile.pdf"))) + ; + + pdf.close(); + } + + @Test + /** + * Test the exposition of validation error for missing required metadata both at the creation time than on existent + * workspaceitems + * + * @throws Exception + */ + public void validationErrorsRequiredMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem workspaceItem1 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .build(); + + getClient(authToken).perform(get("/api/submission/workspaceitems/" + workspaceItem1.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + ; + + WorkspaceItem workspaceItem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 2") + .build(); + + getClient(authToken).perform(get("/api/submission/workspaceitems/" + workspaceItem2.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(false))) + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains( + hasJsonPath("$.paths", Matchers.contains( + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.date.issued")) + ))))) + ; + + // create an empty workspaceitem explicitly in the col1, check validation on creation + getClient(authToken).perform(post("/api/submission/workspaceitems") + .param("collection", col1.getID().toString())) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.status", is(false))) + // title and author are required in the first panel + // the json path with a @ selector always return an array + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains( + hasJsonPath("$.paths", Matchers.containsInAnyOrder( + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.title")), + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.date.issued")) + ))))) + ; + } + + @Test + /** + * Test the update of metadata + * + * @throws Exception + */ + public void patchUpdateMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("ExtraEntry") + .build(); + + // a simple patch to update an existent metadata + List updateTitle = new ArrayList(); + Map value = new HashMap(); + value.put("value", "New Title"); + updateTitle.add(new ReplaceOperation("/sections/traditionalpageone/dc.title/0", value)); + + String patchBody = getPatchContent(updateTitle); + + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + // check the new title and untouched values + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))); + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))) + ; + } + + @Test + /** + * Test delete of a metadata + * + * @throws Exception + */ + public void patchDeleteMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("ExtraEntry") + .build(); + + WorkspaceItem witemMultipleSubjects = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("Subject1") + .withSubject("Subject2") + .withSubject("Subject3") + .withSubject("Subject4") + .build(); + + WorkspaceItem witemWithTitleDateAndSubjects = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Workspace Item 1") + .withIssueDate("2017-10-17") + .withSubject("Subject1") + .withSubject("Subject2") + .withSubject("Subject3") + .withSubject("Subject4") + .build(); + + // try to remove the title + List removeTitle = new ArrayList(); + removeTitle.add(new RemoveOperation("/sections/traditionalpageone/dc.title/0")); + + String patchBody = getPatchContent(removeTitle); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(false))) + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains(hasJsonPath("$.paths", + Matchers.contains( + hasJsonPath("$", + Matchers.is("/sections/traditionalpageone/dc.title"))))))) + .andExpect(jsonPath("$", + // check the new title and untouched values + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + null, "2017-10-17", "ExtraEntry")))); + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(false))) + .andExpect(jsonPath("$.errors[?(@.message=='error.validation.required')]", + Matchers.contains( + hasJsonPath("$.paths", Matchers.contains( + hasJsonPath("$", Matchers.is("/sections/traditionalpageone/dc.title")) + ))))) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + null, "2017-10-17", "ExtraEntry")))) + ; + + // try to remove a metadata in a specific position + List removeMidSubject = new ArrayList(); + removeMidSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/1")); + + patchBody = getPatchContent(removeMidSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Subject4"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Subject4"))) + ; + + List removeFirstSubject = new ArrayList(); + removeFirstSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/0")); + + patchBody = getPatchContent(removeFirstSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject4"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject4"))) + ; + + List removeLastSubject = new ArrayList(); + removeLastSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/1")); + + patchBody = getPatchContent(removeLastSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject3"))) + ; + + List removeFinalSubject = new ArrayList(); + removeFinalSubject.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject/0")); + + patchBody = getPatchContent(removeFinalSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemMultipleSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemMultipleSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + + // remove all the subjects with a single operation + List removeSubjectsAllAtOnce = new ArrayList(); + removeSubjectsAllAtOnce.add(new RemoveOperation("/sections/traditionalpagetwo/dc.subject")); + + patchBody = getPatchContent(removeSubjectsAllAtOnce); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witemWithTitleDateAndSubjects.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witemWithTitleDateAndSubjects.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject']").doesNotExist()) + ; + } + + @Test + /** + * Test the addition of metadata + * + * @throws Exception + */ + public void patchAddMetadataTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withIssueDate("2017-10-17") + .withSubject("ExtraEntry") + .build(); + + + // try to add the title + List addTitle = new ArrayList(); + // create a list of values to use in add operation + List> values = new ArrayList>(); + Map value = new HashMap(); + value.put("value", "New Title"); + values.add(value); + addTitle.add(new AddOperation("/sections/traditionalpageone/dc.title", values)); + + String patchBody = getPatchContent(addTitle); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + // check if the new title if back and the other values untouched + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))); + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$", + Matchers.is(WorkspaceItemMatcher.matchItemWithTitleAndDateIssuedAndSubject(witem, + "New Title", "2017-10-17", "ExtraEntry")))) + ; + } + + @Test + /** + * Test the addition of metadata + * + * @throws Exception + */ + public void patchAddMultipleMetadataValuesTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .build(); + + // try to add multiple subjects at once + List addSubjects = new ArrayList(); + // create a list of values to use in add operation + List> values = new ArrayList>(); + Map value1 = new HashMap(); + value1.put("value", "Subject1"); + Map value2 = new HashMap(); + value2.put("value", "Subject2"); + values.add(value1); + values.add(value2); + + addSubjects.add(new AddOperation("/sections/traditionalpagetwo/dc.subject", values)); + + String patchBody = getPatchContent(addSubjects); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject2"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject2"))) + ; + + // add a subject in the first position + List addFirstSubject = new ArrayList(); + Map firstSubject = new HashMap(); + firstSubject.put("value", "First Subject"); + + addFirstSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/0", firstSubject)); + + patchBody = getPatchContent(addFirstSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Subject2"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Subject2"))) + ; + + // add a subject in a central position + List addMidSubject = new ArrayList(); + Map midSubject = new HashMap(); + midSubject.put("value", "Mid Subject"); + + addMidSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/2", midSubject)); + + patchBody = getPatchContent(addMidSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", + is("Subject2"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", is("Subject2"))) + ; + + // append a last subject without specifying the index + List addLastSubject = new ArrayList(); + Map lastSubject = new HashMap(); + lastSubject.put("value", "Last Subject"); + + addLastSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/4", lastSubject)); + + patchBody = getPatchContent(addLastSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", + is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", + is("Last Subject"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", is("Last Subject"))) + ; + + // append a last subject without specifying the index + List addFinalSubject = new ArrayList(); + Map finalSubject = new HashMap(); + finalSubject.put("value", "Final Subject"); + + addFinalSubject.add(new AddOperation("/sections/traditionalpagetwo/dc.subject/-", finalSubject)); + + patchBody = getPatchContent(addFinalSubject); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", + is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", + is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", + is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", + is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", + is("Last Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][5].value", + is("Final Subject"))) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is("First Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][1].value", is("Subject1"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][2].value", is("Mid Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][3].value", is("Subject2"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][4].value", is("Last Subject"))) + .andExpect(jsonPath("$.sections.traditionalpagetwo['dc.subject'][5].value", is("Final Subject"))) + ; + } + + @Test + /** + * Test the acceptance of the deposit license + * + * @throws Exception + */ + public void patchAcceptLicenseTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem witem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 2") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem witem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 3") + .withIssueDate("2017-10-17") + .build(); + + WorkspaceItem witem4 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 4") + .withIssueDate("2017-10-17") + .build(); + + // check that our workspaceitems come without a license (all are build in the same way, just check the first) + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to grant the license with an add operation + List addGrant = new ArrayList(); + addGrant.add(new AddOperation("/sections/license/granted", true)); + + String patchBody = getPatchContent(addGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to grant the license with an add operation supplying a string instead than a boolean + List addGrantString = new ArrayList(); + addGrantString.add(new AddOperation("/sections/license/granted", "true")); + + patchBody = getPatchContent(addGrantString); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem2.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem2.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to grant the license with a replace operation + List replaceGrant = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", true)); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem3.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem3.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to grant the license with a replace operation supplying a string + List replaceGrantString = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", "true")); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem4.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem4.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + } + + @Test + /** + * Test the reject of the deposit license + * + * @throws Exception + */ + public void patchRejectLicenseTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + WorkspaceItem witem2 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 2") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + WorkspaceItem witem3 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 3") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + WorkspaceItem witem4 = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem 4") + .withIssueDate("2017-10-17") + .grantLicense() + .build(); + + // check that our workspaceitems come with a license (all are build in the same way, just check the first) + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.license.granted", + is(true))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isNotEmpty()) + .andExpect(jsonPath("$.sections.license.url").isNotEmpty()) + ; + + // try to reject the license with an add operation + List addGrant = new ArrayList(); + addGrant.add(new AddOperation("/sections/license/granted", false)); + + String patchBody = getPatchContent(addGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to reject the license with an add operation supplying a string instead than a boolean + List addGrantString = new ArrayList(); + addGrantString.add(new AddOperation("/sections/license/granted", "false")); + + patchBody = getPatchContent(addGrantString); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem2.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem2.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to reject the license with a replace operation + List replaceGrant = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", false)); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem3.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem3.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // try to reject the license with a replace operation supplying a string + List replaceGrantString = new ArrayList(); + replaceGrant.add(new ReplaceOperation("/sections/license/granted", "false")); + + patchBody = getPatchContent(replaceGrant); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem4.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + // verify that the patch changes have been persisted + getClient().perform(get("/api/submission/workspaceitems/" + witem4.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is(true))) + .andExpect(jsonPath("$.errors").doesNotExist()) + .andExpect(jsonPath("$.sections.license.granted", + is(false))) + .andExpect(jsonPath("$.sections.license.acceptanceDate").isEmpty()) + .andExpect(jsonPath("$.sections.license.url").isEmpty()) + ; + + } + + @Test + /** + * Test update of bitstream metadata in the upload section + * + * @throws Exception + */ + public void patchUploadTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + InputStream pdf = getClass().getResourceAsStream("simple-article.pdf"); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .withFulltext("simple-article.pdf", "/local/path/simple-article.pdf", pdf) + .build(); + + // check the file metadata + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("simple-article.pdf"))) + ; + + // try to change the filename and add a description + List addOpts = new ArrayList(); + Map value = new HashMap(); + value.put("value", "newfilename.pdf"); + Map valueDesc = new HashMap(); + valueDesc.put("value", "Description"); + List valueDescs = new ArrayList(); + valueDescs.add(valueDesc); + addOpts.add(new AddOperation("/sections/upload/files/0/metadata/dc.title/0", value)); + addOpts.add(new AddOperation("/sections/upload/files/0/metadata/dc.description", valueDescs)); + + String patchBody = getPatchContent(addOpts); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + // is the source still here? + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + // check the new filename + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + // check the description + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description'][0].value", + is("Description"))) + ; + + // check that changes persist + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description'][0].value", + is("Description"))) + ; + + // try to remove the description and the source now + List removeOpts = new ArrayList(); + removeOpts.add(new RemoveOperation("/sections/upload/files/0/metadata/dc.source/0")); + removeOpts.add(new RemoveOperation("/sections/upload/files/0/metadata/dc.description")); + + patchBody = getPatchContent(removeOpts); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + // check the removed source + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source']").doesNotExist()) + // check the filename still here + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + // check the removed description + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description']").doesNotExist()) + ; + + // check that changes persist + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source']").doesNotExist()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("newfilename.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.description']").doesNotExist()) ; + + // try to update the filename with an update opt + List updateOpts = new ArrayList(); + Map updateValue = new HashMap(); + updateValue.put("value", "another-filename.pdf"); + updateOpts.add(new ReplaceOperation("/sections/upload/files/0/metadata/dc.title/0", updateValue)); + + patchBody = getPatchContent(updateOpts); + getClient(authToken).perform(patch("/api/submission/workspaceitems/" + witem.getID()) + .content(patchBody) + .contentType(MediaType.APPLICATION_JSON_PATCH_JSON)) + .andExpect(status().isOk()) + // check the filename still here + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("another-filename.pdf"))) + ; + + // check that changes persist + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("another-filename.pdf"))) + ; + } + + @Test + /** + * Test the upload of files in the upload over section + * + * @throws Exception + */ + public void uploadTest() throws Exception { + context.turnOffAuthorisationSystem(); + + //** GIVEN ** + //1. A community-collection structure with one parent community with sub-community and two collections. + parentCommunity = CommunityBuilder.createCommunity(context) + .withName("Parent Community") + .build(); + Community child1 = CommunityBuilder.createSubCommunity(context, parentCommunity) + .withName("Sub Community") + .build(); + Collection col1 = CollectionBuilder.createCollection(context, child1).withName("Collection 1").build(); + + String authToken = getAuthToken(admin.getEmail(), password); + + WorkspaceItem witem = WorkspaceItemBuilder.createWorkspaceItem(context, col1) + .withTitle("Test WorkspaceItem") + .withIssueDate("2017-10-17") + .build(); + + InputStream pdf = getClass().getResourceAsStream("simple-article.pdf"); + final MockMultipartFile pdfFile = new MockMultipartFile("file", "/local/path/simple-article.pdf", + "application/pdf", pdf); + + // upload the file in our workspaceitem + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems/" + witem.getID()) + .file(pdfFile)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("simple-article.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + ; + + // check the file metadata + getClient().perform(get("/api/submission/workspaceitems/" + witem.getID())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.title'][0].value", + is("simple-article.pdf"))) + .andExpect(jsonPath("$.sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/simple-article.pdf"))) + ; + } + +} diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java index 29a219810e..52deeae173 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java @@ -12,7 +12,7 @@ import java.util.LinkedList; import java.util.List; import org.apache.commons.collections4.CollectionUtils; -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.authorize.service.ResourcePolicyService; @@ -79,7 +79,7 @@ public abstract class AbstractBuilder { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractDSpaceObjectBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceObjectBuilder.class); protected AbstractBuilder(Context context) { this.context = context; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java index 9d1322bcb4..f74d09adfc 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.builder; import java.util.Date; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.ResourcePolicy; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -34,7 +34,7 @@ public abstract class AbstractDSpaceObjectBuilder extends AbstractBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(AbstractDSpaceObjectBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(AbstractDSpaceObjectBuilder.class); protected AbstractDSpaceObjectBuilder(Context context) { super(context); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java index ddca4e622a..b0d169bfb8 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.builder; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.BitstreamFormat; import org.dspace.core.Context; @@ -22,7 +22,7 @@ import org.dspace.service.DSpaceCRUDService; public class BitstreamFormatBuilder extends AbstractCRUDBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(BitstreamFormatBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamFormatBuilder.class); private BitstreamFormat bitstreamFormat; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java index 78e9d858bf..10c04479e9 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java @@ -78,6 +78,11 @@ public class EPersonBuilder extends AbstractDSpaceObjectBuilder { return this; } + public EPersonBuilder withNetId(final String netId) { + ePerson.setNetid(netId); + return this; + } + public EPersonBuilder withPassword(final String password) { ePerson.setCanLogIn(true); ePersonService.setPassword(ePerson, password); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java index 42f9c10752..061e5f7c0d 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java @@ -10,7 +10,7 @@ package org.dspace.app.rest.builder; import java.io.IOException; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.MetadataField; import org.dspace.content.MetadataSchema; @@ -22,7 +22,7 @@ import org.dspace.discovery.SearchServiceException; public class MetadataFieldBuilder extends AbstractBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(MetadataFieldBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataFieldBuilder.class); private MetadataField metadataField; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java index 5b42f0b24a..3f060accc4 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/MetadataSchemaBuilder.java @@ -9,7 +9,7 @@ package org.dspace.app.rest.builder; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.MetadataSchema; import org.dspace.content.NonUniqueMetadataException; @@ -20,7 +20,7 @@ import org.dspace.discovery.SearchServiceException; public class MetadataSchemaBuilder extends AbstractBuilder { /* Log4j logger*/ - private static final Logger log = Logger.getLogger(MetadataSchemaBuilder.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MetadataSchemaBuilder.class); private MetadataSchema metadataSchema; diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java index 73ad1c7af1..4d73d23b19 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/builder/WorkspaceItemBuilder.java @@ -7,10 +7,18 @@ */ package org.dspace.app.rest.builder; +import java.io.InputStream; + +import org.dspace.content.Bitstream; import org.dspace.content.Collection; +import org.dspace.content.DCDate; +import org.dspace.content.Item; +import org.dspace.content.LicenseUtils; +import org.dspace.content.MetadataSchema; import org.dspace.content.WorkspaceItem; import org.dspace.content.service.WorkspaceItemService; import org.dspace.core.Context; +import org.dspace.eperson.EPerson; /** * Builder to construct WorkspaceItem objects @@ -70,4 +78,68 @@ public class WorkspaceItemBuilder extends AbstractBuilder matchTitle(String title) { + public static Matcher matchMetadata(String key, String value) { return allOf( - hasJsonPath("$.key", is("dc.title")), - hasJsonPath("$.value", is(title)) + hasJsonPath("$.key", is(key)), + hasJsonPath("$.value", is(value)) ); } } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java index 56be9aba49..59f609cdfa 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/MetadataFieldMatcher.java @@ -51,4 +51,5 @@ public class MetadataFieldMatcher { hasJsonPath("$._links.self.href", Matchers.containsString("/api/core/metadatafields")) ); } + } diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java new file mode 100644 index 0000000000..fdefed59cf --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/SubmissionFormFieldMatcher.java @@ -0,0 +1,90 @@ +/** + * 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.matcher; + +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasNoJsonPath; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; + +import org.hamcrest.Matcher; + +/** + * Helper class to simplify testing of the submission form configuration + * + * @author Andrea Bollini (andrea.bollini at 4science.it) + * + */ +public class SubmissionFormFieldMatcher { + + private SubmissionFormFieldMatcher() { } + + /** + * Shortcut for the + * {@link SubmissionFormFieldMatcher#matchFormFieldDefinition(String, String, String, boolean, String, String, String)} + * with a null style + * + * @param type + * the expected input type + * @param label + * the expected label + * @param mandatoryMessage + * the expected mandatoryMessage, can be null. If not empty the fiedl is expected to be flagged as + * mandatory + * @param repeatable + * the expected repeatable flag + * @param hints + * the expected hints message + * @param metadata + * the expected metadata + * @return a Matcher for all the condition above + */ + public static Matcher matchFormFieldDefinition(String type, String label, String mandatoryMessage, + boolean repeatable, String hints, String metadata) { + return matchFormFieldDefinition(type, label, mandatoryMessage, repeatable, hints, null, metadata); + } + + /** + * Check the json representation of a submission form + * + * @param type + * the expected input type + * @param label + * the expected label + * @param mandatoryMessage + * the expected mandatoryMessage, can be null. If not empty the field is expected to be flagged as + * mandatory + * @param repeatable + * the expected repeatable flag + * @param hints + * the expected hints message + * @param style + * the expected style for the field, can be null. If null the corresponding json path is expected to be + * missing + * @param metadata + * the expected metadata + * @return a Matcher for all the condition above + */ + public static Matcher matchFormFieldDefinition(String type, String label, String mandatoryMessage, + boolean repeatable, String hints, String style, String metadata) { + return allOf( + // check each field definition + hasJsonPath("$.input.type", is(type)), + hasJsonPath("$.label", containsString(label)), + hasJsonPath("$.selectableMetadata[0].metadata", is(metadata)), + mandatoryMessage != null ? hasJsonPath("$.mandatoryMessage", containsString(mandatoryMessage)) : + hasNoJsonPath("$.mandatoryMessage"), + hasJsonPath("$.mandatory", is(mandatoryMessage != null)), + hasJsonPath("$.repeatable", is(repeatable)), + style != null ? hasJsonPath("$.style", is(style)) : + hasNoJsonPath("$.style"), + hasJsonPath("$.hints", containsString(hints)) + ); + } +} diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java new file mode 100644 index 0000000000..4117e1892a --- /dev/null +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/matcher/WorkspaceItemMatcher.java @@ -0,0 +1,113 @@ +/** + * 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.matcher; + +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasNoJsonPath; +import static org.dspace.app.rest.test.AbstractControllerIntegrationTest.REST_SERVER_URL; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.startsWith; + +import org.dspace.content.WorkspaceItem; +import org.hamcrest.Matcher; + +/** + * Utility class to construct a Matcher for a Workspace item + * + * @author Andrea Bollini (andrea.bollini at 4science.it) + */ +public class WorkspaceItemMatcher { + + private WorkspaceItemMatcher() { } + + /** + * Check if the returned json expose all the required links and properties and the title and dateIssued are present + * in the traditionalpageone section as by the default configuration (form-submission.xml) + * + * @param witem + * the workspaceitem + * @param title + * the dc.title + * @param dateIssued + * the dc.date.issued + * @return + */ + public static Matcher matchItemWithTitleAndDateIssued(WorkspaceItem witem, String title, + String dateIssued) { + return allOf( + // Check workspaceitem properties + matchProperties(witem), + // Check core metadata all appear in the first describe panel "traditionalpageone" + hasJsonPath("$.sections.traditionalpageone['dc.title'][0].value", is(title)), + hasJsonPath("$.sections.traditionalpageone['dc.date.issued'][0].value", is(dateIssued)), + // Check links + matchLinks(witem)); + } + + /** + * Check if the returned json expose all the required links and properties and the title and dateIssued are present + * in the traditionalpageone section and the subject in the traditionalpagetwo section as by the default + * configuration (form-submission.xml) + * + * @param witem + * the workspaceitem + * @param title + * the dc.title + * @param dateIssued + * the dc.date.issued * @param subject the dc.subject + * + * @return + */ + public static Matcher matchItemWithTitleAndDateIssuedAndSubject(WorkspaceItem witem, String title, + String dateIssued, + String subject) { + return allOf( + // Check workspaceitem properties + matchProperties(witem), + // Check core metadata all appear in the first describe panel "traditionalpageone" + title != null ? + hasJsonPath("$.sections.traditionalpageone['dc.title'][0].value", is(title)) : + hasNoJsonPath("$.sections.traditionalpageone['dc.title']"), + hasJsonPath("$.sections.traditionalpageone['dc.date.issued'][0].value", is(dateIssued)), + // Check keywords they appear in the second describe panel "traditionalpagetwo" + hasJsonPath("$.sections.traditionalpagetwo['dc.subject'][0].value", is(subject)), + // Check links + matchLinks(witem)); + } + + /** + * Check that the id and type are exposed + * + * @param witem + * the workspaceitem + * @return + */ + public static Matcher matchProperties(WorkspaceItem witem) { + return allOf( + hasJsonPath("$.id", is(witem.getID())), + hasJsonPath("$.type", is("workspaceitem")) + ); + } + + /** + * Check that the required links are present + * + * @param witem + * the workspaceitem + * @return + */ + public static Matcher matchLinks(WorkspaceItem witem) { + return allOf( + hasJsonPath("$._links.self.href", is(REST_SERVER_URL + "submission/workspaceitems/" + witem.getID())), + hasJsonPath("$._links.item.href", startsWith(REST_SERVER_URL)), + hasJsonPath("$._links.collection.href", startsWith(REST_SERVER_URL)), + hasJsonPath("$._links.submitter.href", startsWith(REST_SERVER_URL)), + hasJsonPath("$._links.submissionDefinition.href", startsWith(REST_SERVER_URL))); + } +} diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java index 75a930aa61..a67f747b62 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/security/jwt/JWTTokenHandlerTest.java @@ -23,6 +23,7 @@ import com.nimbusds.jwt.SignedJWT; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.service.EPersonService; +import org.dspace.service.ClientInfoService; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -62,6 +63,9 @@ public class JWTTokenHandlerTest { @Mock private EPersonClaimProvider ePersonClaimProvider; + @Mock + private ClientInfoService clientInfoService; + @Spy private List jwtClaimProviders = new ArrayList<>(); @@ -71,6 +75,7 @@ public class JWTTokenHandlerTest { when(ePerson.getSessionSalt()).thenReturn("01234567890123456789012345678901"); when(ePerson.getLastActive()).thenReturn(new Date()); when(context.getCurrentUser()).thenReturn(ePerson); + when(clientInfoService.getClientIp(any())).thenReturn("123.123.123.123"); when(ePersonClaimProvider.getKey()).thenReturn("eid"); when(ePersonClaimProvider.getValue(any(), Mockito.any(HttpServletRequest.class))).thenReturn("epersonID"); jwtClaimProviders.add(ePersonClaimProvider); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java index f790aa230a..22836b11d4 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java @@ -19,7 +19,7 @@ import javax.servlet.Filter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.io.Charsets; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.rest.Application; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.security.MethodSecurityConfig; @@ -70,6 +70,7 @@ public class AbstractControllerIntegrationTest extends AbstractIntegrationTestWi protected static final String AUTHORIZATION_TYPE = "Bearer "; public static final String REST_SERVER_URL = "http://localhost/api/"; + public static final String BASE_REST_SERVER_URL = "http://localhost"; protected MediaType contentType = new MediaType(MediaTypes.HAL_JSON.getType(), MediaTypes.HAL_JSON.getSubtype(), Charsets.UTF_8); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java index 3f129b5528..6854f0a225 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java @@ -15,7 +15,8 @@ import java.sql.SQLException; import java.util.Properties; import java.util.TimeZone; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.app.rest.builder.AbstractBuilder; import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelInit; @@ -30,7 +31,8 @@ public class AbstractDSpaceIntegrationTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractDSpaceIntegrationTest.class); + private static final Logger log = LogManager + .getLogger(AbstractDSpaceIntegrationTest.class); /** * Test properties. These configure our general test environment diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java index 7c38a89f4d..6f6ee8519a 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java @@ -12,7 +12,8 @@ import static org.junit.Assert.fail; import java.sql.SQLException; import java.util.Arrays; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.app.launcher.ScriptLauncher; import org.dspace.app.rest.builder.AbstractBuilder; import org.dspace.authorize.AuthorizeException; @@ -37,7 +38,8 @@ public class AbstractIntegrationTestWithDatabase extends AbstractDSpaceIntegrati /** * log4j category */ - private static final Logger log = Logger.getLogger(AbstractIntegrationTestWithDatabase.class); + private static final Logger log = LogManager + .getLogger(AbstractIntegrationTestWithDatabase.class); /** * Context mock object to use in the tests. diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java index bfc846fa74..75a22bf141 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java @@ -168,7 +168,7 @@ public class DiscoverQueryBuilderTest { Arrays.asList(searchFilter), "item", page); assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\"")); - assertThat(discoverQuery.getQuery(), is("\"" + query + "\"")); + assertThat(discoverQuery.getQuery(), is(query)); assertThat(discoverQuery.getDSpaceObjectFilter(), is(Constants.ITEM)); assertThat(discoverQuery.getSortField(), is("dc.title_sort")); assertThat(discoverQuery.getSortOrder(), is(DiscoverQuery.SORT_ORDER.asc)); @@ -293,7 +293,7 @@ public class DiscoverQueryBuilderTest { "subject"); assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\"")); - assertThat(discoverQuery.getQuery(), is("\"" + query + "\"")); + assertThat(discoverQuery.getQuery(), is(query)); assertThat(discoverQuery.getDSpaceObjectFilter(), is(Constants.ITEM)); assertThat(discoverQuery.getSortField(), isEmptyOrNullString()); assertThat(discoverQuery.getMaxResults(), is(0)); diff --git a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java index 629e5fd1ef..c2665f4145 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java +++ b/dspace-spring-rest/src/test/java/org/dspace/app/rest/utils/MultipartFileSenderTest.java @@ -21,7 +21,7 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.CharEncoding; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.junit.After; import org.junit.Before; @@ -41,7 +41,7 @@ public class MultipartFileSenderTest { /** * log4j category */ - private static final Logger log = Logger.getLogger(MultipartFileSenderTest.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MultipartFileSenderTest.class); private InputStream is; private String mimeType; diff --git a/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java b/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java index e5e62e25df..a71d33b82e 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java +++ b/dspace-spring-rest/src/test/java/org/dspace/solr/MockSolrServer.java @@ -13,7 +13,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; -import org.apache.log4j.Logger; +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.embedded.EmbeddedSolrServer; @@ -25,7 +25,7 @@ import org.dspace.app.rest.test.AbstractDSpaceIntegrationTest; */ public class MockSolrServer { - private static final Logger log = Logger.getLogger(MockSolrServer.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(MockSolrServer.class); private static final ConcurrentMap loadedCores = new ConcurrentHashMap<>(); private static final ConcurrentMap usersPerCore = new ConcurrentHashMap<>(); private static CoreContainer container = null; diff --git a/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java b/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java index 543146ff36..8cb60ae780 100644 --- a/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java +++ b/dspace-spring-rest/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java @@ -42,7 +42,6 @@ public class MockSolrLoggerServiceImpl File locationDb = new File(locationDbPath); locationDb.createNewFile(); locationService = new DatabaseReader.Builder(locationDb).build(); - useProxies = configurationService.getBooleanProperty("useProxies"); } @Override diff --git a/dspace-spring-rest/src/test/resources/log4j.properties b/dspace-spring-rest/src/test/resources/log4j.properties index 2500bc47ea..b982e8bd74 100644 --- a/dspace-spring-rest/src/test/resources/log4j.properties +++ b/dspace-spring-rest/src/test/resources/log4j.properties @@ -19,10 +19,10 @@ log4j.rootCategory=INFO, A1 # A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1=org.apache.logging.log4j.ConsoleAppender # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n ########################################################################### @@ -40,9 +40,9 @@ log4j.logger.org.dspace.servicemanager=ERROR log4j.logger.org.dspace.providers=ERROR log4j.logger.org.dspace.utils=ERROR -log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout=org.apache.logging.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout=org.apache.logging.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # # Root logger option diff --git a/dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib new file mode 100644 index 0000000000..4d197ff90f --- /dev/null +++ b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/bibtex-test.bib @@ -0,0 +1,14 @@ +@misc{ Nobody01, + author = "Nobody Jr", + title = "My Article", + year = "2006" } + +@misc{ Nobody02, + author = "Nobody Jr", + title = "My Article 2", + year = "2006" } + +@misc{ Nobody03, + author = "Nobody Jr", + title = "My Article 3", + year = "2018" } diff --git a/dspace-spring-rest/src/test/resources/org/dspace/app/rest/simple-article.pdf b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/simple-article.pdf new file mode 100644 index 0000000000..abefe17f93 Binary files /dev/null and b/dspace-spring-rest/src/test/resources/org/dspace/app/rest/simple-article.pdf differ diff --git a/dspace-sword/pom.xml b/dspace-sword/pom.xml index fb26286f27..63f149e01f 100644 --- a/dspace-sword/pom.xml +++ b/dspace-sword/pom.xml @@ -112,7 +112,7 @@
javax.servlet - servlet-api + javax.servlet-api provided @@ -120,24 +120,20 @@ junit test + - log4j - log4j - - - jmxtools - com.sun.jdmk - - - jms - javax.jms - - - jmxri - com.sun.jmx - - + org.apache.logging.log4j + log4j-api + + org.apache.logging.log4j + log4j-core + + + org.apache.logging.log4j + log4j-web + + xom xom diff --git a/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java index 3ce38aec47..14e65d81e1 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/BitstreamEntryGenerator.java @@ -10,7 +10,7 @@ package org.dspace.sword; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; @@ -33,7 +33,7 @@ public class BitstreamEntryGenerator extends DSpaceATOMEntry { /** * logger */ - private static Logger log = Logger.getLogger(BitstreamEntryGenerator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BitstreamEntryGenerator.class); /** * Create a new ATOM Entry generator which can provide a SWORD Entry for diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java index d2cf664d5c..6c0927f016 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionCollectionGenerator.java @@ -10,7 +10,7 @@ package org.dspace.sword; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; @@ -26,7 +26,7 @@ public class CollectionCollectionGenerator extends ATOMCollectionGenerator { * logger */ private static Logger log = - Logger.getLogger(CollectionCollectionGenerator.class); + org.apache.logging.log4j.LogManager.getLogger(CollectionCollectionGenerator.class); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java index 5082e96511..98018ee811 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionDepositor.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; @@ -40,7 +40,7 @@ public class CollectionDepositor extends Depositor { /** * logger */ - private static Logger log = Logger.getLogger(CollectionDepositor.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionDepositor.class); protected ItemService itemService = ContentServiceFactory.getInstance().getItemService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java b/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java index d2ff871a72..caa9a1fdca 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CollectionLocation.java @@ -11,7 +11,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.sql.SQLException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; import org.dspace.core.ConfigurationManager; @@ -30,7 +30,7 @@ public class CollectionLocation { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(CollectionLocation.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(CollectionLocation.class); protected HandleService handleService = HandleServiceFactory.getInstance() .getHandleService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java index a2fba088f1..1d8caa5d16 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/CommunityCollectionGenerator.java @@ -9,8 +9,9 @@ package org.dspace.sword; 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.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; import org.dspace.content.MetadataValue; @@ -19,8 +20,7 @@ import org.dspace.content.service.CommunityService; import org.purl.sword.base.Collection; public class CommunityCollectionGenerator extends ATOMCollectionGenerator { - private static Logger log = Logger - .getLogger(CommunityCollectionGenerator.class); + private static Logger log = LogManager.getLogger(CommunityCollectionGenerator.class); protected CommunityService communityService = ContentServiceFactory .getInstance().getCommunityService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java b/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java index d742bc1eae..ee6b430278 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java +++ b/dspace-sword/src/main/java/org/dspace/sword/DSpaceSWORDServer.java @@ -7,7 +7,7 @@ */ package org.dspace.sword; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.purl.sword.base.AtomDocumentRequest; @@ -33,7 +33,7 @@ public class DSpaceSWORDServer implements SWORDServer { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(DSpaceSWORDServer.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DSpaceSWORDServer.class); // methods required by SWORDServer interface //////////////////////////////////////////// diff --git a/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java b/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java index 78f08dd99a..7535302139 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java +++ b/dspace-sword/src/main/java/org/dspace/sword/DepositManager.java @@ -20,8 +20,8 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.util.Date; -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.Collection; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; @@ -46,7 +46,7 @@ public class DepositManager { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(DepositManager.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositManager.class); /** * The SWORD service implementation diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java index 1b1ade604f..0596e534b7 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/ItemCollectionGenerator.java @@ -9,7 +9,7 @@ package org.dspace.sword; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.DSpaceObject; import org.dspace.content.Item; import org.dspace.content.MetadataValue; diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java b/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java index e174a9ec2c..da99cfcc36 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java +++ b/dspace-sword/src/main/java/org/dspace/sword/ItemDepositor.java @@ -13,7 +13,7 @@ import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.authorize.AuthorizeException; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; diff --git a/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java b/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java index 73ca67fc3e..da7dcead4c 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/ItemEntryGenerator.java @@ -10,8 +10,8 @@ package org.dspace.sword; 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.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Bundle; @@ -40,7 +40,7 @@ public class ItemEntryGenerator extends DSpaceATOMEntry { /** * logger */ - private static Logger log = Logger.getLogger(ItemEntryGenerator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ItemEntryGenerator.class); protected HandleService handleService = HandleServiceFactory.getInstance() .getHandleService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java index 4497532c25..ec46ab8f22 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDAuthenticator.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -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; @@ -53,7 +53,7 @@ public class SWORDAuthenticator { /** * logger */ - private static Logger log = Logger.getLogger(SWORDAuthenticator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDAuthenticator.class); protected AuthenticationService authenticationService = AuthenticateServiceFactory.getInstance().getAuthenticationService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java index ad52eba956..0bc12934ca 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDConfiguration.java @@ -13,7 +13,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.BitstreamFormat; import org.dspace.content.Collection; import org.dspace.content.DSpaceObject; @@ -44,7 +44,7 @@ public class SWORDConfiguration { /** * logger */ - public static final Logger log = Logger.getLogger(SWORDConfiguration.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDConfiguration.class); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory .getInstance().getBitstreamFormatService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java index d734256501..6d7ca18367 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDMETSIngester.java @@ -12,7 +12,7 @@ import java.sql.SQLException; import java.util.Date; import java.util.StringTokenizer; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.Collection; import org.dspace.content.DCDate; import org.dspace.content.DSpaceObject; @@ -38,7 +38,7 @@ public class SWORDMETSIngester implements SWORDIngester { /** * Log4j logger */ - public static final Logger log = Logger.getLogger(SWORDMETSIngester.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDMETSIngester.class); /* (non-Javadoc) * @see org.dspace.sword.SWORDIngester#ingest(org.dspace.core.Context, org.purl.sword.base.Deposit) diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java index 6bb30e2f23..a84289a934 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDService.java @@ -12,7 +12,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.dspace.content.BitstreamFormat; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -33,7 +33,7 @@ public class SWORDService { /** * Log4j logging instance */ - public static final Logger log = Logger.getLogger(SWORDService.class); + public static final Logger log = org.apache.logging.log4j.LogManager.getLogger(SWORDService.class); protected BitstreamFormatService bitstreamFormatService = ContentServiceFactory .getInstance().getBitstreamFormatService(); diff --git a/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java b/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java index ab0409c9e5..2a6ce92761 100644 --- a/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java +++ b/dspace-sword/src/main/java/org/dspace/sword/SWORDUrlManager.java @@ -12,7 +12,7 @@ import java.net.URL; import java.sql.SQLException; import java.util.List; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Content.java b/dspace-sword/src/main/java/org/purl/sword/atom/Content.java index 35e4bcf0ce..418fa6549e 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Content.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Content.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -51,7 +51,7 @@ public class Content extends XmlElement implements SwordElementInterface { /** * The log. */ - private static Logger log = Logger.getLogger(Content.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Content.class); /** * diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java b/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java index 09ceb31dc5..7f09d80412 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Entry.java @@ -14,7 +14,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.HttpHeaders; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; @@ -143,7 +143,7 @@ public class Entry extends XmlElement implements SwordElementInterface { /** * The log. */ - private static Logger log = Logger.getLogger(Entry.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Entry.class); /** * The prefix, local name and namespace used for this element. diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java b/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java index 8f28b8589a..128d39b210 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Generator.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -62,7 +62,7 @@ public class Generator extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Generator.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Generator.class); /** * The Xml name details for the element. diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Link.java b/dspace-sword/src/main/java/org/purl/sword/atom/Link.java index c7658ba999..9786a91216 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Link.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Link.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -102,7 +102,7 @@ public class Link extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Link.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Link.class); private static final XmlName XML_NAME = new XmlName( Namespaces.PREFIX_ATOM, "link", Namespaces.NS_ATOM); diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/Source.java b/dspace-sword/src/main/java/org/purl/sword/atom/Source.java index 6b23d5429a..59d26c2ebb 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/Source.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/Source.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -42,7 +42,7 @@ public class Source extends XmlElement implements SwordElementInterface { /** * The log. */ - private static Logger log = Logger.getLogger(Source.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Source.class); /** * Create a new instance and set the prefix to diff --git a/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java b/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java index 98dee816ea..23005d78e8 100644 --- a/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java +++ b/dspace-sword/src/main/java/org/purl/sword/atom/TextConstruct.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.Namespaces; import org.purl.sword.base.SwordElementInterface; import org.purl.sword.base.SwordValidationInfo; @@ -43,7 +43,7 @@ public class TextConstruct extends XmlElement /** * The log. */ - private static Logger log = Logger.getLogger(TextConstruct.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(TextConstruct.class); /** * label for the type attribute. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java b/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java index 2ed1ba9400..f5604f3656 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/BasicContentElement.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.Properties; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a text construct in the ATOM elements. This is a superclass of @@ -25,7 +25,7 @@ public abstract class BasicContentElement extends XmlElement /** * The log. */ - private static Logger log = Logger.getLogger(BasicContentElement.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(BasicContentElement.class); public BasicContentElement(String prefix, String name, String namespaceUri) { super(prefix, name, namespaceUri); diff --git a/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java b/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java index c2b2a6563a..ece4deeb90 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/ChecksumUtils.java @@ -13,7 +13,7 @@ import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Utility class that holds Checksum related methods. @@ -25,7 +25,7 @@ public class ChecksumUtils { /** * Logger */ - private static Logger log = Logger.getLogger(ChecksumUtils.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ChecksumUtils.class); /** * Default constructor diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Collection.java b/dspace-sword/src/main/java/org/purl/sword/base/Collection.java index 34c2f3817d..cd78f27d50 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Collection.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Collection.java @@ -15,7 +15,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Accept; import org.purl.sword.atom.ContentType; import org.purl.sword.atom.Title; @@ -69,7 +69,7 @@ public class Collection extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Collection.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Collection.class); /** * Label for the Href attribute. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java b/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java index 3c1e76a2f1..2473d28e4a 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Deposit.java @@ -12,7 +12,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a deposit. @@ -20,7 +20,7 @@ import org.apache.log4j.Logger; * @author Stuart Lewis */ public class Deposit { - private static final Logger log = Logger.getLogger(Deposit.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Deposit.class); /** * The File deposited diff --git a/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java b/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java index a731c020ed..453af3df35 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/DepositResponse.java @@ -16,7 +16,7 @@ import nu.xom.Document; import nu.xom.Element; import nu.xom.ParsingException; import nu.xom.Serializer; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a deposit response. This holds the SWORD Entry element. @@ -43,7 +43,7 @@ public class DepositResponse { /** * Logger */ - private static Logger log = Logger.getLogger(DepositResponse.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositResponse.class); /** * Create a new response with the specified http code. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Service.java b/dspace-sword/src/main/java/org/purl/sword/base/Service.java index c335aecf75..3edc86c14e 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Service.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Service.java @@ -14,7 +14,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Generator; @@ -47,7 +47,7 @@ public class Service extends XmlElement implements SwordElementInterface { /** * Logger */ - private static Logger log = Logger.getLogger(Service.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Service.class); /** * MaxUploadSize diff --git a/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java b/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java index 6d063c6c7e..aa0a545d97 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/SwordAcceptPackaging.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Represents a text construct in the ATOM elements. This is a superclass of @@ -36,7 +36,7 @@ public class SwordAcceptPackaging extends XmlElement /** * The log. */ - private static Logger log = Logger.getLogger(SwordAcceptPackaging.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordAcceptPackaging.class); /** */ public static final String ELEMENT_NAME = "acceptPackaging"; diff --git a/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java b/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java index 814c91bb39..727372408c 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/SwordContentPackageTypes.java @@ -11,14 +11,14 @@ import java.io.InputStream; import java.util.Enumeration; import java.util.Properties; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * @author Neil Taylor (nst@aber.ac.uk) */ public class SwordContentPackageTypes { - private static Logger log = Logger.getLogger(SwordContentPackageTypes.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(SwordContentPackageTypes.class); private static Properties types; diff --git a/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java b/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java index 81964152ba..1f18167c95 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/Workspace.java @@ -14,7 +14,7 @@ import java.util.Properties; import nu.xom.Element; import nu.xom.Elements; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.ContentType; import org.purl.sword.atom.Title; @@ -37,7 +37,7 @@ public class Workspace extends XmlElement implements SwordElementInterface { /** * The logger. */ - private static Logger log = Logger.getLogger(Workspace.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(Workspace.class); /** * Local name part of this element. diff --git a/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java b/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java index 6249c4290a..80217738d2 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/XmlElement.java @@ -13,7 +13,7 @@ import java.util.Properties; import nu.xom.Attribute; import nu.xom.Element; import nu.xom.Node; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * Parent class for all classes that represent an XML element. This provides @@ -27,7 +27,7 @@ public abstract class XmlElement { /** * Logger */ - private static Logger log = Logger.getLogger(XmlElement.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlElement.class); /** diff --git a/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java b/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java index b6dff75281..da2430f452 100644 --- a/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java +++ b/dspace-sword/src/main/java/org/purl/sword/base/XmlName.java @@ -9,8 +9,8 @@ package org.purl.sword.base; import nu.xom.Attribute; import nu.xom.Element; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.HashCodeBuilder; /** * @author Neil Taylor (nst@aber.ac.uk) diff --git a/dspace-sword/src/main/java/org/purl/sword/client/Client.java b/dspace-sword/src/main/java/org/purl/sword/client/Client.java index 4b4899e4f9..c6d335d8dd 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/Client.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/Client.java @@ -31,7 +31,7 @@ import org.apache.http.entity.ContentType; import org.apache.http.entity.FileEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.HttpParams; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.ChecksumUtils; import org.purl.sword.base.DepositResponse; import org.purl.sword.base.HttpHeaders; @@ -96,7 +96,7 @@ public class Client implements SWORDClient { /** * Logger. */ - private static final Logger log = Logger.getLogger(Client.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(Client.class); /** * Create a new Client. The client will not use authentication by default. diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java index 0ae5cb3f26..00bd9c17a5 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientFactory.java @@ -7,8 +7,6 @@ */ package org.purl.sword.client; -import org.apache.log4j.PropertyConfigurator; - /** * Entry point for the SWORD Demonstration Client. This will parse the list of * command line options and load either a Command Line client or a GUI client. @@ -16,18 +14,6 @@ import org.apache.log4j.PropertyConfigurator; * @author Neil Taylor */ public class ClientFactory { - - /** - * Create a new instance. - */ - public ClientFactory() { - // configure the logger from the property file. The GUI client will - // reload these properties if it is set to capture the output and - // display it in a panel. - PropertyConfigurator.configure(this.getClass().getClassLoader() - .getResource(ClientConstants.LOGGING_PROPERTY_FILE)); - } - /** * Generate a string that specifies the command line options for this * program. @@ -35,7 +21,7 @@ public class ClientFactory { * @return A list of the options for this program. */ public static String usage() { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append("swordclient: version "); buffer.append(ClientConstants.CLIENT_VERSION); buffer.append("\n"); diff --git a/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java b/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java index 2f3c73d1e5..e085baeb78 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/ClientOptions.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; /** * List of options that are parsed from the command line. @@ -117,7 +117,7 @@ public class ClientOptions { /** * Logger. */ - private static Logger log = Logger.getLogger(ClientOptions.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ClientOptions.class); /** * List of multiple destination items. Used if the mode is set to multipost. diff --git a/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java b/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java index f1f224fe8b..f747de5ffa 100644 --- a/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java +++ b/dspace-sword/src/main/java/org/purl/sword/client/CmdClient.java @@ -15,7 +15,7 @@ import java.net.URL; import java.util.Iterator; import java.util.List; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Author; import org.purl.sword.atom.Content; import org.purl.sword.atom.Contributor; @@ -54,7 +54,7 @@ public class CmdClient implements ClientType { /** * The logger. */ - private static Logger log = Logger.getLogger(CmdClient.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(CmdClient.class); /** * Create a new instance of the class and create an instance of the diff --git a/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java b/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java index 51b7bd2bcb..c272fc95f5 100644 --- a/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java +++ b/dspace-sword/src/main/java/org/purl/sword/server/DepositServlet.java @@ -25,7 +25,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Summary; import org.purl.sword.atom.Title; import org.purl.sword.base.ChecksumUtils; @@ -73,7 +73,7 @@ public class DepositServlet extends HttpServlet { /** * Logger */ - private static final Logger log = Logger.getLogger(DepositServlet.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(DepositServlet.class); /** * Initialise the servlet. diff --git a/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java b/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java index c7c2f49dcc..2dc9b3b7e2 100644 --- a/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java +++ b/dspace-sword/src/main/java/org/purl/sword/server/DummyServer.java @@ -17,7 +17,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.servlet.http.HttpServletResponse; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.atom.Author; import org.purl.sword.atom.Content; import org.purl.sword.atom.Contributor; @@ -62,7 +62,7 @@ public class DummyServer implements SWORDServer { /** * Logger */ - private static Logger log = Logger.getLogger(ServiceDocumentServlet.class); + private static Logger log = org.apache.logging.log4j.LogManager.getLogger(ServiceDocumentServlet.class); /** * Provides a dumb but plausible service document - it contains diff --git a/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java b/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java index bb43850ef6..28c309b2ca 100644 --- a/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java +++ b/dspace-sword/src/main/java/org/purl/sword/server/ServiceDocumentServlet.java @@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.Logger; import org.purl.sword.base.HttpHeaders; import org.purl.sword.base.SWORDAuthenticationException; import org.purl.sword.base.SWORDErrorException; @@ -49,7 +49,7 @@ public class ServiceDocumentServlet extends HttpServlet { /** * Logger */ - private static final Logger log = Logger.getLogger(ServiceDocumentServlet.class); + private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(ServiceDocumentServlet.class); /** * Initialise the servlet. diff --git a/dspace-sword/src/main/webapp/WEB-INF/web.xml b/dspace-sword/src/main/webapp/WEB-INF/web.xml index 733de69745..14b873ccd9 100644 --- a/dspace-sword/src/main/webapp/WEB-INF/web.xml +++ b/dspace-sword/src/main/webapp/WEB-INF/web.xml @@ -8,35 +8,37 @@ http://www.dspace.org/license/ --> - - + DSpace SWORD Server + The location of the DSpace home directory dspace.dir ${dspace.dir} - - The location of the DSpace home directory - + The SWORDServer class name sword-server-class org.dspace.sword.DSpaceSWORDServer + + + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml - The SWORDServer class name + The location of the Log4J configuration + The type of authentication used : [Basic|None] authentication-method Basic - - The type of authentication used : [Basic|None] - - - - + DSpace SWORD 2.0 Server + The location of the DSpace home directory dspace.dir ${dspace.dir} - - The location of the DSpace home directory - + The ServiceDocumentManager server implementation class name service-document-impl org.dspace.sword2.ServiceDocumentManagerDSpace + + + + log4jConfiguration + ${dspace.dir}/config/log4j2.xml - The ServiceDocumentManager server implementation class name + The location of the Log4J configuration - + + The CollectionListManager server implementation class name collection-list-impl org.dspace.sword2.CollectionListManagerDSpace - - The CollectionListManager server implementation class name - + The CollectionDepositManager server implementation class name collection-deposit-impl org.dspace.sword2.CollectionDepositManagerDSpace - - The CollectionDepositManager server implementation class name - + The MediaResourceManager server implementation class name media-resource-impl org.dspace.sword2.MediaResourceManagerDSpace - - The MediaResourceManager server implementation class name - + The ContainerManager server implementation class name container-impl org.dspace.sword2.ContainerManagerDSpace - - The ContainerManager server implementation class name - + The StatementManager server implementation class name statement-impl org.dspace.sword2.StatementManagerDSpace - - The StatementManager server implementation class name - + The SwordConfiguration server implementation class name config-impl org.dspace.sword2.SwordConfigurationDSpace - - The SwordConfiguration server implementation class name - + The type of authentication used : [Basic|None] authentication-method Basic - - The type of authentication used : [Basic|None] - -
- - -
- - - + https://commons.apache.org/proper/commons-configuration/userguide/howto_basicfeatures.html#Variable_Interpolation --> + - + - - - - + + - - - - + + - +
diff --git a/dspace/config/crosswalks/oai/xoai.xml b/dspace/config/crosswalks/oai/xoai.xml index 5716163324..868382ccf0 100644 --- a/dspace/config/crosswalks/oai/xoai.xml +++ b/dspace/config/crosswalks/oai/xoai.xml @@ -29,9 +29,7 @@ diff --git a/dspace/config/dspace.cfg b/dspace/config/dspace.cfg index c38847ac07..6cebe39bdc 100644 --- a/dspace/config/dspace.cfg +++ b/dspace/config/dspace.cfg @@ -34,6 +34,10 @@ dspace.baseUrl = http://localhost:8080 # Alternatively, you can use a url redirect or deploy the web application under the servlet container root. dspace.url = ${dspace.baseUrl} +# This is the URL that will be used for the REST endpoints to be served on. +# This will typically be followed by /api to determine the root endpoints. +dspace.restUrl = ${dspace.baseUrl}/rest + # Optional: DSpace URL for mobile access # This #dspace.mobileUrl = http://mobile.example.com @@ -164,10 +168,10 @@ mail.allowed.referrers = ${dspace.hostname} ##### Logging configuration ##### # Override default log4j configuration file # You may provide your own configuration here, existing alternatives are: -# log.init.config = ${dspace.dir}/config/log4j-console.properties -log.init.config = ${dspace.dir}/config/log4j.properties +# log.init.config = ${dspace.dir}/config/log4j2-console.xml +log.init.config = ${dspace.dir}/config/log4j2.xml -# All other log4j settings moved to config/log4j.properties +# All other log4j settings moved to config/log4j2.xml ##### DOI registration agency credentials ###### # To mint DOIs you have to use a DOI registration agency like DataCite. Several @@ -326,7 +330,19 @@ http.proxy.port = # If enabled, the logging and the Solr statistics system will look for # an X-Forwarded-For header. If it finds it, it will use this for the user IP address -useProxies = false +# Note that server-side rendered Angular UI requests always present the X-Forwarded-For header +# with the original client IP address. +useProxies = true + +# If "useProxies" is enabled, the authentication and statistics logging code will read the X-Forwarded-For header in +# order to determine the correct client IP address. But they will only use that header value when the request is coming +# from a trusted proxy server location (e.g. HTTPD on localhost). Leave this property empty to trust X-Forwarded-For +# values of all requests. You can specify a range by only listing the first three ip-address blocks, e.g. 128.177.243 +# You can list multiple IP addresses or ranges by comma-separating them. +# If you are running REST & UI on different servers, you should add the UI servers (range) as a proxy. +# For example : proxies.trusted.ipranges = 127.0.0.1, 192.168.2 +# This is necessary because Angular Universal will also behave as a proxy server. +proxies.trusted.ipranges = 127.0.0.1 #### Media Filter / Format Filter plugins (through PluginService) #### # Media/Format Filters help to full-text index content or @@ -353,8 +369,7 @@ filter.plugins = PDFBox JPEG Thumbnail #Assign 'human-understandable' names to each filter plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PDFFilter = PDF Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.HTMLFilter = HTML Text Extractor -plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.WordFilter = Word Text Extractor -#plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PoiWordFilter = Word Text Extractor +plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PoiWordFilter = Word Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.ExcelFilter = Excel Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.PowerPointFilter = PowerPoint Text Extractor plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilter.JPEGFilter = JPEG Thumbnail @@ -366,7 +381,6 @@ plugin.named.org.dspace.app.mediafilter.FormatFilter = org.dspace.app.mediafilte #Configure each filter's input format(s) filter.org.dspace.app.mediafilter.PDFFilter.inputFormats = Adobe PDF filter.org.dspace.app.mediafilter.HTMLFilter.inputFormats = HTML, Text -filter.org.dspace.app.mediafilter.WordFilter.inputFormats = Microsoft Word filter.org.dspace.app.mediafilter.PoiWordFilter.inputFormats = Microsoft Word, Microsoft Word XML filter.org.dspace.app.mediafilter.PowerPointFilter.inputFormats = Microsoft Powerpoint, Microsoft Powerpoint XML filter.org.dspace.app.mediafilter.JPEGFilter.inputFormats = BMP, GIF, JPEG, image/png @@ -1336,8 +1350,6 @@ webui.feed.item.author = dc.contributor.author websvc.opensearch.enable = false # context for html request URLs - change only for non-standard servlet mapping websvc.opensearch.uicontext = simple-search -# context for RSS/Atom request URLs - change only for non-standard servlet mapping -websvc.opensearch.svccontext = open-search/ # present autodiscovery link in every page head websvc.opensearch.autolink = true # number of hours to retain results before recalculating @@ -1356,9 +1368,8 @@ websvc.opensearch.samplequery = photosynthesis # tags used to describe search service websvc.opensearch.tags = IR DSpace # result formats offered - use 1 or more comma-separated from: html,atom,rss -# NB: html is required for autodiscovery in browsers to function, -# and must be the first in the list if present -websvc.opensearch.formats = html,atom,rss +# NB: html is not supported in DSpace7, use normal search module instead +websvc.opensearch.formats = atom,rss #### Content Inline Disposition Threshold #### @@ -1368,7 +1379,6 @@ websvc.opensearch.formats = html,atom,rss # The 'webui.*' setting is for the JSPUI, and # the 'xmlui.*' setting is for the XMLUI webui.content_disposition_threshold = 8388608 -xmlui.content_disposition_threshold = 8388608 #### Multi-file HTML document/site settings ##### diff --git a/dspace/config/launcher.xml b/dspace/config/launcher.xml index 776e252314..1b144d33e3 100644 --- a/dspace/config/launcher.xml +++ b/dspace/config/launcher.xml @@ -242,6 +242,13 @@ reindex + + solr-upgrade-statistics-6x + Upgrade statistics (integer to UUID) to DSpace 6.x (or above) compatibility + + org.dspace.util.SolrUpgradePre6xStatistics + + stat-general Compile the general statistics diff --git a/dspace/config/log4j-console.properties b/dspace/config/log4j-console.properties deleted file mode 100644 index 5a52df7c5b..0000000000 --- a/dspace/config/log4j-console.properties +++ /dev/null @@ -1,23 +0,0 @@ -############################################################# -# log4j-console.properties -# -# Simple log4j configuration file used during Ant build tasks -# -# Its goal is to simply output logs to the commandline / console. -############################################################# - -# Set root category priority to WARN and its only appender to A1. -# For commandline / ant scripts, we are only concerned about significant warnings/errors -# For the full detail, change this to INFO and re-run Ant. -log4j.rootCategory=WARN, A1 - -# A1 is set to be a ConsoleAppender. -log4j.appender.A1=org.apache.log4j.ConsoleAppender - -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n - -# block passwords from being exposed in Axis logs. -# (DEBUG exposes passwords in Basic Auth) -log4j.logger.org.apache.axis.handlers.http.HTTPAuthHandler=INFO diff --git a/dspace/config/log4j-handle-plugin.properties b/dspace/config/log4j-handle-plugin.properties index 44d39fb1bd..72381a698c 100644 --- a/dspace/config/log4j-handle-plugin.properties +++ b/dspace/config/log4j-handle-plugin.properties @@ -20,12 +20,12 @@ log.dir=${dspace.dir}/log log4j.rootCategory=INFO, A1 # A1 is set to be a DailyRollingFileAppender. -log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender +log4j.appender.A1=org.apache.logging.log4j.DailyRollingFileAppender log4j.appender.A1.File=${log.dir}/handle-plugin.log log4j.appender.A1.DatePattern='.'yyyy-MM-dd # A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout=org.apache.logging.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n diff --git a/dspace/config/log4j-solr.properties b/dspace/config/log4j-solr.properties deleted file mode 100644 index c94e384d81..0000000000 --- a/dspace/config/log4j-solr.properties +++ /dev/null @@ -1,44 +0,0 @@ -########################################################################### -# log4j-solr.properties -# -# This is the log4j configuration file for the Solr webapp that comes bundled -# with DSpace. Because Solr is a dependency, its log4j settings are kept -# separate from the default DSpace log4j settings (in log4j.properties). -# -# Therefore, this log4j file is standalone. If you wish to tweak the location of -# your Solr logs, you must do so within this file. -########################################################################### - -# VARIABLES: -# The following variables can be used to easily tweak the default log4j settings. -# These variables are used by the log4j config / appenders later in this file. - -# log.dir -# Default log file directory for DSpace. Defaults to the 'log' subdirectory -# under [dspace.dir]. NOTE: The value of 'dspace.dir' will be replaced by -# its value in your configuration when DSpace is deployed (via Ant). -log.dir=${dspace.dir}/log - -# Logging level for Solr -log4j.rootLogger=INFO, file - -# Console logging options. Switch the above from "file" to "CONSOLE" to enable -log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender -log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout -log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n - -#- size rotation with log cleanup. -log4j.appender.file=org.apache.log4j.DailyRollingFileAppender -# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files -log4j.appender.file.DatePattern='.'yyyy-MM-dd - -#- File to log to and log format -log4j.appender.file.File=${log.dir}/solr.log -log4j.appender.file.layout=org.apache.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=%d %-5p %c @ %m%n - -log4j.logger.org.apache.zookeeper=WARN -log4j.logger.org.apache.hadoop=WARN - -# set to INFO to enable infostream log messages -log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF diff --git a/dspace/config/log4j.properties b/dspace/config/log4j.properties deleted file mode 100644 index 5acdacd310..0000000000 --- a/dspace/config/log4j.properties +++ /dev/null @@ -1,95 +0,0 @@ -########################################################################### -# log4j.properties -# -# This is the primary log4j (logging) configuration file for DSpace. By default, -# Log4j is configured to write log files that rotate daily. However, you may -# tweak these settings based on your local needs / best practices. -# For more information on log4j configuration, see: -# https://logging.apache.org/log4j/1.2/manual.html -########################################################################### - -# VARIABLES: -# The following variables can be used to easily tweak the default log4j settings. -# These variables are used by the log4j config / appenders later in this file. - -# log.dir -# Default log file directory for DSpace. Defaults to the 'log' subdirectory -# under [dspace.dir]. NOTE: The value of 'dspace.dir' will be replaced by -# its value in your configuration when DSpace is deployed (via Ant). -log.dir=${dspace.dir}/log - -# loglevel.dspace -# Log level for all DSpace-specific code (org.dspace.*) -# Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL -# Defaults to INFO -loglevel.dspace=INFO - -# loglevel.other -# Log level for other third-party tools/APIs used by DSpace -# Possible values (from most to least info): DEBUG, INFO, WARN, ERROR, FATAL -# Defaults to INFO -loglevel.other=INFO - - -########################################################################### -# A1 is the name of the appender for most DSpace activity. -########################################################################### -# The root category is the default setting for all non-DSpace code. -# Change this from INFO to DEBUG to see extra logging created by non-DSpace -# code. -log4j.rootCategory=${loglevel.other}, A1 -# This line sets the logging level for DSpace code. Set this to DEBUG to see -# extra detailed logging for DSpace code. -log4j.logger.org.dspace=${loglevel.dspace}, A1 - -# Do not change these "additivity" lines -log4j.additivity.org.dspace=false - -# The name of the file appender -log4j.appender.A1=org.dspace.app.util.DailyFileAppender -# The filename of the log file created. A date stamp is appended to this -log4j.appender.A1.File=${log.dir}/dspace.log -# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files -log4j.appender.A1.DatePattern=yyyy-MM-dd -# The number of log files to keep, or 0 to keep them all -log4j.appender.A1.MaxLogs=0 -# A1 uses PatternLayout. -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d %-5p %c @ %m%n - - -########################################################################### -# A2 is the name of the appender for the Checksum Checker -########################################################################### -# This line sets the logging level for the checksum checker log file. -# Set this to DEBUG to see extra detailed logging. -log4j.logger.org.dspace.checker=INFO, A2 -# Do not change this line -log4j.additivity.org.dspace.checker=false -# The name of the file appender -log4j.appender.A2=org.dspace.app.util.DailyFileAppender -# The filename of the log file created. A date stamp is appended to this -log4j.appender.A2.File=${log.dir}/checker.log -# Set this to yyyy-MM-DD for daily log files, or yyyy-MM for monthly files -log4j.appender.A2.DatePattern=yyyy-MM-dd -# The number of log files to keep, or 0 to keep them all -log4j.appender.A2.MaxLogs=0 -# A2 uses PatternLayout. -log4j.appender.A2.layout=org.apache.log4j.PatternLayout -log4j.appender.A2.layout.ConversionPattern=%m%n - - -########################################################################### -# Other settings -########################################################################### - -# Block passwords from being exposed in Axis logs. -# (DEBUG exposes passwords in Basic Auth) -log4j.logger.org.apache.axis.handlers.http.HTTPAuthHandler=INFO - -# Block services logging except on exceptions -log4j.logger.org.dspace.kernel=ERROR -log4j.logger.org.dspace.services=ERROR -log4j.logger.org.dspace.servicemanager=ERROR -log4j.logger.org.dspace.providers=ERROR -log4j.logger.org.dspace.utils=ERROR diff --git a/dspace/config/log4j2-console.xml b/dspace/config/log4j2-console.xml new file mode 100644 index 0000000000..db2998f6be --- /dev/null +++ b/dspace/config/log4j2-console.xml @@ -0,0 +1,32 @@ + + + + + + ${log4j:configParentLocation}/../log + + + + + + + + + + + + + + + diff --git a/dspace/config/log4j2-solr.xml b/dspace/config/log4j2-solr.xml new file mode 100644 index 0000000000..1e32365263 --- /dev/null +++ b/dspace/config/log4j2-solr.xml @@ -0,0 +1,40 @@ + + + + + + ${log4j:configParentLocation}/../log + + + + + + + yyyy-MM-dd + + + + + + + + + + + + + + + diff --git a/dspace/config/log4j2.xml b/dspace/config/log4j2.xml new file mode 100644 index 0000000000..98a0300125 --- /dev/null +++ b/dspace/config/log4j2.xml @@ -0,0 +1,91 @@ + + + + + + ${log4j:configParentLocation}/../log + + + INFO + + + INFO + + + + + + + + yyyy-MM-dd + + + + + + + + + yyyy-MM-dd + + + + + + + + + + + + + + + + + + + + + # Block services logging except on exceptions + + + + + + + # Block passwords from being exposed in Axis logs. + # (DEBUG exposes passwords in Basic Auth) + + + diff --git a/dspace/config/modules/rest.cfg b/dspace/config/modules/rest.cfg index b209d080fc..c8ac235dc9 100644 --- a/dspace/config/modules/rest.cfg +++ b/dspace/config/modules/rest.cfg @@ -40,10 +40,11 @@ rest.report-url.item-query = static/reports/query.html #rest.report-url.custom = ##### database specific way to format a regex SQL clause ##### -# The REST Report Tools may pass a regular expression test to the database. +# The REST Report Tools may pass a regular expression test to the database. # The following configuration setting will construct a SQL regular expression test appropriate to your database engine rest.regex-clause = text_value ~ ? + ##### Configure REST Report Filters ##### # A filter contains a set of tests that will be applied to an item to determine its inclusion in a particular report. # Private items and withdrawn items are frequently excluded from DSpace reports. diff --git a/dspace/config/spring/api/core-services.xml b/dspace/config/spring/api/core-services.xml index f25cb5ea20..6886a73507 100644 --- a/dspace/config/spring/api/core-services.xml +++ b/dspace/config/spring/api/core-services.xml @@ -93,6 +93,7 @@ + diff --git a/dspace/config/spring/xmlui/workflow-actions-xmlui.xml b/dspace/config/spring/xmlui/workflow-actions-xmlui.xml deleted file mode 100644 index d4e0e1ca6c..0000000000 --- a/dspace/config/spring/xmlui/workflow-actions-xmlui.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/dspace/config/submission-forms.dtd b/dspace/config/submission-forms.dtd index 27509aad71..7c94d133aa 100644 --- a/dspace/config/submission-forms.dtd +++ b/dspace/config/submission-forms.dtd @@ -4,10 +4,11 @@ - + + - + @@ -16,6 +17,7 @@ + diff --git a/dspace/config/submission-forms.xml b/dspace/config/submission-forms.xml index 9c3bc4c801..10e9578c88 100644 --- a/dspace/config/submission-forms.xml +++ b/dspace/config/submission-forms.xml @@ -21,30 +21,34 @@ -
- - dc - title - - false - - onebox - Enter the name of the file. - You must enter a main title for this file. - - - - dc - description - true - - textarea - Enter a description for the file - - -
+
+ + + dc + title + + false + + onebox + Enter the name of the file. + You must enter a main title for this item. + + + + + dc + description + true + + textarea + Enter a description for the file + + + +
+ dc contributor @@ -55,7 +59,8 @@ Enter the names of the authors of this item. - + + dc title @@ -65,8 +70,10 @@ onebox Enter the main title of the item. You must enter a main title for this item. + - + + dc title @@ -77,13 +84,15 @@ If the item has any alternative titles, please enter them here. - + + dc date issued false + date Please give the date of previous publication or public distribution. You can leave out the day and/or month if they aren't @@ -97,11 +106,13 @@ false + onebox Enter the name of the publisher of the previously issued instance of this item. - + + dc identifier @@ -112,7 +123,8 @@ Enter the standard citation for the previously issued instance of this item. - + + dc relation @@ -123,7 +135,8 @@ Enter the series and number assigned to this item by your community. - + + dc identifier @@ -136,7 +149,8 @@ it, please enter the types and the actual numbers or codes. - + + dc type @@ -147,7 +161,8 @@ it, please enter the types and the actual numbers or codes. Select the type(s) of content of the item. To select more than one value in the list, you may have to hold down the "CTRL" or "Shift" key. - + + dc language @@ -158,9 +173,11 @@ it, please enter the types and the actual numbers or codes. Select the language of the main content of the item. If the language does not appear in the list, please select 'Other'. If the content does not really have a language (for example, if it is a dataset or an image) please select 'N/A'. +
+ dc subject @@ -173,7 +190,8 @@ it, please enter the types and the actual numbers or codes. srsc - + + dc description @@ -184,7 +202,8 @@ it, please enter the types and the actual numbers or codes. Enter the abstract of the item. - + + dc description @@ -195,7 +214,8 @@ it, please enter the types and the actual numbers or codes. Enter the names of any sponsors and/or funding codes in the box. - + + dc description @@ -206,6 +226,7 @@ it, please enter the types and the actual numbers or codes. Enter any other description or comments in this box. +
diff --git a/dspace/modules/additions/pom.xml b/dspace/modules/additions/pom.xml index ebc3963a0a..d02b33a8b9 100644 --- a/dspace/modules/additions/pom.xml +++ b/dspace/modules/additions/pom.xml @@ -58,7 +58,7 @@
javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/oai/pom.xml b/dspace/modules/oai/pom.xml index 2dc97f96bc..e36adfafcc 100644 --- a/dspace/modules/oai/pom.xml +++ b/dspace/modules/oai/pom.xml @@ -127,13 +127,15 @@ javax.servlet - servlet-api + javax.servlet-api provided + com.lyncode @@ -146,6 +148,14 @@ + + + + + org.hamcrest + hamcrest-all + compile + diff --git a/dspace/modules/rdf/pom.xml b/dspace/modules/rdf/pom.xml index 5a5ab808bf..297d165a6d 100644 --- a/dspace/modules/rdf/pom.xml +++ b/dspace/modules/rdf/pom.xml @@ -104,7 +104,7 @@
javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/rest/pom.xml b/dspace/modules/rest/pom.xml index 636adc7e18..4b9c4a2a24 100644 --- a/dspace/modules/rest/pom.xml +++ b/dspace/modules/rest/pom.xml @@ -143,7 +143,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/solr/pom.xml b/dspace/modules/solr/pom.xml index d84c1a4a51..ff0927727a 100644 --- a/dspace/modules/solr/pom.xml +++ b/dspace/modules/solr/pom.xml @@ -130,6 +130,10 @@ org.apache.zookeeper zookeeper + + log4j + log4j + diff --git a/dspace/modules/sword/pom.xml b/dspace/modules/sword/pom.xml index 3ed2e4cc10..a8498483ce 100644 --- a/dspace/modules/sword/pom.xml +++ b/dspace/modules/sword/pom.xml @@ -121,7 +121,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/modules/swordv2/pom.xml b/dspace/modules/swordv2/pom.xml index 63ef48427d..11f0b684b5 100644 --- a/dspace/modules/swordv2/pom.xml +++ b/dspace/modules/swordv2/pom.xml @@ -135,7 +135,7 @@ javax.servlet - servlet-api + javax.servlet-api provided diff --git a/dspace/pom.xml b/dspace/pom.xml index bf33e91a4c..9c22c27523 100644 --- a/dspace/pom.xml +++ b/dspace/pom.xml @@ -213,6 +213,7 @@ ${project.parent.basedir}/dspace-api/src/main/java + ${project.parent.basedir}/dspace-api/target/generated-sources/annotations ${project.parent.basedir}/dspace-oai/src/main/java ${project.parent.basedir}/dspace-rdf/src/main/java ${project.parent.basedir}/dspace-rest/src/main/java @@ -320,7 +321,7 @@ command. --> javax.servlet - servlet-api + javax.servlet-api diff --git a/dspace/solr/statistics/conf/schema.xml b/dspace/solr/statistics/conf/schema.xml index 6386beee53..428ade7fc5 100644 --- a/dspace/solr/statistics/conf/schema.xml +++ b/dspace/solr/statistics/conf/schema.xml @@ -286,19 +286,19 @@ --> - + - + - - - + + + @@ -313,7 +313,7 @@ - + @@ -323,8 +323,8 @@ - - + + diff --git a/dspace/src/main/config/build.xml b/dspace/src/main/config/build.xml index ec4782aa5d..ab13191561 100644 --- a/dspace/src/main/config/build.xml +++ b/dspace/src/main/config/build.xml @@ -354,6 +354,7 @@ Common usage: to its log files. In addition, log4j strongly prefers autoconfiguring itself (e.g. see DS-3104). --> + @@ -780,8 +781,12 @@ Common usage: - - + + @@ -955,7 +960,8 @@ You may manually install this file by following these steps: - + @@ -1044,7 +1050,8 @@ You may manually install this file by following these steps: Checking if the Solr index at ${indexDir} is >= Solr ${version} - + @@ -1153,8 +1160,10 @@ For more information, please see the Upgrade Instructions. Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)... - - + + @@ -1168,8 +1177,10 @@ For more information, please see the Upgrade Instructions. Upgrading the Solr index in ${indexDir}. Depending on the index size, this may take a while (please be patient)... - - + + diff --git a/dspace/src/main/docker/test/rest_web.xml b/dspace/src/main/docker/test/rest_web.xml new file mode 100644 index 0000000000..05a6268692 --- /dev/null +++ b/dspace/src/main/docker/test/rest_web.xml @@ -0,0 +1,118 @@ + + + + + + + dspace.request + org.dspace.utils.servlet.DSpaceWebappServletFilter + + + + dspace.request + /* + + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + + springSecurityFilterChain + /* + + + + + DSpace REST API + + org.glassfish.jersey.servlet.ServletContainer + + + javax.ws.rs.Application + org.dspace.rest.DSpaceRestApplication + + 1 + + + + DSpace REST API + /* + + + + default + /static/* + + + + + + + + + The location of the DSpace home directory + + dspace.dir + ${dspace.dir} + + + + contextConfigLocation + + /WEB-INF/applicationContext.xml, + /WEB-INF/security-applicationContext.xml + + + + + org.dspace.app.util.DSpaceContextListener + + + + + org.dspace.servicemanager.servlet.DSpaceKernelServletContextListener + + + + + org.springframework.web.context.ContextLoaderListener + + + + + org.dspace.app.util.DSpaceWebappListener + + + + \ No newline at end of file diff --git a/dspace/src/main/docker/test/solr_web.xml b/dspace/src/main/docker/test/solr_web.xml new file mode 100644 index 0000000000..4329317c53 --- /dev/null +++ b/dspace/src/main/docker/test/solr_web.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + solr/home + ${dspace.dir}/solr + java.lang.String + + + + + + log4j.configuration + ${dspace.dir}/config/log4j-solr.properties + URL locating a Log4J configuration file (properties or XML). + + + + + LocalHostRestrictionFilter + org.dspace.solr.filters.LocalHostRestrictionFilter + + + + + SolrRequestFilter + org.apache.solr.servlet.SolrDispatchFilter + + + + + + + + + SolrRequestFilter + /* + + + + + + org.dspace.solr.filters.ConfigureLog4jListener + + + + Zookeeper + org.apache.solr.servlet.ZookeeperInfoServlet + + + + LoadAdminUI + org.apache.solr.servlet.LoadAdminUiServlet + + + + + + RedirectOldAdminUI + org.apache.solr.servlet.RedirectServlet + + destination + ${context}/#/ + + + + + RedirectOldZookeeper + org.apache.solr.servlet.RedirectServlet + + destination + ${context}/zookeeper + + + + + RedirectLogging + org.apache.solr.servlet.RedirectServlet + + destination + ${context}/#/~logging + + + + + SolrRestApi + org.restlet.ext.servlet.ServerServlet + + org.restlet.application + org.apache.solr.rest.SolrRestApi + + + + + RedirectOldAdminUI + /admin/ + + + RedirectOldAdminUI + /admin + + + RedirectOldZookeeper + /zookeeper.jsp + + + RedirectLogging + /logging + + + + + Zookeeper + /zookeeper + + + + LoadAdminUI + /admin.html + + + + SolrRestApi + /schema/* + + + + .xsl + + application/xslt+xml + + + + admin.html + + + diff --git a/pom.xml b/pom.xml index 47cab720c2..585cccda45 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,8 @@ 3.17 42.2.1 4.10.4 - 2.13.0 + 2.13.0 + 2.6.2 1.7.22 2.8.11 2.26 @@ -150,6 +151,8 @@ true + + false @@ -429,7 +435,7 @@ - -Xmx512m + -Xmx1024m @@ -1037,6 +1043,12 @@ ${hibernate.version} + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + + org.hibernate hibernate-ehcache @@ -1092,7 +1104,7 @@ - spring-jdbc + spring-jdbc org.springframework ${spring.version} @@ -1135,16 +1147,12 @@ mets 1.5.2 - - org.dspace.dependencies - dspace-tm-extractors - 1.0.1 - + commons-beanutils commons-beanutils - 1.9.2 + 1.9.3 commons-cli @@ -1170,9 +1178,9 @@ 3.2.2 - commons-configuration - commons-configuration - 1.10 + org.apache.commons + commons-configuration2 + 2.3 org.apache.commons @@ -1195,10 +1203,9 @@ 2.4 - commons-lang - commons-lang - 2.6 - + org.apache.commons + commons-lang3 + 3.7 commons-logging @@ -1227,8 +1234,8 @@ javax.servlet - servlet-api - 2.5 + javax.servlet-api + 3.1.0 @@ -1247,11 +1254,33 @@ jdom 1.1.3 + - log4j - log4j - 1.2.17 + org.apache.logging.log4j + log4j-api + ${log4j.version} + + org.apache.logging.log4j + log4j-1.2-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-web + ${log4j.version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + oro oro