diff --git a/.travis.yml b/.travis.yml index dfc4c31799..fc8680671b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,14 +30,14 @@ install: "echo 'Skipping install stage, dependencies will be downloaded during b script: # Summary of flags used (below): # license:check => Validate all source code license headers - # -Dmaven.test.skip=false => Enable DSpace Unit Tests + # -DskipTests=false => Enable DSpace Unit Tests # -DskipITs=false => Enable DSpace Integration Tests - # -Pdspace-rest => Enable optional dspace-rest module as part of build + # -Pdspace-rest => Enable optional dspace-rest module as part of build # -P !assembly => Skip assembly of "dspace-installer" directory (as it can be memory intensive) # -B => Maven batch/non-interactive mode (recommended for CI) # -V => Display Maven version info before build # -Dsurefire.rerunFailingTestsCount=2 => try again for flakey tests, and keep track of/report on number of retries - - "mvn clean install license:check -Dmaven.test.skip=false -DskipITs=false -Pdspace-rest -P !assembly -B -V -Dsurefire.rerunFailingTestsCount=2" + - "mvn clean install license:check -DskipTests=false -DskipITs=false -Pdspace-rest -P !assembly -B -V -Dsurefire.rerunFailingTestsCount=2" # After a successful build and test (see 'script'), send code coverage reports to coveralls.io # These code coverage reports are generated by jacoco-maven-plugin (during test process above). diff --git a/README.md b/README.md index f9b8d8c52a..32849d9e30 100644 --- a/README.md +++ b/README.md @@ -90,33 +90,33 @@ run automatically by [Travis CI](https://travis-ci.com/DSpace/DSpace/) for all P * How to run both Unit Tests (via `maven-surefire-plugin`) and Integration Tests (via `maven-failsafe-plugin`): ``` - mvn clean test -Dmaven.test.skip=false -DskipITs=false + mvn clean test -DskipTests=false -DskipITs=false ``` * How to run just Unit Tests: ``` - mvn test -Dmaven.test.skip=false + mvn test -DskipTests=false ``` * How to run a *single* Unit Test ``` # Run all tests in a specific test class # NOTE: failIfNoTests=false is required to skip tests in other modules - mvn test -Dmaven.test.skip=false -Dtest=[full.package.testClassName] -DfailIfNoTests=false + mvn test -DskipTests=false -Dtest=[full.package.testClassName] -DfailIfNoTests=false # Run one test method in a specific test class - mvn test -Dmaven.test.skip=false -Dtest=[full.package.testClassName]#[testMethodName] -DfailIfNoTests=false + mvn test -DskipTests=false -Dtest=[full.package.testClassName]#[testMethodName] -DfailIfNoTests=false ``` * How to run Integration Tests (requires enabling Unit tests too) ``` - mvn verify -Dmaven.test.skip=false -DskipITs=false + mvn verify -DskipTests=false -DskipITs=false ``` * How to run a *single* Integration Test (requires enabling Unit tests too) ``` # Run all integration tests in a specific test class # NOTE: failIfNoTests=false is required to skip tests in other modules - mvn test -Dmaven.test.skip=false -DskipITs=false -Dtest=[full.package.testClassName] -DfailIfNoTests=false + mvn test -DskipTests=false -DskipITs=false -Dtest=[full.package.testClassName] -DfailIfNoTests=false # Run one test method in a specific test class - mvn test -Dmaven.test.skip=false -DskipITs=false -Dtest=[full.package.testClassName]#[testMethodName] -DfailIfNoTests=false + mvn test -DskipTests=false -DskipITs=false -Dtest=[full.package.testClassName]#[testMethodName] -DfailIfNoTests=false ``` * How to run only tests of a specific DSpace module ``` diff --git a/dspace-api/pom.xml b/dspace-api/pom.xml index 7a8662bcff..5b32fdec79 100644 --- a/dspace-api/pom.xml +++ b/dspace-api/pom.xml @@ -137,7 +137,7 @@ false @@ -158,7 +158,7 @@ false - maven.test.skip + skipTests false @@ -241,6 +241,7 @@ ${agnostic.build.dir}/testing/dspace/ true + ${agnostic.build.dir}/testing/dspace/solr/ @@ -255,6 +256,7 @@ ${agnostic.build.dir}/testing/dspace/ true + ${agnostic.build.dir}/testing/dspace/solr/ @@ -323,6 +325,10 @@ apache-jena-libs pom + + commons-cli + commons-cli + commons-codec commons-codec @@ -479,10 +485,84 @@ org.apache.solr - solr-cell + solr-solrj + ${solr.client.version} + + + + + org.apache.solr + solr-core + test ${solr.client.version} + + + commons-cli + commons-cli + + + org.eclipse.jetty + jetty-continuation + + + org.eclipse.jetty + jetty-deploy + + + org.eclipse.jetty + jetty-http + + + org.eclipse.jetty + jetty-io + + + org.eclipse.jetty + jetty-jmx + + + org.eclipse.jetty + jetty-rewrite + + + org.eclipse.jetty + jetty-security + + + org.eclipse.jetty + jetty-server + + + org.eclipse.jetty + jetty-servlet + + + org.eclipse.jetty + jetty-servlets + + + org.eclipse.jetty + jetty-util + + + org.eclipse.jetty + jetty-webapp + + + org.eclipse.jetty + jetty-xml + + + + + org.apache.solr + solr-cell + + commons-cli + commons-cli + org.ow2.asm asm-commons @@ -537,6 +617,32 @@ + + org.apache.lucene + lucene-core + + + + org.apache.lucene + lucene-analyzers-icu + test + + + org.apache.lucene + lucene-analyzers-smartcn + test + + + org.apache.lucene + lucene-analyzers-stempel + test + + + org.apache.xmlbeans + xmlbeans + 2.6.0 + com.maxmind.geoip2 @@ -717,7 +823,7 @@ org.xmlunit - xmlunit-matchers + xmlunit-core 2.6.3 test diff --git a/dspace-api/src/main/java/org/dspace/content/MetadataDSpaceCsvExportServiceImpl.java b/dspace-api/src/main/java/org/dspace/content/MetadataDSpaceCsvExportServiceImpl.java index 85cfcba2e0..1750938937 100644 --- a/dspace-api/src/main/java/org/dspace/content/MetadataDSpaceCsvExportServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/content/MetadataDSpaceCsvExportServiceImpl.java @@ -9,6 +9,7 @@ package org.dspace.content; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -101,7 +102,7 @@ public class MetadataDSpaceCsvExportServiceImpl implements MetadataDSpaceCsvExpo throws SQLException { // Add all the collections List collections = community.getCollections(); - Iterator result = null; + Iterator result = Collections.emptyIterator(); for (Collection collection : collections) { Iterator items = itemService.findByCollection(context, collection); result = addItemsToResult(result, items); 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 3832ddf3ec..8f5d91cc1c 100644 --- a/dspace-api/src/main/java/org/dspace/curate/CurationCli.java +++ b/dspace-api/src/main/java/org/dspace/curate/CurationCli.java @@ -8,21 +8,22 @@ package org.dspace.curate; import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; import java.io.FileReader; +import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.Writer; +import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -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.PosixParser; import org.apache.commons.io.output.NullOutputStream; +import org.dspace.authorize.AuthorizeException; +import org.dspace.content.DSpaceObject; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.core.Context; import org.dspace.core.factory.CoreServiceFactory; @@ -30,183 +31,86 @@ import org.dspace.curate.factory.CurateServiceFactory; import org.dspace.eperson.EPerson; import org.dspace.eperson.factory.EPersonServiceFactory; import org.dspace.eperson.service.EPersonService; +import org.dspace.handle.factory.HandleServiceFactory; +import org.dspace.handle.service.HandleService; +import org.dspace.scripts.DSpaceRunnable; +import org.dspace.utils.DSpace; /** * CurationCli provides command-line access to Curation tools and processes. * * @author richardrodgers */ -public class CurationCli { +public class CurationCli extends DSpaceRunnable { + + private EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); + + private Context context; + private CurationClientOptions curationClientOptions; + + private String task; + private String taskFile; + private String id; + private String queue; + private String scope; + private String reporter; + private Map parameters; + private boolean verbose; + + @Override + public void internalRun() throws Exception { + if (curationClientOptions == CurationClientOptions.HELP) { + printHelp(); + return; + } + + Curator curator = initCurator(); + + // load curation tasks + if (curationClientOptions == CurationClientOptions.TASK) { + long start = System.currentTimeMillis(); + handleCurationTask(curator); + this.endScript(start); + } + + // process task queue + if (curationClientOptions == CurationClientOptions.QUEUE) { + // process the task queue + TaskQueue taskQueue = (TaskQueue) CoreServiceFactory.getInstance().getPluginService() + .getSinglePlugin(TaskQueue.class); + if (taskQueue == null) { + super.handler.logError("No implementation configured for queue"); + throw new UnsupportedOperationException("No queue service available"); + } + long timeRun = this.runQueue(taskQueue, curator); + this.endScript(timeRun); + } + } /** - * Default constructor + * Does the curation task (-t) or the task in the given file (-T). + * Checks: + * - if required option -i is missing. + * - if option -t has a valid task option */ - private CurationCli() { } - - public static void main(String[] args) throws Exception { - // create an options object and populate it - CommandLineParser parser = new PosixParser(); - - Options options = new Options(); - - options.addOption("t", "task", true, - "curation task name"); - options.addOption("T", "taskfile", true, - "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, - "email address of curating eperson"); - options.addOption("r", "reporter", true, - "relative or absolute path to the desired report file. " - + "Use '-' to report to console. " - + "If absent, no reporting"); - options.addOption("s", "scope", true, - "transaction scope to impose: use 'object', 'curation', or 'open'. If absent, 'open' " + - "applies"); - options.addOption("v", "verbose", false, - "report activity to stdout"); - options.addOption("h", "help", false, "help"); - - CommandLine line = parser.parse(options, args); - - String taskName = null; - String taskFileName = null; - String idName = null; - String taskQueueName = null; - String ePersonName = null; - String reporterName = null; - String scope = null; - boolean verbose = false; - final Map parameters = new HashMap<>(); - - if (line.hasOption('h')) { - HelpFormatter help = new HelpFormatter(); - help.printHelp("CurationCli\n", options); - System.out - .println("\nwhole repo: CurationCli -t estimate -i all"); - System.out - .println("single item: CurationCli -t generate -i itemId"); - System.out - .println("task queue: CurationCli -q monthly"); - System.exit(0); - } - - if (line.hasOption('t')) { // task - taskName = line.getOptionValue('t'); - } - - if (line.hasOption('T')) { // task file - taskFileName = line.getOptionValue('T'); - } - - if (line.hasOption('i')) { // id - idName = line.getOptionValue('i'); - } - - if (line.hasOption('q')) { // task queue - taskQueueName = line.getOptionValue('q'); - } - - if (line.hasOption('e')) { // eperson - 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'); - } - - - if (line.hasOption('s')) { // transaction scope - scope = line.getOptionValue('s'); - } - - if (line.hasOption('v')) { // verbose - verbose = true; - } - - // now validate the args - if (idName == null && taskQueueName == null) { - System.out.println("Id must be specified: a handle, 'all', or a task queue (-h for help)"); - System.exit(1); - } - - if (taskName == null && taskFileName == null && taskQueueName == null) { - System.out.println("A curation task or queue must be specified (-h for help)"); - System.exit(1); - } - - if (scope != null && Curator.TxScope.valueOf(scope.toUpperCase()) == null) { - System.out.println("Bad transaction scope '" + scope + "': only 'object', 'curation' or 'open' recognized"); - System.exit(1); - } - EPersonService ePersonService = EPersonServiceFactory.getInstance().getEPersonService(); - - Context c = new Context(Context.Mode.BATCH_EDIT); - if (ePersonName != null) { - EPerson ePerson = ePersonService.findByEmail(c, ePersonName); - if (ePerson == null) { - System.out.println("EPerson not found: " + ePersonName); - System.exit(1); - } - c.setCurrentUser(ePerson); - } else { - c.turnOffAuthorisationSystem(); - } - - Curator curator = new Curator(); - OutputStream reporter; - if (null == reporterName) { - reporter = new NullOutputStream(); - } else if ("-".equals(reporterName)) { - reporter = System.out; - } else { - reporter = new PrintStream(reporterName); - } - Writer reportWriter = new OutputStreamWriter(reporter); - curator.setReporter(reportWriter); - - if (scope != null) { - 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 - if (taskName != null) { + private void handleCurationTask(Curator curator) throws IOException, SQLException { + String taskName; + if (commandLine.hasOption('t')) { if (verbose) { - System.out.println("Adding task: " + taskName); + handler.logInfo("Adding task: " + this.task); } - curator.addTask(taskName); - if (verbose && !curator.hasTask(taskName)) { - System.out.println("Task: " + taskName + " not resolved"); + curator.addTask(this.task); + if (verbose && !curator.hasTask(this.task)) { + handler.logInfo("Task: " + this.task + " not resolved"); } - } else if (taskQueueName == null) { + } else if (commandLine.hasOption('T')) { // load taskFile BufferedReader reader = null; try { - reader = new BufferedReader(new FileReader(taskFileName)); + reader = new BufferedReader(new FileReader(this.taskFile)); while ((taskName = reader.readLine()) != null) { if (verbose) { - System.out.println("Adding task: " + taskName); + super.handler.logInfo("Adding task: " + taskName); } curator.addTask(taskName); } @@ -217,59 +121,242 @@ public class CurationCli { } } // run tasks against object - long start = System.currentTimeMillis(); if (verbose) { - System.out.println("Starting curation"); + super.handler.logInfo("Starting curation"); + super.handler.logInfo("Curating id: " + this.id); } - if (idName != null) { + if ("all".equals(this.id)) { + // run on whole Site + curator.curate(context, + ContentServiceFactory.getInstance().getSiteService().findSite(context).getHandle()); + } else { + curator.curate(context, this.id); + } + } + + /** + * Runs task queue (-q set) + * + * @param queue The task queue + * @param curator The curator + * @return Time when queue started + */ + private long runQueue(TaskQueue queue, Curator curator) throws SQLException, AuthorizeException, IOException { + // use current time as our reader 'ticket' + long ticket = System.currentTimeMillis(); + Iterator entryIter = queue.dequeue(this.queue, ticket).iterator(); + while (entryIter.hasNext()) { + TaskQueueEntry entry = entryIter.next(); if (verbose) { - System.out.println("Curating id: " + idName); + super.handler.logInfo("Curating id: " + entry.getObjectId()); } - if ("all".equals(idName)) { - // run on whole Site - curator.curate(c, ContentServiceFactory.getInstance().getSiteService().findSite(c).getHandle()); + curator.clear(); + // does entry relate to a DSO or workflow object? + if (entry.getObjectId().indexOf('/') > 0) { + for (String taskName : entry.getTaskNames()) { + curator.addTask(taskName); + } + curator.curate(context, entry.getObjectId()); } else { - curator.curate(c, idName); + // make eperson who queued task the effective user + EPerson agent = ePersonService.findByEmail(context, entry.getEpersonId()); + if (agent != null) { + context.setCurrentUser(agent); + } + CurateServiceFactory.getInstance().getWorkflowCuratorService() + .curate(curator, context, entry.getObjectId()); + } + } + queue.release(this.queue, ticket, true); + return ticket; + } + + /** + * End of curation script; logs script time if -v verbose is set + * + * @param timeRun Time script was started + * @throws SQLException If DSpace contextx can't complete + */ + private void endScript(long timeRun) throws SQLException { + context.complete(); + if (verbose) { + long elapsed = System.currentTimeMillis() - timeRun; + this.handler.logInfo("Ending curation. Elapsed time: " + elapsed); + } + } + + /** + * Initialize the curator with command line variables + * + * @return Initialised curator + * @throws FileNotFoundException If file of command line variable -r reporter is not found + */ + private Curator initCurator() throws FileNotFoundException { + Curator curator = new Curator(); + OutputStream reporterStream; + if (null == this.reporter) { + reporterStream = new NullOutputStream(); + } else if ("-".equals(this.reporter)) { + reporterStream = System.out; + } else { + reporterStream = new PrintStream(this.reporter); + } + Writer reportWriter = new OutputStreamWriter(reporterStream); + curator.setReporter(reportWriter); + + if (this.scope != null) { + Curator.TxScope txScope = Curator.TxScope.valueOf(this.scope.toUpperCase()); + curator.setTransactionScope(txScope); + } + + curator.addParameters(parameters); + // we are operating in batch mode, if anyone cares. + curator.setInvoked(Curator.Invoked.BATCH); + return curator; + } + + @Override + public void printHelp() { + super.printHelp(); + super.handler.logInfo("\nwhole repo: CurationCli -t estimate -i all"); + super.handler.logInfo("single item: CurationCli -t generate -i itemId"); + super.handler.logInfo("task queue: CurationCli -q monthly"); + } + + @Override + public CurationScriptConfiguration getScriptConfiguration() { + return new DSpace().getServiceManager().getServiceByName("curate", CurationScriptConfiguration.class); + } + + @Override + public void setup() { + if (this.commandLine.hasOption('e')) { + String ePersonEmail = this.commandLine.getOptionValue('e'); + this.context = new Context(Context.Mode.BATCH_EDIT); + try { + EPerson ePerson = ePersonService.findByEmail(this.context, ePersonEmail); + if (ePerson == null) { + super.handler.logError("EPerson not found: " + ePersonEmail); + throw new IllegalArgumentException("Unable to find a user with email: " + ePersonEmail); + } + this.context.setCurrentUser(ePerson); + } catch (SQLException e) { + throw new IllegalArgumentException("SQLException trying to find user with email: " + ePersonEmail); } } else { - // process the task queue - TaskQueue queue = (TaskQueue) CoreServiceFactory.getInstance().getPluginService() - .getSinglePlugin(TaskQueue.class); - if (queue == null) { - System.out.println("No implementation configured for queue"); - throw new UnsupportedOperationException("No queue service available"); - } - // use current time as our reader 'ticket' - long ticket = System.currentTimeMillis(); - Iterator entryIter = queue.dequeue(taskQueueName, ticket).iterator(); - while (entryIter.hasNext()) { - TaskQueueEntry entry = entryIter.next(); - if (verbose) { - System.out.println("Curating id: " + entry.getObjectId()); - } - curator.clear(); - // does entry relate to a DSO or workflow object? - if (entry.getObjectId().indexOf("/") > 0) { - for (String task : entry.getTaskNames()) { - curator.addTask(task); - } - curator.curate(c, entry.getObjectId()); - } else { - // make eperson who queued task the effective user - EPerson agent = ePersonService.findByEmail(c, entry.getEpersonId()); - if (agent != null) { - c.setCurrentUser(agent); - } - CurateServiceFactory.getInstance().getWorkflowCuratorService() - .curate(curator, c, entry.getObjectId()); - } - } - queue.release(taskQueueName, ticket, true); + throw new IllegalArgumentException("Needs an -e to set eperson (admin)"); } - c.complete(); - if (verbose) { - long elapsed = System.currentTimeMillis() - start; - System.out.println("Ending curation. Elapsed time: " + elapsed); + this.curationClientOptions = CurationClientOptions.getClientOption(commandLine); + + if (this.curationClientOptions != null) { + this.initGeneralLineOptionsAndCheckIfValid(); + if (curationClientOptions == CurationClientOptions.TASK) { + this.initTaskLineOptionsAndCheckIfValid(); + } else if (curationClientOptions == CurationClientOptions.QUEUE) { + this.queue = this.commandLine.getOptionValue('q'); + } + } else { + throw new IllegalArgumentException("[--help || --task|--taskfile <> -identifier <> || -queue <> ] must be" + + " specified"); + } + } + + /** + * Fills in some optional command line options. + * Checks if there are missing required options or invalid values for options. + */ + private void initGeneralLineOptionsAndCheckIfValid() { + // report file + if (this.commandLine.hasOption('r')) { + this.reporter = this.commandLine.getOptionValue('r'); + } + + // parameters + this.parameters = new HashMap<>(); + if (this.commandLine.hasOption('p')) { + for (String parameter : this.commandLine.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"; + } + this.parameters.put(name, value); + } + } + + // verbose + verbose = false; + if (commandLine.hasOption('v')) { + verbose = true; + } + + // scope + if (this.commandLine.getOptionValue('s') != null) { + this.scope = this.commandLine.getOptionValue('s'); + if (this.scope != null && Curator.TxScope.valueOf(this.scope.toUpperCase()) == null) { + this.handler.logError("Bad transaction scope '" + this.scope + "': only 'object', 'curation' or " + + "'open' recognized"); + throw new IllegalArgumentException( + "Bad transaction scope '" + this.scope + "': only 'object', 'curation' or " + + "'open' recognized"); + } + } + } + + /** + * Fills in required command line options for the task or taskFile option. + * Checks if there are is a missing required -i option and if -i is either 'all' or a valid dso handle. + * Checks if -t task has a valid task option. + * Checks if -T taskfile is a valid file. + */ + private void initTaskLineOptionsAndCheckIfValid() { + // task or taskFile + if (this.commandLine.hasOption('t')) { + this.task = this.commandLine.getOptionValue('t'); + if (!CurationClientOptions.getTaskOptions().contains(this.task)) { + super.handler + .logError("-t task must be one of: " + CurationClientOptions.getTaskOptions()); + throw new IllegalArgumentException( + "-t task must be one of: " + CurationClientOptions.getTaskOptions()); + } + } else if (this.commandLine.hasOption('T')) { + this.taskFile = this.commandLine.getOptionValue('T'); + if (!(new File(this.taskFile).isFile())) { + super.handler + .logError("-T taskFile must be valid file: " + this.taskFile); + throw new IllegalArgumentException("-T taskFile must be valid file: " + this.taskFile); + } + } + + if (this.commandLine.hasOption('i')) { + this.id = this.commandLine.getOptionValue('i').toLowerCase(); + if (!this.id.equalsIgnoreCase("all")) { + HandleService handleService = HandleServiceFactory.getInstance().getHandleService(); + DSpaceObject dso; + try { + dso = handleService.resolveToObject(this.context, id); + } catch (SQLException e) { + super.handler.logError("SQLException trying to resolve handle " + id + " to a valid dso"); + throw new IllegalArgumentException( + "SQLException trying to resolve handle " + id + " to a valid dso"); + } + if (dso == null) { + super.handler.logError("Id must be specified: a valid dso handle or 'all'; " + this.id + " could " + + "not be resolved to valid dso handle"); + throw new IllegalArgumentException( + "Id must be specified: a valid dso handle or 'all'; " + this.id + " could " + + "not be resolved to valid dso handle"); + } + } + } else { + super.handler.logError("Id must be specified: a handle, 'all', or no -i and a -q task queue (-h for " + + "help)"); + throw new IllegalArgumentException( + "Id must be specified: a handle, 'all', or no -i and a -q task queue (-h for " + + "help)"); } } } diff --git a/dspace-api/src/main/java/org/dspace/curate/CurationClientOptions.java b/dspace-api/src/main/java/org/dspace/curate/CurationClientOptions.java new file mode 100644 index 0000000000..7daf107aad --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/curate/CurationClientOptions.java @@ -0,0 +1,85 @@ +/** + * 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.util.ArrayList; +import java.util.List; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.apache.commons.lang3.StringUtils; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; + +/** + * This Enum holds all the possible options and combinations for the Curation script + * + * @author Maria Verdonck (Atmire) on 23/06/2020 + */ +public enum CurationClientOptions { + TASK, + QUEUE, + HELP; + + private static List taskOptions; + + /** + * This method resolves the CommandLine parameters to figure out which action the curation script should perform + * + * @param commandLine The relevant CommandLine for the curation script + * @return The curation option to be ran, parsed from the CommandLine + */ + protected static CurationClientOptions getClientOption(CommandLine commandLine) { + if (commandLine.hasOption("h")) { + return CurationClientOptions.HELP; + } else if (commandLine.hasOption("t") || commandLine.hasOption("T")) { + return CurationClientOptions.TASK; + } else if (commandLine.hasOption("q")) { + return CurationClientOptions.QUEUE; + } + return null; + } + + protected static Options constructOptions() { + Options options = new Options(); + + options.addOption("t", "task", true, "curation task name; options: " + getTaskOptions()); + options.addOption("T", "taskfile", true, "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, "email address of curating eperson"); + options.addOption("r", "reporter", true, + "relative or absolute path to the desired report file. Use '-' to report to console. If absent, no " + + "reporting"); + options.addOption("s", "scope", true, + "transaction scope to impose: use 'object', 'curation', or 'open'. If absent, 'open' applies"); + options.addOption("v", "verbose", false, "report activity to stdout"); + options.addOption("h", "help", false, "help"); + + return options; + } + + /** + * Creates list of the taskOptions' keys from the configs of plugin.named.org.dspace.curate.CurationTask + * + * @return List of the taskOptions' keys from the configs of plugin.named.org.dspace.curate.CurationTask + */ + public static List getTaskOptions() { + if (taskOptions == null) { + ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + String[] taskConfigs = configurationService.getArrayProperty("plugin.named.org.dspace.curate.CurationTask"); + taskOptions = new ArrayList<>(); + for (String taskConfig : taskConfigs) { + taskOptions.add(StringUtils.substringAfterLast(taskConfig, "=").trim()); + } + } + return taskOptions; + } +} diff --git a/dspace-api/src/main/java/org/dspace/curate/CurationScriptConfiguration.java b/dspace-api/src/main/java/org/dspace/curate/CurationScriptConfiguration.java new file mode 100644 index 0000000000..785926908e --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/curate/CurationScriptConfiguration.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.curate; + +import java.sql.SQLException; + +import org.apache.commons.cli.Options; +import org.dspace.authorize.service.AuthorizeService; +import org.dspace.core.Context; +import org.dspace.scripts.configuration.ScriptConfiguration; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * The {@link ScriptConfiguration} for the {@link CurationCli} script + * + * @author Maria Verdonck (Atmire) on 23/06/2020 + */ +public class CurationScriptConfiguration extends ScriptConfiguration { + + @Autowired + private AuthorizeService authorizeService; + + private Class dspaceRunnableClass; + + @Override + public Class getDspaceRunnableClass() { + return this.dspaceRunnableClass; + } + + @Override + public void setDspaceRunnableClass(Class dspaceRunnableClass) { + this.dspaceRunnableClass = dspaceRunnableClass; + } + + /** + * Only admin can run Curation script via the scripts and processes endpoints. + * @param context The relevant DSpace context + * @return True if currentUser is admin, otherwise false + */ + @Override + public boolean isAllowedToExecute(Context context) { + try { + return authorizeService.isAdmin(context); + } catch (SQLException e) { + throw new RuntimeException("SQLException occurred when checking if the current user is an admin", e); + } + } + + @Override + public Options getOptions() { + if (options == null) { + super.options = CurationClientOptions.constructOptions(); + } + return options; + } +} 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 44733174df..8f12750bae 100644 --- a/dspace-api/src/main/java/org/dspace/curate/Curator.java +++ b/dspace-api/src/main/java/org/dspace/curate/Curator.java @@ -98,6 +98,7 @@ public class Curator { communityService = ContentServiceFactory.getInstance().getCommunityService(); itemService = ContentServiceFactory.getInstance().getItemService(); handleService = HandleServiceFactory.getInstance().getHandleService(); + resolver = new TaskResolver(); } /** @@ -142,10 +143,10 @@ public class Curator { // performance order currently FIFO - to be revisited perfList.add(taskName); } catch (IOException ioE) { - log.error("Task: '" + taskName + "' initialization failure: " + ioE.getMessage()); + System.out.println("Task: '" + taskName + "' initialization failure: " + ioE.getMessage()); } } else { - log.error("Task: '" + taskName + "' does not resolve"); + System.out.println("Task: '" + taskName + "' does not resolve"); } return this; } @@ -259,13 +260,6 @@ public class Curator { /** * Performs all configured tasks upon DSpace object * (Community, Collection or Item). - *

- * Note: Site-wide tasks will default to running as - * an Anonymous User unless you call the Site-wide task - * via the {@link curate(Context,String)} or - * {@link #curate(Context, DSpaceObject)} method with an - * authenticated Context object. - * * @param dso the DSpace object * @throws IOException if IO error */ @@ -325,7 +319,7 @@ public class Curator { taskQ.enqueue(queueId, new TaskQueueEntry(c.getCurrentUser().getName(), System.currentTimeMillis(), perfList, id)); } else { - log.error("curate - no TaskQueue implemented"); + System.out.println("curate - no TaskQueue implemented"); } } @@ -346,7 +340,7 @@ public class Curator { try { reporter.append(message); } catch (IOException ex) { - log.error("Task reporting failure", ex); + System.out.println("Task reporting failure: " + ex); } } @@ -552,7 +546,7 @@ public class Curator { return !suspend(statusCode); } catch (IOException ioe) { //log error & pass exception upwards - log.error("Error executing curation task '" + task.getName() + "'", ioe); + System.out.println("Error executing curation task '" + task.getName() + "'; " + ioe); throw ioe; } } @@ -568,7 +562,7 @@ public class Curator { return !suspend(statusCode); } catch (IOException ioe) { //log error & pass exception upwards - log.error("Error executing curation task '" + task.getName() + "'", ioe); + System.out.println("Error executing curation task '" + task.getName() + "'; " + ioe); throw ioe; } } diff --git a/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java b/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java index d3efb3c626..d82779015f 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java +++ b/dspace-api/src/main/java/org/dspace/discovery/DiscoverQuery.java @@ -7,6 +7,9 @@ */ package org.dspace.discovery; +import static java.util.Collections.singletonList; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -31,7 +34,7 @@ public class DiscoverQuery { **/ private String query; private List filterQueries; - private String DSpaceObjectFilter = null; + private List dspaceObjectFilters = new ArrayList<>(); private List fieldPresentQueries; private boolean spellCheck; @@ -118,20 +121,33 @@ public class DiscoverQuery { * Sets the DSpace object filter, must be an DSpace Object type integer * can be used to only return objects from a certain DSpace Object type * - * @param DSpaceObjectFilter the DSpace object filer + * @param dspaceObjectFilter the DSpace object filter */ - public void setDSpaceObjectFilter(String DSpaceObjectFilter) { - this.DSpaceObjectFilter = DSpaceObjectFilter; + public void setDSpaceObjectFilter(String dspaceObjectFilter) { + this.dspaceObjectFilters = singletonList(dspaceObjectFilter); } /** - * Gets the DSpace object filter - * can be used to only return objects from a certain DSpace Object type + * Adds a DSpace object filter, must be an DSpace Object type integer. + * Can be used to also return objects from a certain DSpace Object type. * - * @return the DSpace object filer + * @param dspaceObjectFilter the DSpace object filer */ - public String getDSpaceObjectFilter() { - return DSpaceObjectFilter; + public void addDSpaceObjectFilter(String dspaceObjectFilter) { + + if (isNotBlank(dspaceObjectFilter)) { + this.dspaceObjectFilters.add(dspaceObjectFilter); + } + } + + /** + * Gets the DSpace object filters + * can be used to only return objects from certain DSpace Object types + * + * @return the DSpace object filters + */ + public List getDSpaceObjectFilters() { + return dspaceObjectFilters; } /** 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 1c47d46162..88e32d0aaf 100644 --- a/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/discovery/SolrServiceImpl.java @@ -7,6 +7,8 @@ */ package org.dspace.discovery; +import static java.util.stream.Collectors.joining; + import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -751,8 +753,13 @@ public class SolrServiceImpl implements SearchService, IndexingService { String filterQuery = discoveryQuery.getFilterQueries().get(i); solrQuery.addFilterQuery(filterQuery); } - if (discoveryQuery.getDSpaceObjectFilter() != null) { - solrQuery.addFilterQuery(SearchUtils.RESOURCE_TYPE_FIELD + ":" + discoveryQuery.getDSpaceObjectFilter()); + if (discoveryQuery.getDSpaceObjectFilters() != null) { + solrQuery.addFilterQuery( + discoveryQuery.getDSpaceObjectFilters() + .stream() + .map(filter -> SearchUtils.RESOURCE_TYPE_FIELD + ":" + filter) + .collect(joining(" OR ")) + ); } for (int i = 0; i < discoveryQuery.getFieldPresentQueries().size(); i++) { diff --git a/dspace-api/src/main/java/org/dspace/importer/external/bibtex/service/BibtexImportMetadataSourceServiceImpl.java b/dspace-api/src/main/java/org/dspace/importer/external/bibtex/service/BibtexImportMetadataSourceServiceImpl.java new file mode 100644 index 0000000000..7468d601f5 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/bibtex/service/BibtexImportMetadataSourceServiceImpl.java @@ -0,0 +1,107 @@ +/** + * 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.importer.external.bibtex.service; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.annotation.Resource; + +import org.dspace.importer.external.exception.FileSourceException; +import org.dspace.importer.external.service.components.AbstractPlainMetadataSource; +import org.dspace.importer.external.service.components.dto.PlainMetadataKeyValueItem; +import org.dspace.importer.external.service.components.dto.PlainMetadataSourceDto; +import org.jbibtex.BibTeXDatabase; +import org.jbibtex.BibTeXEntry; +import org.jbibtex.BibTeXParser; +import org.jbibtex.Key; +import org.jbibtex.ParseException; +import org.jbibtex.Value; + +/** + * Implements a metadata importer for BibTeX files + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ +public class BibtexImportMetadataSourceServiceImpl extends AbstractPlainMetadataSource { + + + /** + * The string that identifies this import implementation as + * MetadataSource implementation + * + * @return the identifying uri + */ + @Override + public String getImportSource() { + return "BibTeXMetadataSource"; + } + + @Override + protected List readData (InputStream + inputStream) throws FileSourceException { + List list = new ArrayList<>(); + BibTeXDatabase database; + try { + database = parseBibTex(inputStream); + } catch (IOException | ParseException e) { + throw new FileSourceException("Unable to parse file with BibTeX parser"); + } + if (database == null || database.getEntries() == null) { + throw new FileSourceException("File results in an empty list of metadata"); + } + if (database.getEntries() != null) { + for (Entry entry : database.getEntries().entrySet()) { + PlainMetadataSourceDto item = new PlainMetadataSourceDto(); + List keyValues = new ArrayList<>(); + item.setMetadata(keyValues); + PlainMetadataKeyValueItem keyValueItem = new PlainMetadataKeyValueItem(); + keyValueItem.setKey(entry.getValue().getType().getValue()); + keyValueItem.setValue(entry.getKey().getValue()); + keyValues.add(keyValueItem); + if (entry.getValue().getFields() != null) { + for (Entry subentry : entry.getValue().getFields().entrySet()) { + PlainMetadataKeyValueItem innerItem = new PlainMetadataKeyValueItem(); + innerItem.setKey(subentry.getKey().getValue()); + innerItem.setValue(subentry.getValue().toUserString()); + keyValues.add(innerItem); + } + } + list.add(item); + } + } + return list; + } + + private BibTeXDatabase parseBibTex(InputStream inputStream) throws IOException, ParseException { + Reader reader = new InputStreamReader(inputStream); + BibTeXParser bibtexParser = new BibTeXParser(); + return bibtexParser.parse(reader); + } + + + /** + * Retrieve the MetadataFieldMapping containing the mapping between RecordType + * (in this case PlainMetadataSourceDto.class) and Metadata + * + * @return The configured MetadataFieldMapping + */ + @Override + @SuppressWarnings("unchecked") + @Resource(name = "bibtexMetadataFieldMap") + public void setMetadataFieldMap(@SuppressWarnings("rawtypes") Map metadataFieldMap) { + super.setMetadataFieldMap(metadataFieldMap); + } + +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/exception/FileMultipleOccurencesException.java b/dspace-api/src/main/java/org/dspace/importer/external/exception/FileMultipleOccurencesException.java new file mode 100644 index 0000000000..d09889a7ff --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/exception/FileMultipleOccurencesException.java @@ -0,0 +1,29 @@ +/** + * 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.importer.external.exception; + +/** + * This exception could be throws when more than one element is found + * in a method that works on one only. + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ + +public class FileMultipleOccurencesException extends Exception { + + private static final long serialVersionUID = 1222409723339501937L; + + public FileMultipleOccurencesException(String message, Throwable cause) { + super(message, cause); + } + + public FileMultipleOccurencesException(String message) { + super(message); + } +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/exception/FileSourceException.java b/dspace-api/src/main/java/org/dspace/importer/external/exception/FileSourceException.java new file mode 100644 index 0000000000..c41ce94151 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/exception/FileSourceException.java @@ -0,0 +1,28 @@ +/** + * 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.importer.external.exception; + +/** + * Represents a problem with the File content: e.g. null input stream, invalid content, ... + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ + +public class FileSourceException extends Exception { + + private static final long serialVersionUID = 6895579588455260182L; + + public FileSourceException(String message, Throwable cause) { + super(message, cause); + } + + public FileSourceException(String message) { + super(message); + } +} 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 3ce45d6048..aed2f0e084 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 @@ -117,16 +117,13 @@ public abstract class AbstractMetadataFieldMapping public Collection resultToDCValueMapping(RecordType record) { List values = new LinkedList(); - for (MetadataContributor query : getMetadataFieldMap().values()) { try { values.addAll(query.contributeMetadata(record)); } catch (Exception e) { log.error("Error", e); } - } return values; - } } diff --git a/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/contributor/SimpleMetadataContributor.java b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/contributor/SimpleMetadataContributor.java new file mode 100644 index 0000000000..21dd1bfcee --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/metadatamapping/contributor/SimpleMetadataContributor.java @@ -0,0 +1,94 @@ +/** + * 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.importer.external.metadatamapping.contributor; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + +import org.dspace.importer.external.metadatamapping.MetadataFieldConfig; +import org.dspace.importer.external.metadatamapping.MetadataFieldMapping; +import org.dspace.importer.external.metadatamapping.MetadatumDTO; +import org.dspace.importer.external.service.components.dto.PlainMetadataKeyValueItem; +import org.dspace.importer.external.service.components.dto.PlainMetadataSourceDto; + +/** + * Metadata contributor that takes an PlainMetadataSourceDto instance and turns it into a + * collection of metadatum + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ +public class SimpleMetadataContributor implements MetadataContributor { + + private MetadataFieldConfig field; + + private String key; + + private MetadataFieldMapping> metadataFieldMapping; + + public SimpleMetadataContributor(MetadataFieldConfig field, String key) { + this.field = field; + this.key = key; + } + + public SimpleMetadataContributor() { } + + /** + * Set the metadataFieldMapping of this SimpleMetadataContributor + * + * @param metadataFieldMapping the new mapping. + */ + @Override + public void setMetadataFieldMapping( + MetadataFieldMapping> metadataFieldMapping) { + this.metadataFieldMapping = metadataFieldMapping; + } + + /** + * Retrieve the metadata associated with the given object. + * It match the key found in PlainMetadataSourceDto instance with the key passed to constructor. + * In case of success, new metadatum is constructer (using field elements and PlainMetadataSourceDto value) + * and added to the list. + * + * @param t A class to retrieve metadata and key to match from. t and contained list "metadata" MUST be not null. + * @return a collection of import records. Only the identifier of the found records may be put in the record. + */ + @Override + public Collection contributeMetadata(PlainMetadataSourceDto t) { + List values = new LinkedList<>(); + for (PlainMetadataKeyValueItem metadatum : t.getMetadata()) { + if (key.equals(metadatum.getKey())) { + MetadatumDTO dcValue = new MetadatumDTO(); + dcValue.setValue(metadatum.getValue()); + dcValue.setElement(field.getElement()); + dcValue.setQualifier(field.getQualifier()); + dcValue.setSchema(field.getSchema()); + values.add(dcValue); + } + } + return values; + } + + /* + * Setter to inject field item + */ + public void setField(MetadataFieldConfig field) { + this.field = field; + } + + /* + * Setter to inject key value + */ + public void setKey(String key) { + this.key = key; + } + +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java index bcb5034301..b4d8ee1222 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/pubmed/service/PubmedImportMetadataSourceServiceImpl.java @@ -8,6 +8,10 @@ package org.dspace.importer.external.pubmed.service; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.io.StringReader; import java.util.Collection; import java.util.LinkedList; @@ -20,6 +24,7 @@ import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import com.google.common.io.CharStreams; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMXMLBuilderFactory; import org.apache.axiom.om.OMXMLParserWrapper; @@ -27,8 +32,12 @@ import org.apache.axiom.om.xpath.AXIOMXPath; import org.dspace.content.Item; import org.dspace.importer.external.datamodel.ImportRecord; import org.dspace.importer.external.datamodel.Query; +import org.dspace.importer.external.exception.FileMultipleOccurencesException; +import org.dspace.importer.external.exception.FileSourceException; import org.dspace.importer.external.exception.MetadataSourceException; import org.dspace.importer.external.service.AbstractImportMetadataSourceService; +import org.dspace.importer.external.service.components.FileSource; +import org.dspace.importer.external.service.components.QuerySource; import org.jaxen.JaxenException; /** @@ -36,11 +45,29 @@ import org.jaxen.JaxenException; * * @author Roeland Dillen (roeland at atmire dot com) */ -public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadataSourceService { +public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadataSourceService + implements QuerySource, FileSource { + private String baseAddress; private WebTarget pubmedWebTarget; + private List supportedExtensions; + + /** + * Set the file extensions supported by this metadata service + * + * @param supportedExtensionsthe file extensions (xml,txt,...) supported by this service + */ + public void setSupportedExtensions(List supportedExtensions) { + this.supportedExtensions = supportedExtensions; + } + + @Override + public List getSupportedExtensions() { + return supportedExtensions; + } + /** * Find the number of records matching a query; * @@ -49,7 +76,7 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat * @throws MetadataSourceException if the underlying methods throw any exception. */ @Override - public int getNbRecords(String query) throws MetadataSourceException { + public int getRecordsCount(String query) throws MetadataSourceException { return retry(new GetNbRecords(query)); } @@ -61,7 +88,7 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat * @throws MetadataSourceException if the underlying methods throw any exception. */ @Override - public int getNbRecords(Query query) throws MetadataSourceException { + public int getRecordsCount(Query query) throws MetadataSourceException { return retry(new GetNbRecords(query)); } @@ -357,7 +384,6 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat @Override public Collection call() throws Exception { - List records = new LinkedList(); WebTarget getRecordIdsTarget = pubmedWebTarget .queryParam("term", query.getParameterAsClass("term", String.class)); @@ -382,13 +408,41 @@ public class PubmedImportMetadataSourceServiceImpl extends AbstractImportMetadat invocationBuilder = getRecordsTarget.request(MediaType.TEXT_PLAIN_TYPE); response = invocationBuilder.get(); - List omElements = splitToRecords(response.readEntity(String.class)); - - for (OMElement record : omElements) { - records.add(transformSourceRecords(record)); - } - - return records; + String xml = response.readEntity(String.class); + return parseXMLString(xml); } } + + + @Override + public List getRecords(InputStream inputStream) throws FileSourceException { + String xml = null; + try (Reader reader = new InputStreamReader(inputStream, "UTF-8")) { + xml = CharStreams.toString(reader); + return parseXMLString(xml); + } catch (IOException e) { + throw new FileSourceException ("Cannot read XML from InputStream", e); + } + } + + @Override + public ImportRecord getRecord(InputStream inputStream) throws FileSourceException, FileMultipleOccurencesException { + List importRecord = getRecords(inputStream); + if (importRecord == null || importRecord.isEmpty()) { + throw new FileSourceException("Cannot find (valid) record in File"); + } else if (importRecord.size() > 1) { + throw new FileMultipleOccurencesException("File contains more than one entry"); + } else { + return importRecord.get(0); + } + } + + private List parseXMLString(String xml) { + List records = new LinkedList(); + List omElements = splitToRecords(xml); + for (OMElement record : omElements) { + records.add(transformSourceRecords(record)); + } + return records; + } } 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 87c2bd0029..815a10b5a7 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 @@ -8,6 +8,10 @@ package org.dspace.importer.external.service; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -19,11 +23,16 @@ 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; +import org.dspace.importer.external.exception.FileMultipleOccurencesException; +import org.dspace.importer.external.exception.FileSourceException; import org.dspace.importer.external.exception.MetadataSourceException; import org.dspace.importer.external.service.components.Destroyable; +import org.dspace.importer.external.service.components.FileSource; import org.dspace.importer.external.service.components.MetadataSource; +import org.dspace.importer.external.service.components.QuerySource; import org.springframework.beans.factory.annotation.Autowired; + /** * Main entry point for the import framework. * Instead of calling the different importer implementations, the ImportService should be called instead. @@ -32,8 +41,10 @@ import org.springframework.beans.factory.annotation.Autowired; * importer implementation you want to use. * * @author Roeland Dillen (roeland at atmire dot com) + * @author Pasquale Cavallo (pasquale.cavallo@4science.it) */ public class ImportService implements Destroyable { + private HashMap importSources = new HashMap<>(); Logger log = org.apache.logging.log4j.LogManager.getLogger(ImportService.class); @@ -101,11 +112,11 @@ public class ImportService implements Destroyable { public Collection findMatchingRecords(String uri, Item item) throws MetadataSourceException { try { List recordList = new LinkedList(); - for (MetadataSource metadataSource : matchingImports(uri)) { - recordList.addAll(metadataSource.findMatchingRecords(item)); + if (metadataSource instanceof QuerySource) { + recordList.addAll(((QuerySource)metadataSource).findMatchingRecords(item)); + } } - return recordList; } catch (Exception e) { throw new MetadataSourceException(e); @@ -125,9 +136,10 @@ public class ImportService implements Destroyable { try { List recordList = new LinkedList(); for (MetadataSource metadataSource : matchingImports(uri)) { - recordList.addAll(metadataSource.findMatchingRecords(query)); + if (metadataSource instanceof QuerySource) { + recordList.addAll(((QuerySource)metadataSource).findMatchingRecords(query)); + } } - return recordList; } catch (Exception e) { throw new MetadataSourceException(e); @@ -145,8 +157,10 @@ public class ImportService implements Destroyable { public int getNbRecords(String uri, String query) throws MetadataSourceException { try { int total = 0; - for (MetadataSource MetadataSource : matchingImports(uri)) { - total += MetadataSource.getNbRecords(query); + for (MetadataSource metadataSource : matchingImports(uri)) { + if (metadataSource instanceof QuerySource) { + total += ((QuerySource)metadataSource).getRecordsCount(query); + } } return total; } catch (Exception e) { @@ -165,8 +179,10 @@ public class ImportService implements Destroyable { public int getNbRecords(String uri, Query query) throws MetadataSourceException { try { int total = 0; - for (MetadataSource MetadataSource : matchingImports(uri)) { - total += MetadataSource.getNbRecords(query); + for (MetadataSource metadataSource : matchingImports(uri)) { + if (metadataSource instanceof QuerySource) { + total += ((QuerySource)metadataSource).getRecordsCount(query); + } } return total; } catch (Exception e) { @@ -189,7 +205,9 @@ public class ImportService implements Destroyable { try { List recordList = new LinkedList<>(); for (MetadataSource metadataSource : matchingImports(uri)) { - recordList.addAll(metadataSource.getRecords(query, start, count)); + if (metadataSource instanceof QuerySource) { + recordList.addAll(((QuerySource)metadataSource).getRecords(query, start, count)); + } } return recordList; } catch (Exception e) { @@ -209,7 +227,9 @@ public class ImportService implements Destroyable { try { List recordList = new LinkedList<>(); for (MetadataSource metadataSource : matchingImports(uri)) { - recordList.addAll(metadataSource.getRecords(query)); + if (metadataSource instanceof QuerySource) { + recordList.addAll(((QuerySource)metadataSource).getRecords(query)); + } } return recordList; } catch (Exception e) { @@ -229,10 +249,12 @@ public class ImportService implements Destroyable { public ImportRecord getRecord(String uri, String id) throws MetadataSourceException { try { for (MetadataSource metadataSource : matchingImports(uri)) { - if (metadataSource.getRecord(id) != null) { - return metadataSource.getRecord(id); + if (metadataSource instanceof QuerySource) { + QuerySource querySource = (QuerySource)metadataSource; + if (querySource.getRecord(id) != null) { + return querySource.getRecord(id); + } } - } return null; } catch (Exception e) { @@ -252,10 +274,12 @@ public class ImportService implements Destroyable { public ImportRecord getRecord(String uri, Query query) throws MetadataSourceException { try { for (MetadataSource metadataSource : matchingImports(uri)) { - if (metadataSource.getRecord(query) != null) { - return metadataSource.getRecord(query); + if (metadataSource instanceof QuerySource) { + QuerySource querySource = (QuerySource)metadataSource; + if (querySource.getRecord(query) != null) { + return querySource.getRecord(query); + } } - } return null; } catch (Exception e) { @@ -272,6 +296,41 @@ public class ImportService implements Destroyable { return importSources.keySet(); } + /* + * Get a collection of record from File, + * The first match will be return. + * + * @param file The file from which will read records + * @param originalName The original file name or full path + * @return a single record contains the metadatum + * @throws FileMultipleOccurencesException if more than one entry is found + */ + public ImportRecord getRecord(File file, String originalName) + throws FileMultipleOccurencesException, FileSourceException { + ImportRecord importRecords = null; + for (MetadataSource metadataSource : importSources.values()) { + try (InputStream fileInputStream = new FileInputStream(file)) { + if (metadataSource instanceof FileSource) { + FileSource fileSource = (FileSource)metadataSource; + if (fileSource.isValidSourceForFile(originalName)) { + importRecords = fileSource.getRecord(fileInputStream); + break; + } + } + //catch statements is required because we could have supported format (i.e. XML) + //which fail on schema validation + } catch (FileSourceException e) { + log.debug(metadataSource.getImportSource() + " isn't a valid parser for file"); + } catch (FileMultipleOccurencesException e) { + log.debug("File contains multiple metadata, return with error"); + throw e; + } catch (IOException e1) { + throw new FileSourceException("File cannot be read, may be null"); + } + } + return importRecords; + } + /** * Call destroy on all {@link Destroyable} {@link MetadataSource} objects set in this ImportService */ diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractPlainMetadataSource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractPlainMetadataSource.java new file mode 100644 index 0000000000..019cf33177 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/AbstractPlainMetadataSource.java @@ -0,0 +1,103 @@ +/** + * 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.importer.external.service.components; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.dspace.importer.external.datamodel.ImportRecord; +import org.dspace.importer.external.exception.FileMultipleOccurencesException; +import org.dspace.importer.external.exception.FileSourceException; +import org.dspace.importer.external.metadatamapping.AbstractMetadataFieldMapping; +import org.dspace.importer.external.metadatamapping.MetadatumDTO; +import org.dspace.importer.external.service.components.dto.PlainMetadataSourceDto; + + +/** + * This class is an abstract implementation of {@link MetadataSource} useful in cases + * of plain metadata sources. + * It provides the methot to mapping metadata to DSpace Format when source is a file + * whit a list of strings. + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ + +public abstract class AbstractPlainMetadataSource + extends AbstractMetadataFieldMapping + implements FileSource { + + protected abstract List + readData(InputStream fileInpuStream) throws FileSourceException; + + + private List supportedExtensions; + + /** + * Set the file extensions supported by this metadata service + * + * @param supportedExtensionsthe file extensions (xml,txt,...) supported by this service + */ + public void setSupportedExtensions(List supportedExtensions) { + this.supportedExtensions = supportedExtensions; + } + + @Override + public List getSupportedExtensions() { + return supportedExtensions; + } + + /** + * Return a list of ImportRecord constructed from input file. This list is based on + * the results retrieved from the file (InputStream) parsed through abstract method readData + * + * @param InputStream The inputStream of the file + * @return A list of {@link ImportRecord} + * @throws FileSourceException if, for any reason, the file is not parsable + */ + @Override + public List getRecords(InputStream is) throws FileSourceException { + List datas = readData(is); + List records = new ArrayList<>(); + for (PlainMetadataSourceDto item : datas) { + records.add(toRecord(item)); + } + return records; + } + + /** + * Return an ImportRecord constructed from input file. This list is based on + * the result retrieved from the file (InputStream) parsed through abstract method + * "readData" implementation + * + * @param InputStream The inputStream of the file + * @return An {@link ImportRecord} matching the file content + * @throws FileSourceException if, for any reason, the file is not parsable + * @throws FileMultipleOccurencesException if the file contains more than one entry + */ + @Override + public ImportRecord getRecord(InputStream is) throws FileSourceException, FileMultipleOccurencesException { + List datas = readData(is); + if (datas == null || datas.isEmpty()) { + throw new FileSourceException("File is empty"); + } + if (datas.size() > 1) { + throw new FileMultipleOccurencesException("File " + + "contains more than one entry (" + datas.size() + " entries"); + } + return toRecord(datas.get(0)); + } + + + private ImportRecord toRecord(PlainMetadataSourceDto entry) { + List metadata = new ArrayList<>(); + metadata.addAll(resultToDCValueMapping(entry)); + return new ImportRecord(metadata); + } +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/FileSource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/FileSource.java new file mode 100644 index 0000000000..febe01ee53 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/FileSource.java @@ -0,0 +1,70 @@ +/** + * 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.importer.external.service.components; + +import java.io.InputStream; +import java.util.List; + +import org.dspace.importer.external.datamodel.ImportRecord; +import org.dspace.importer.external.exception.FileMultipleOccurencesException; +import org.dspace.importer.external.exception.FileSourceException; + +/** + * This interface declare the base methods to work with files containing metadata. + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ +public interface FileSource extends MetadataSource { + + /** + * Return a list of ImportRecord constructed from input file. + * + * @param InputStream The inputStream of the file + * @return A list of {@link ImportRecord} + * @throws FileSourceException if, for any reason, the file is not parsable + */ + public List getRecords(InputStream inputStream) + throws FileSourceException; + + /** + * Return an ImportRecord constructed from input file. + * + * @param InputStream The inputStream of the file + * @return An {@link ImportRecord} matching the file content + * @throws FileSourceException if, for any reason, the file is not parsable + * @throws FileMultipleOccurencesException if the file contains more than one entry + */ + public ImportRecord getRecord(InputStream inputStream) + throws FileSourceException, FileMultipleOccurencesException; + + /** + * This method is used to decide if the FileSource manage the file format + * + * @param originalName the file file original name + * @return true if the FileSource can parse the file, false otherwise + */ + public default boolean isValidSourceForFile(String originalName) { + List extensions = getSupportedExtensions(); + if (extensions == null || extensions.isEmpty()) { + return false; + } + if (originalName != null && originalName.contains(".")) { + String extension = originalName.substring(originalName.lastIndexOf('.') + 1, + originalName.length()); + return getSupportedExtensions().contains(extension); + } + return false; + } + + /** + * Get the file extensions (xml, csv, txt, ...) supported by the FileSource implementation + */ + public List getSupportedExtensions(); + +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/MetadataSource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/MetadataSource.java index 79bdcfa903..353f77b798 100644 --- a/dspace-api/src/main/java/org/dspace/importer/external/service/components/MetadataSource.java +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/MetadataSource.java @@ -8,76 +8,14 @@ package org.dspace.importer.external.service.components; -import java.util.Collection; - -import org.dspace.content.Item; -import org.dspace.importer.external.datamodel.ImportRecord; -import org.dspace.importer.external.datamodel.Query; -import org.dspace.importer.external.exception.MetadataSourceException; - /** - * Common interface for all import implementations. + * Super interface for all import implementations. * * @author Roeland Dillen (roeland at atmire dot com) + * @author Pasquale Cavallo (pasquale.cavallo@4science.it) */ public interface MetadataSource { - /** - * Gets the number of records matching a query - * - * @param query the query in string format - * @return the number of records matching the query - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public int getNbRecords(String query) throws MetadataSourceException; - /** - * Gets the number of records matching a query - * - * @param query the query object - * @return the number of records matching the query - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public int getNbRecords(Query query) throws MetadataSourceException; - - /** - * Gets a set of records matching a query. Supports pagination - * - * @param query the query. The query will generally be posted 'as is' to the source - * @param start offset - * @param count page size - * @return a collection of fully transformed id's - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public Collection getRecords(String query, int start, int count) throws MetadataSourceException; - - /** - * Find records based on a object query. - * - * @param query a query object to base the search on. - * @return a set of records. Fully transformed. - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public Collection getRecords(Query query) throws MetadataSourceException; - - /** - * Get a single record from the source. - * The first match will be returned - * - * @param id identifier for the record - * @return a matching record - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public ImportRecord getRecord(String id) throws MetadataSourceException; - - /** - * Get a single record from the source. - * The first match will be returned - * - * @param query a query matching a single record - * @return a matching record - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public ImportRecord getRecord(Query query) throws MetadataSourceException; /** * The string that identifies this import implementation. Preferable a URI @@ -86,23 +24,4 @@ public interface MetadataSource { */ public String getImportSource(); - /** - * Finds records based on an item - * Delegates to one or more MetadataSource implementations based on the uri. Results will be aggregated. - * - * @param item an item to base the search on - * @return a collection of import records. Only the identifier of the found records may be put in the record. - * @throws MetadataSourceException if the underlying methods throw any exception. - */ - public Collection findMatchingRecords(Item item) throws MetadataSourceException; - - /** - * Finds records based on query object. - * Delegates to one or more MetadataSource implementations based on the uri. Results will be aggregated. - * - * @param query a query object to base the search on. - * @return a collection of import records. Only the identifier of the found records may be put in the record. - * @throws MetadataSourceException passed through. - */ - public Collection findMatchingRecords(Query query) throws MetadataSourceException; } diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/QuerySource.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/QuerySource.java new file mode 100644 index 0000000000..bcd10cc554 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/QuerySource.java @@ -0,0 +1,106 @@ +/** + * 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.importer.external.service.components; + +import java.util.Collection; + +import org.dspace.content.Item; +import org.dspace.importer.external.datamodel.ImportRecord; +import org.dspace.importer.external.datamodel.Query; +import org.dspace.importer.external.exception.MetadataSourceException; + + +/** + * Common interface for database-based imports. + * + * @author Roeland Dillen (roeland at atmire dot com) + * @author Pasquale Cavallo (pasquale.cavallo@4science.it) + */ + +public interface QuerySource extends MetadataSource { + + /** + * Get a single record from the source. + * The first match will be returned + * + * @param id identifier for the record + * @return a matching record + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public ImportRecord getRecord(String id) throws MetadataSourceException; + + /** + * Gets the number of records matching a query + * + * @param query the query in string format + * @return the number of records matching the query + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public int getRecordsCount(String query) throws MetadataSourceException; + + /** + * Gets the number of records matching a query + * + * @param query the query object + * @return the number of records matching the query + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public int getRecordsCount(Query query) throws MetadataSourceException; + + /** + * Gets a set of records matching a query. Supports pagination + * + * @param query the query. The query will generally be posted 'as is' to the source + * @param start offset + * @param count page size + * @return a collection of fully transformed id's + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public Collection getRecords(String query, int start, int count) throws MetadataSourceException; + + /** + * Find records based on a object query. + * + * @param query a query object to base the search on. + * @return a set of records. Fully transformed. + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public Collection getRecords(Query query) throws MetadataSourceException; + + /** + * Get a single record from the source. + * The first match will be returned + * + * @param query a query matching a single record + * @return a matching record + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public ImportRecord getRecord(Query query) throws MetadataSourceException; + + /** + * Finds records based on query object. + * Delegates to one or more MetadataSource implementations based on the uri. Results will be aggregated. + * + * @param query a query object to base the search on. + * @return a collection of import records. Only the identifier of the found records may be put in the record. + * @throws MetadataSourceException passed through. + */ + public Collection findMatchingRecords(Query query) throws MetadataSourceException; + + /** + * Finds records based on an item + * Delegates to one or more MetadataSource implementations based on the uri. Results will be aggregated. + * + * @param item an item to base the search on + * @return a collection of import records. Only the identifier of the found records may be put in the record. + * @throws MetadataSourceException if the underlying methods throw any exception. + */ + public Collection findMatchingRecords(Item item) throws MetadataSourceException; + +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/dto/PlainMetadataKeyValueItem.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/dto/PlainMetadataKeyValueItem.java new file mode 100644 index 0000000000..fa362760b9 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/dto/PlainMetadataKeyValueItem.java @@ -0,0 +1,50 @@ +/** + * 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.importer.external.service.components.dto; + +/** + * Simple object to construct items + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ +public class PlainMetadataKeyValueItem { + + private String key; + private String value; + + /* + * In a key-value items, like PlainMetadata, this method get the item's key + */ + public String getKey() { + return key; + } + + /* + * In a key-value items, like PlainMetadata, this method set the item's key. + * Never set or leave this field to null + * + */ + public void setKey(String key) { + this.key = key; + } + + /* + * In key-value items, like PlainMetadata, this method get the item's value + */ + public String getValue() { + return value; + } + + /* + * In key-value items, like PlainMetadata, this method set the item's value + */ + public void setValue(String value) { + this.value = value; + } + +} diff --git a/dspace-api/src/main/java/org/dspace/importer/external/service/components/dto/PlainMetadataSourceDto.java b/dspace-api/src/main/java/org/dspace/importer/external/service/components/dto/PlainMetadataSourceDto.java new file mode 100644 index 0000000000..041823b027 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/importer/external/service/components/dto/PlainMetadataSourceDto.java @@ -0,0 +1,38 @@ +/** + * 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.importer.external.service.components.dto; + +import java.util.List; + + +/** + * Simple object used to construct a list of items. + * This type is used in file plain metadata import as RecordType. + * + * @author Pasquale Cavallo (pasquale.cavallo at 4science dot it) + */ + +public class PlainMetadataSourceDto { + + private List metadata; + + /* + * Method used to get the Metadata list + */ + public List getMetadata() { + return metadata; + } + + /* + * Method used to set the metadata list + */ + public void setMetadata(List metadata) { + this.metadata = metadata; + } + +} diff --git a/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml b/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml index bbdf085619..c65b004f7e 100644 --- a/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml +++ b/dspace-api/src/main/resources/spring/spring-dspace-addon-import-services.xml @@ -21,7 +21,12 @@ - + + + + + + diff --git a/dspace-api/src/test/data/dspaceFolder/assetstore/curate.txt b/dspace-api/src/test/data/dspaceFolder/assetstore/curate.txt new file mode 100644 index 0000000000..ff2cb89ef6 --- /dev/null +++ b/dspace-api/src/test/data/dspaceFolder/assetstore/curate.txt @@ -0,0 +1,2 @@ +checklinks +requiredmetadata diff --git a/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml b/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml index 30fb69a3c4..76cb57a40d 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml +++ b/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml @@ -19,6 +19,12 @@ + + + + + + diff --git a/dspace-api/src/test/data/dspaceFolder/config/spring/api/solr-services.xml b/dspace-api/src/test/data/dspaceFolder/config/spring/api/solr-services.xml index 5ad031b688..80d45bdd58 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/spring/api/solr-services.xml +++ b/dspace-api/src/test/data/dspaceFolder/config/spring/api/solr-services.xml @@ -19,19 +19,29 @@ - + - + - - + + - + - + - - + + 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 6ddfef9b83..d3d396ffb1 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml +++ b/dspace-api/src/test/data/dspaceFolder/config/submission-forms.xml @@ -237,7 +237,7 @@ it, please enter the types and the actual numbers or codes.

- isVolumeOfJournal + isJournalOfVolume periodical creativework.publisher:somepublishername diff --git a/dspace-api/src/test/data/solr/solr.xml b/dspace-api/src/test/data/solr/solr.xml new file mode 100644 index 0000000000..8f3644098a --- /dev/null +++ b/dspace-api/src/test/data/solr/solr.xml @@ -0,0 +1,3 @@ + + + diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java b/dspace-api/src/test/java/org/dspace/AbstractDSpaceIntegrationTest.java similarity index 97% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java rename to dspace-api/src/test/java/org/dspace/AbstractDSpaceIntegrationTest.java index e3bb0a0500..1abc4e017d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractDSpaceIntegrationTest.java +++ b/dspace-api/src/test/java/org/dspace/AbstractDSpaceIntegrationTest.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.test; +package org.dspace; import static org.junit.Assert.fail; @@ -17,7 +17,7 @@ import java.util.TimeZone; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.dspace.app.rest.builder.AbstractBuilder; +import org.dspace.builder.AbstractBuilder; import org.dspace.servicemanager.DSpaceKernelImpl; import org.dspace.servicemanager.DSpaceKernelInit; import org.junit.AfterClass; @@ -90,8 +90,9 @@ public class AbstractDSpaceIntegrationTest { } /** - * This method will be run after all tests finish as per @AfterClass. It + * This method will be run after all tests finish as per @AfterClass. It * will clean resources initialized by the @BeforeClass methods. + * @throws java.sql.SQLException */ @AfterClass public static void destroyTestEnvironment() throws SQLException { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java b/dspace-api/src/test/java/org/dspace/AbstractIntegrationTestWithDatabase.java similarity index 91% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java rename to dspace-api/src/test/java/org/dspace/AbstractIntegrationTestWithDatabase.java index 0b4cb7791b..23faa06de7 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractIntegrationTestWithDatabase.java +++ b/dspace-api/src/test/java/org/dspace/AbstractIntegrationTestWithDatabase.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.test; +package org.dspace; import static org.junit.Assert.fail; @@ -14,21 +14,20 @@ import java.sql.SQLException; 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.app.scripts.handler.impl.TestDSpaceRunnableHandler; -import org.dspace.authority.AuthoritySearchService; import org.dspace.authority.MockAuthoritySolrServiceImpl; import org.dspace.authorize.AuthorizeException; +import org.dspace.builder.AbstractBuilder; import org.dspace.content.Community; import org.dspace.core.Context; import org.dspace.core.I18nUtil; import org.dspace.discovery.MockSolrSearchCore; -import org.dspace.discovery.SolrSearchCore; 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.kernel.ServiceManager; import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.statistics.MockSolrLoggerServiceImpl; import org.dspace.storage.rdbms.DatabaseUtils; @@ -181,21 +180,20 @@ public class AbstractIntegrationTestWithDatabase extends AbstractDSpaceIntegrati parentCommunity = null; cleanupContext(); + ServiceManager serviceManager = DSpaceServicesFactory.getInstance().getServiceManager(); // Clear the search core. - MockSolrSearchCore searchService = DSpaceServicesFactory.getInstance() - .getServiceManager() - .getServiceByName(SolrSearchCore.class.getName(), MockSolrSearchCore.class); + MockSolrSearchCore searchService = serviceManager + .getServiceByName(null, MockSolrSearchCore.class); searchService.reset(); - MockSolrLoggerServiceImpl statisticsService = DSpaceServicesFactory.getInstance() - .getServiceManager() - .getServiceByName("solrLoggerService", MockSolrLoggerServiceImpl.class); + MockSolrLoggerServiceImpl statisticsService = serviceManager + .getServiceByName(null, MockSolrLoggerServiceImpl.class); statisticsService.reset(); - MockAuthoritySolrServiceImpl authorityService = DSpaceServicesFactory.getInstance() - .getServiceManager() - .getServiceByName(AuthoritySearchService.class.getName(), MockAuthoritySolrServiceImpl.class); + MockAuthoritySolrServiceImpl authorityService = serviceManager + .getServiceByName(null, MockAuthoritySolrServiceImpl.class); authorityService.reset(); + // Reload our ConfigurationService (to reset configs to defaults again) DSpaceServicesFactory.getInstance().getConfigurationService().reloadConfig(); @@ -209,6 +207,7 @@ public class AbstractIntegrationTestWithDatabase extends AbstractDSpaceIntegrati /** * Utility method to cleanup a created Context object (to save memory). * This can also be used by individual tests to cleanup context objects they create. + * @throws java.sql.SQLException passed through. */ protected void cleanupContext() throws SQLException { // If context still valid, flush all database changes and close it diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/ExitException.java b/dspace-api/src/test/java/org/dspace/ExitException.java similarity index 93% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/test/ExitException.java rename to dspace-api/src/test/java/org/dspace/ExitException.java index a377d42238..3e7ce2fdc2 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/ExitException.java +++ b/dspace-api/src/test/java/org/dspace/ExitException.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.test; +package org.dspace; public class ExitException extends SecurityException { private final int status; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/NoExitSecurityManager.java b/dspace-api/src/test/java/org/dspace/NoExitSecurityManager.java similarity index 95% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/test/NoExitSecurityManager.java rename to dspace-api/src/test/java/org/dspace/NoExitSecurityManager.java index 79d75dcaf1..7d98f688ef 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/NoExitSecurityManager.java +++ b/dspace-api/src/test/java/org/dspace/NoExitSecurityManager.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.test; +package org.dspace; import java.security.Permission; diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataExportIT.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataExportIT.java new file mode 100644 index 0000000000..a6a4780aa9 --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataExportIT.java @@ -0,0 +1,62 @@ +/** + * 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.bulkedit; + +import static junit.framework.TestCase.assertTrue; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.dspace.AbstractIntegrationTestWithDatabase; +import org.dspace.app.launcher.ScriptLauncher; +import org.dspace.app.scripts.handler.impl.TestDSpaceRunnableHandler; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.services.ConfigurationService; +import org.dspace.services.factory.DSpaceServicesFactory; +import org.junit.Test; + +public class MetadataExportIT + extends AbstractIntegrationTestWithDatabase { + private final ConfigurationService configurationService + = DSpaceServicesFactory.getInstance().getConfigurationService(); + + @Test + public void metadataExportToCsvTest() throws Exception { + context.turnOffAuthorisationSystem(); + Community community = CommunityBuilder.createCommunity(context) + .build(); + Collection collection = CollectionBuilder.createCollection(context, community) + .build(); + Item item = ItemBuilder.createItem(context, collection) + .withAuthor("Donald, Smith") + .build(); + context.restoreAuthSystemState(); + String fileLocation = configurationService.getProperty("dspace.dir") + + testProps.get("test.exportcsv").toString(); + + String[] args = new String[] {"metadata-export", + "-i", String.valueOf(item.getHandle()), + "-f", fileLocation}; + TestDSpaceRunnableHandler testDSpaceRunnableHandler + = new TestDSpaceRunnableHandler(); + + ScriptLauncher.handleScript(args, ScriptLauncher.getConfig(kernelImpl), + testDSpaceRunnableHandler, kernelImpl); + File file = new File(fileLocation); + String fileContent = IOUtils.toString(new FileInputStream(file), StandardCharsets.UTF_8); + assertTrue(fileContent.contains("Donald, Smith")); + assertTrue(fileContent.contains(String.valueOf(item.getID()))); + } +} diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataExportTest.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataExportTest.java deleted file mode 100644 index 9594e2a2b1..0000000000 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataExportTest.java +++ /dev/null @@ -1,71 +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.bulkedit; - -import static junit.framework.TestCase.assertTrue; - -import java.io.File; -import java.io.FileInputStream; -import java.nio.charset.StandardCharsets; - -import org.apache.commons.io.IOUtils; -import org.dspace.AbstractIntegrationTest; -import org.dspace.app.launcher.ScriptLauncher; -import org.dspace.app.scripts.handler.impl.TestDSpaceRunnableHandler; -import org.dspace.content.Collection; -import org.dspace.content.Community; -import org.dspace.content.Item; -import org.dspace.content.WorkspaceItem; -import org.dspace.content.factory.ContentServiceFactory; -import org.dspace.content.service.CollectionService; -import org.dspace.content.service.CommunityService; -import org.dspace.content.service.InstallItemService; -import org.dspace.content.service.ItemService; -import org.dspace.content.service.WorkspaceItemService; -import org.dspace.services.ConfigurationService; -import org.dspace.services.factory.DSpaceServicesFactory; -import org.junit.Test; - -public class MetadataExportTest extends AbstractIntegrationTest { - - private ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - private CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); - private CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); - private WorkspaceItemService workspaceItemService = ContentServiceFactory.getInstance().getWorkspaceItemService(); - private InstallItemService installItemService = ContentServiceFactory.getInstance().getInstallItemService(); - private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); - - @Test - public void metadataExportToCsvTest() throws Exception { - context.turnOffAuthorisationSystem(); - Community community = communityService.create(null, context); - Collection collection = collectionService.create(context, community); - WorkspaceItem wi = workspaceItemService.create(context, collection, true); - Item item = wi.getItem(); - itemService.addMetadata(context, item, "dc", "contributor", "author", null, "Donald, Smith"); - item = installItemService.installItem(context, wi); - context.restoreAuthSystemState(); - String fileLocation = configurationService.getProperty("dspace.dir") + testProps.get("test.exportcsv") - .toString(); - - String[] args = new String[] {"metadata-export", "-i", String.valueOf(item.getHandle()), "-f", fileLocation}; - TestDSpaceRunnableHandler testDSpaceRunnableHandler = new TestDSpaceRunnableHandler(); - - ScriptLauncher.handleScript(args, ScriptLauncher.getConfig(kernelImpl), testDSpaceRunnableHandler, kernelImpl); - File file = new File(fileLocation); - String fileContent = IOUtils.toString(new FileInputStream(file), StandardCharsets.UTF_8); - assertTrue(fileContent.contains("Donald, Smith")); - assertTrue(fileContent.contains(String.valueOf(item.getID()))); - - context.turnOffAuthorisationSystem(); - itemService.delete(context, itemService.find(context, item.getID())); - collectionService.delete(context, collectionService.find(context, collection.getID())); - communityService.delete(context, communityService.find(context, community.getID())); - context.restoreAuthSystemState(); - } -} diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportTest.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportTest.java index c0eb2789bc..a4f6b67b06 100644 --- a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportTest.java +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataImportTest.java @@ -22,16 +22,16 @@ import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; import org.dspace.content.service.CommunityService; import org.dspace.content.service.ItemService; -import org.dspace.services.ConfigurationService; -import org.dspace.services.factory.DSpaceServicesFactory; import org.junit.Test; public class MetadataImportTest extends AbstractIntegrationTest { - private ItemService itemService = ContentServiceFactory.getInstance().getItemService(); - private CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); - private CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); - private ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); + private final ItemService itemService + = ContentServiceFactory.getInstance().getItemService(); + private final CollectionService collectionService + = ContentServiceFactory.getInstance().getCollectionService(); + private final CommunityService communityService + = ContentServiceFactory.getInstance().getCommunityService(); @Test public void metadataImportTest() throws Exception { diff --git a/dspace-api/src/test/java/org/dspace/authority/MockAuthoritySolrServiceImpl.java b/dspace-api/src/test/java/org/dspace/authority/MockAuthoritySolrServiceImpl.java index e1e018ef33..6c0ad5ace8 100644 --- a/dspace-api/src/test/java/org/dspace/authority/MockAuthoritySolrServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/authority/MockAuthoritySolrServiceImpl.java @@ -21,4 +21,8 @@ public class MockAuthoritySolrServiceImpl extends AuthoritySolrServiceImpl imple //We don't use SOLR in the tests of this module solr = null; } + + public void reset() { + // This method intentionally left blank. + } } diff --git a/dspace-api/src/test/java/org/dspace/authorize/AuthorizeConfigIntegrationTest.java b/dspace-api/src/test/java/org/dspace/authorize/AuthorizeConfigIT.java similarity index 97% rename from dspace-api/src/test/java/org/dspace/authorize/AuthorizeConfigIntegrationTest.java rename to dspace-api/src/test/java/org/dspace/authorize/AuthorizeConfigIT.java index d338bc6e2c..3218c14d7e 100644 --- a/dspace-api/src/test/java/org/dspace/authorize/AuthorizeConfigIntegrationTest.java +++ b/dspace-api/src/test/java/org/dspace/authorize/AuthorizeConfigIT.java @@ -20,7 +20,7 @@ import org.junit.Test; * @author Andrea Bollini (andrea.bollini at 4science.it) * */ -public class AuthorizeConfigIntegrationTest extends AbstractIntegrationTest { +public class AuthorizeConfigIT extends AbstractIntegrationTest { @Test public void testReloadConfiguration() { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java b/dspace-api/src/test/java/org/dspace/builder/AbstractBuilder.java similarity index 96% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/AbstractBuilder.java index faa8c473af..76fd02916f 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/AbstractBuilder.java @@ -5,18 +5,18 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.sql.SQLException; import java.util.List; import org.apache.commons.collections4.CollectionUtils; import org.apache.logging.log4j.Logger; -import org.dspace.app.rest.builder.util.AbstractBuilderCleanupUtil; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.util.AbstractBuilderCleanupUtil; import org.dspace.content.Bitstream; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.BitstreamFormatService; @@ -55,8 +55,8 @@ import org.dspace.xmlworkflow.storedcomponents.service.XmlWorkflowItemService; /** * Abstract builder class that holds references to all available services * - * @param This param represents the Model object for the Builder - * @param This param represents the Service object for the builder + * @param This parameter represents the Model object for the Builder + * @param This parameter represents the Service object for the builder * @author Jonas Van Goolen - (jonas@atmire.com) */ public abstract class AbstractBuilder { @@ -96,7 +96,8 @@ public abstract class AbstractBuilder { * This static class will make sure that the objects built with the builders are disposed of in a foreign-key * constraint safe manner by predefining an order */ - private static AbstractBuilderCleanupUtil abstractBuilderCleanupUtil = new AbstractBuilderCleanupUtil(); + private static final AbstractBuilderCleanupUtil abstractBuilderCleanupUtil + = new AbstractBuilderCleanupUtil(); /** * log4j category */ diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractCRUDBuilder.java b/dspace-api/src/test/java/org/dspace/builder/AbstractCRUDBuilder.java similarity index 90% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractCRUDBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/AbstractCRUDBuilder.java index 884bcc9e3c..ff2bef51c2 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractCRUDBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/AbstractCRUDBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import org.dspace.core.Context; import org.dspace.core.ReloadableEntity; @@ -13,6 +13,8 @@ import org.dspace.service.DSpaceCRUDService; /** * @author Jonas Van Goolen - (jonas@atmire.com) + * + * @param A specific kind of ReloadableEntity. */ public abstract class AbstractCRUDBuilder extends AbstractBuilder { @@ -20,8 +22,10 @@ public abstract class AbstractCRUDBuilder extends Ab super(context); } + @Override protected abstract DSpaceCRUDService getService(); + @Override public abstract T build(); public void delete(T dso) throws Exception { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java b/dspace-api/src/test/java/org/dspace/builder/AbstractDSpaceObjectBuilder.java similarity index 97% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/AbstractDSpaceObjectBuilder.java index 02b7e221e8..df92d0ea4b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/AbstractDSpaceObjectBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/AbstractDSpaceObjectBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.sql.SQLException; import java.util.Date; @@ -43,12 +43,15 @@ public abstract class AbstractDSpaceObjectBuilder this.context = context; } + @Override public abstract void cleanup() throws Exception; + @Override protected abstract DSpaceObjectService getService(); + @Override protected B handleException(final Exception e) { log.error(e.getMessage(), e); return null; @@ -231,13 +234,15 @@ public abstract class AbstractDSpaceObjectBuilder return (B) this; } + @Override public abstract T build() throws SQLException, AuthorizeException; + @Override public void delete(Context c, T dso) throws Exception { - if (dso != null) { - getService().delete(c, dso); - } - c.complete(); - indexingService.commit(); + if (dso != null) { + getService().delete(c, dso); + } + c.complete(); + indexingService.commit(); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BitstreamBuilder.java b/dspace-api/src/test/java/org/dspace/builder/BitstreamBuilder.java similarity index 98% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BitstreamBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/BitstreamBuilder.java index 42a375a58e..b8942a17d0 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BitstreamBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/BitstreamBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.io.InputStream; @@ -129,6 +129,7 @@ public class BitstreamBuilder extends AbstractDSpaceObjectBuilder { return this; } + @Override public Bitstream build() { try { bitstreamService.update(context, bitstream); @@ -152,7 +153,7 @@ public class BitstreamBuilder extends AbstractDSpaceObjectBuilder { @Override public void cleanup() throws Exception { - try (Context c = new Context()) { + try (Context c = new Context()) { c.turnOffAuthorisationSystem(); // Ensure object and any related objects are reloaded before checking to see what needs cleanup bitstream = c.reloadEntity(bitstream); @@ -163,6 +164,7 @@ public class BitstreamBuilder extends AbstractDSpaceObjectBuilder { } } + @Override protected DSpaceObjectService getService() { return bitstreamService; } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java b/dspace-api/src/test/java/org/dspace/builder/BitstreamFormatBuilder.java similarity index 98% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/BitstreamFormatBuilder.java index 3cd7084577..1051712326 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BitstreamFormatBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/BitstreamFormatBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.sql.SQLException; @@ -71,7 +71,6 @@ public class BitstreamFormatBuilder extends AbstractCRUDBuilder log.error(e); } catch (AuthorizeException e) { log.error(e); - ; } return bitstreamFormat; } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BundleBuilder.java b/dspace-api/src/test/java/org/dspace/builder/BundleBuilder.java similarity index 95% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BundleBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/BundleBuilder.java index 76d4a90104..614cd54c6d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/BundleBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/BundleBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.sql.SQLException; @@ -25,7 +25,7 @@ public class BundleBuilder extends AbstractDSpaceObjectBuilder { private Bundle bundle; private Item item; private String name; - private List bitstreams = new ArrayList<>(); + private final List bitstreams = new ArrayList<>(); protected BundleBuilder(Context context) { super(context); @@ -52,6 +52,7 @@ public class BundleBuilder extends AbstractDSpaceObjectBuilder { return this; } + @Override public void cleanup() throws Exception { try (Context c = new Context()) { c.turnOffAuthorisationSystem(); @@ -64,10 +65,12 @@ public class BundleBuilder extends AbstractDSpaceObjectBuilder { } } + @Override protected DSpaceObjectService getService() { return bundleService; } + @Override public Bundle build() throws SQLException, AuthorizeException { bundle = bundleService.create(context, item, name); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/ClaimedTaskBuilder.java b/dspace-api/src/test/java/org/dspace/builder/ClaimedTaskBuilder.java similarity index 99% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/ClaimedTaskBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/ClaimedTaskBuilder.java index 72acd3f27d..338739285f 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/ClaimedTaskBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/ClaimedTaskBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.InputStream; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java b/dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java similarity index 99% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java index d472316c74..da46281290 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CollectionBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/CollectionBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.io.InputStream; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java b/dspace-api/src/test/java/org/dspace/builder/CommunityBuilder.java similarity index 99% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/CommunityBuilder.java index f7b13e117f..5500697da4 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/CommunityBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/CommunityBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.io.InputStream; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java b/dspace-api/src/test/java/org/dspace/builder/EPersonBuilder.java similarity index 87% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/EPersonBuilder.java index 26fc2b51c4..256b3432d4 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/EPersonBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/EPersonBuilder.java @@ -5,12 +5,14 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.sql.SQLException; import java.util.UUID; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.content.service.DSpaceObjectService; import org.dspace.core.Context; @@ -19,6 +21,7 @@ import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; public class EPersonBuilder extends AbstractDSpaceObjectBuilder { + private static final Logger LOG = LogManager.getLogger(EPersonBuilder.class); private EPerson ePerson; @@ -28,7 +31,7 @@ public class EPersonBuilder extends AbstractDSpaceObjectBuilder { @Override public void cleanup() throws Exception { - try (Context c = new Context()) { + try (Context c = new Context()) { c.turnOffAuthorisationSystem(); // Ensure object and any related objects are reloaded before checking to see what needs cleanup ePerson = c.reloadEntity(ePerson); @@ -36,23 +39,21 @@ public class EPersonBuilder extends AbstractDSpaceObjectBuilder { delete(c, ePerson); c.complete(); } - } + } } + @Override protected DSpaceObjectService getService() { return ePersonService; } + @Override public EPerson build() { try { ePersonService.update(context, ePerson); indexingService.commit(); - } catch (SearchServiceException e) { - e.printStackTrace(); - } catch (SQLException e) { - e.printStackTrace(); - } catch (AuthorizeException e) { - e.printStackTrace(); + } catch (SearchServiceException | SQLException | AuthorizeException e) { + LOG.warn("Failed to complete the EPerson", e); } return ePerson; } @@ -65,10 +66,8 @@ public class EPersonBuilder extends AbstractDSpaceObjectBuilder { private EPersonBuilder create() { try { ePerson = ePersonService.create(context); - } catch (SQLException e) { - e.printStackTrace(); - } catch (AuthorizeException e) { - e.printStackTrace(); + } catch (SQLException | AuthorizeException e) { + LOG.warn("Failed to create the EPerson", e); } return this; } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/EntityTypeBuilder.java b/dspace-api/src/test/java/org/dspace/builder/EntityTypeBuilder.java similarity index 96% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/EntityTypeBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/EntityTypeBuilder.java index 8a2efaffa6..ae0e807198 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/EntityTypeBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/EntityTypeBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.sql.SQLException; @@ -53,6 +53,7 @@ public class EntityTypeBuilder extends AbstractBuilder { @Override public void cleanup() throws Exception { - try (Context c = new Context()) { + try (Context c = new Context()) { c.turnOffAuthorisationSystem(); // Ensure object and any related objects are reloaded before checking to see what needs cleanup group = c.reloadEntity(group); @@ -42,7 +42,7 @@ public class GroupBuilder extends AbstractDSpaceObjectBuilder { delete(c, group); c.complete(); } - } + } } public static GroupBuilder createGroup(final Context context) { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java b/dspace-api/src/test/java/org/dspace/builder/ItemBuilder.java similarity index 99% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/ItemBuilder.java index ddc2a1963c..e4f3a0e29d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/ItemBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/ItemBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.sql.SQLException; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java b/dspace-api/src/test/java/org/dspace/builder/MetadataFieldBuilder.java similarity index 90% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/MetadataFieldBuilder.java index 76d411cf14..dfc9112a3f 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/MetadataFieldBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/MetadataFieldBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.sql.SQLException; @@ -64,17 +64,9 @@ public class MetadataFieldBuilder extends AbstractBuilder { } } + @Override public Process build() { try { processService.update(context, process); @@ -68,6 +69,7 @@ public class ProcessBuilder extends AbstractBuilder { return process; } + @Override protected ProcessService getService() { return processService; } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/RelationshipBuilder.java b/dspace-api/src/test/java/org/dspace/builder/RelationshipBuilder.java similarity index 97% rename from dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/RelationshipBuilder.java rename to dspace-api/src/test/java/org/dspace/builder/RelationshipBuilder.java index c054521569..773a4a8b8b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/builder/RelationshipBuilder.java +++ b/dspace-api/src/test/java/org/dspace/builder/RelationshipBuilder.java @@ -5,7 +5,7 @@ * * http://www.dspace.org/license/ */ -package org.dspace.app.rest.builder; +package org.dspace.builder; import java.io.IOException; import java.sql.SQLException; @@ -56,6 +56,7 @@ public class RelationshipBuilder extends AbstractBuilder> map = new LinkedHashMap<>(); + private final LinkedHashMap> map + = new LinkedHashMap<>(); /** * Constructor that will initialize the Map with a predefined order for deletion diff --git a/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java index 8ca6b6c172..4890fef26f 100644 --- a/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java +++ b/dspace-api/src/test/java/org/dspace/curate/CuratorTest.java @@ -8,23 +8,27 @@ package org.dspace.curate; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.util.HashMap; import java.util.Map; import org.dspace.AbstractUnitTest; import org.dspace.content.DSpaceObject; +import org.dspace.content.Item; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; +import org.dspace.core.factory.CoreServiceFactory; +import org.dspace.ctask.general.NoOpCurationTask; import org.dspace.services.ConfigurationService; import org.junit.Test; /** - * * @author mhwood */ -public class CuratorTest - extends AbstractUnitTest { +public class CuratorTest extends AbstractUnitTest { + private static final SiteService SITE_SERVICE = ContentServiceFactory.getInstance().getSiteService(); static final String RUN_PARAMETER_NAME = "runParameter"; @@ -32,20 +36,24 @@ public class CuratorTest static final String TASK_PROPERTY_NAME = "taskProperty"; static final String TASK_PROPERTY_VALUE = "a property"; - /** Value of a known runtime parameter, if any. */ + /** + * Value of a known runtime parameter, if any. + */ static String runParameter; - /** Value of a known task property, if any. */ + /** + * 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 { + public void testCurate_DSpaceObject() throws Exception { System.out.println("curate"); final String TASK_NAME = "dummyTask"; @@ -53,7 +61,7 @@ public class CuratorTest // Configure the task to be run. ConfigurationService cfg = kernelImpl.getConfigurationService(); cfg.setProperty("plugin.named.org.dspace.curate.CurationTask", - DummyTask.class.getName() + " = " + TASK_NAME); + DummyTask.class.getName() + " = " + TASK_NAME); cfg.setProperty(TASK_NAME + '.' + TASK_PROPERTY_NAME, TASK_PROPERTY_VALUE); // Get and configure a Curator. @@ -72,12 +80,40 @@ public class CuratorTest // Check the result. System.out.format("Task %s result was '%s'%n", - TASK_NAME, instance.getResult(TASK_NAME)); + TASK_NAME, instance.getResult(TASK_NAME)); System.out.format("Task %s status was %d%n", - TASK_NAME, instance.getStatus(TASK_NAME)); + TASK_NAME, instance.getStatus(TASK_NAME)); assertEquals("Unexpected task status", - Curator.CURATE_SUCCESS, instance.getStatus(TASK_NAME)); + Curator.CURATE_SUCCESS, instance.getStatus(TASK_NAME)); assertEquals("Wrong run parameter", RUN_PARAMETER_VALUE, runParameter); assertEquals("Wrong task property", TASK_PROPERTY_VALUE, taskProperty); } + + @Test + public void testCurate_NoOpTask() throws Exception { + + CoreServiceFactory.getInstance().getPluginService().clearNamedPluginClasses(); + + final String TASK_NAME = "noop"; + + // Configure the noop task to be run. + ConfigurationService cfg = kernelImpl.getConfigurationService(); + cfg.setProperty("plugin.named.org.dspace.curate.CurationTask", + NoOpCurationTask.class.getName() + " = " + TASK_NAME); + + // Get and configure a Curator. + Curator curator = new Curator(); + + StringBuilder reporterOutput = new StringBuilder(); + curator.setReporter(reporterOutput); // Send any report to our StringBuilder. + + curator.addTask(TASK_NAME); + Item item = mock(Item.class); + when(item.getType()).thenReturn(2); + when(item.getHandle()).thenReturn("testHandle"); + curator.curate(context, item); + + assertEquals(Curator.CURATE_SUCCESS, curator.getStatus(TASK_NAME)); + assertEquals(reporterOutput.toString(), "No operation performed on testHandle"); + } } diff --git a/dspace-api/src/test/java/org/dspace/discovery/MockSolrSearchCore.java b/dspace-api/src/test/java/org/dspace/discovery/MockSolrSearchCore.java index 1934ba9f0f..b81e18a473 100644 --- a/dspace-api/src/test/java/org/dspace/discovery/MockSolrSearchCore.java +++ b/dspace-api/src/test/java/org/dspace/discovery/MockSolrSearchCore.java @@ -7,19 +7,35 @@ */ package org.dspace.discovery; +import org.dspace.solr.MockSolrServer; +import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; /** - * Mock SOLR service for the Search Core + * Mock SOLR service for the Search Core. Manages an in-process Solr server + * with an in-memory "search" core. */ @Service -public class MockSolrSearchCore extends SolrSearchCore implements InitializingBean { +public class MockSolrSearchCore extends SolrSearchCore + implements InitializingBean, DisposableBean { + private MockSolrServer mockSolrServer; @Override public void afterPropertiesSet() throws Exception { - //We don't use SOLR in the tests of this module - solr = null; + mockSolrServer = new MockSolrServer("search"); + solr = mockSolrServer.getSolrServer(); } + /** + * Reset the core for the next test. See {@link MockSolrServer#reset()}. + */ + public void reset() { + mockSolrServer.reset(); + } + + @Override + public void destroy() throws Exception { + mockSolrServer.destroy(); + } } diff --git a/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java b/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java index bb443ab4a4..bc687a43f5 100644 --- a/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/license/MockCCLicenseConnectorServiceImpl.java @@ -29,6 +29,7 @@ public class MockCCLicenseConnectorServiceImpl extends CCLicenseConnectorService * @param language - the language * @return a map of mocked licenses with the id and the license */ + @Override public Map retrieveLicenses(String language) { Map ccLicenses = new HashMap<>(); CCLicense mockLicense1 = createMockLicense(1, new int[]{3, 2, 3}); @@ -89,6 +90,7 @@ public class MockCCLicenseConnectorServiceImpl extends CCLicenseConnectorService * @param answerMap - the answers to the different field questions * @return the CC License URI */ + @Override public String retrieveRightsByQuestion(final String licenseId, final String language, final Map answerMap) { @@ -105,6 +107,7 @@ public class MockCCLicenseConnectorServiceImpl extends CCLicenseConnectorService * @return a mock license RDF document or null when the URI contains invalid * @throws IOException */ + @Override public Document retrieveLicenseRDFDoc(String licenseURI) throws IOException { if (!StringUtils.contains(licenseURI, "invalid")) { InputStream cclicense = null; diff --git a/dspace-server-webapp/src/test/java/org/dspace/solr/MockSolrServer.java b/dspace-api/src/test/java/org/dspace/solr/MockSolrServer.java similarity index 97% rename from dspace-server-webapp/src/test/java/org/dspace/solr/MockSolrServer.java rename to dspace-api/src/test/java/org/dspace/solr/MockSolrServer.java index 237f35e63f..6faf9a7d1b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/solr/MockSolrServer.java +++ b/dspace-api/src/test/java/org/dspace/solr/MockSolrServer.java @@ -19,7 +19,7 @@ import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer; import org.apache.solr.core.CoreContainer; -import org.dspace.app.rest.test.AbstractDSpaceIntegrationTest; +import org.dspace.AbstractDSpaceIntegrationTest; /** * Factory of connections to an in-process embedded Solr service. @@ -110,7 +110,7 @@ public class MockSolrServer { server.deleteByQuery("*:*"); server.commit(); } catch (SolrServerException | IOException e) { - e.printStackTrace(System.err); + log.error("Failed to empty Solr index: {}", e.getMessage(), e); } loadedCores.put(coreName, server); 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 cca05a12cc..9d9c95daec 100644 --- a/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java +++ b/dspace-api/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java @@ -27,27 +27,29 @@ import com.maxmind.geoip2.record.MaxMind; import com.maxmind.geoip2.record.Postal; import com.maxmind.geoip2.record.RepresentedCountry; import com.maxmind.geoip2.record.Traits; +import org.dspace.solr.MockSolrServer; +import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; /** * Mock service that uses an embedded SOLR server for the statistics core. - *

- * NOTE: this class is overridden by one of the same name - * defined in dspace-server-webapp and declared as a bean there. - * See {@code test/data/dspaceFolder/config/spring/api/solr-services.xml}. Some kind of classpath - * magic makes this work. */ +@Service public class MockSolrLoggerServiceImpl extends SolrLoggerServiceImpl - implements InitializingBean { + implements InitializingBean, DisposableBean { + + private MockSolrServer mockSolrServer; public MockSolrLoggerServiceImpl() { } @Override public void afterPropertiesSet() throws Exception { - //We don't use SOLR in the tests of this module - solr = null; + // Initialize our service with a Mock Solr statistics core + mockSolrServer = new MockSolrServer("statistics"); + solr = mockSolrServer.getSolrServer(); // Mock GeoIP's DatabaseReader DatabaseReader reader = mock(DatabaseReader.class); @@ -58,14 +60,16 @@ public class MockSolrLoggerServiceImpl } /** - * A mock/fake GeoIP CityResponse, which will be used for *all* test statistical requests + * A mock/fake GeoIP CityResponse, which will be used for *all* test + * statistical requests. + * * @return faked CityResponse */ private CityResponse mockCityResponse() { - List cityNames = new ArrayList(Collections.singleton("New York")); + List cityNames = new ArrayList<>(Collections.singleton("New York")); City city = new City(cityNames, 1, 1, new HashMap()); - List countryNames = new ArrayList(Collections.singleton("United States")); + List countryNames = new ArrayList<>(Collections.singleton("United States")); Country country = new Country(countryNames, 1, 1, "US", new HashMap()); Location location = new Location(1, 1, 40.760498D, -73.9933D, 501, 1, "EST"); @@ -73,7 +77,17 @@ public class MockSolrLoggerServiceImpl Postal postal = new Postal("10036", 1); return new CityResponse(city, new Continent(), country, location, new MaxMind(), postal, - country, new RepresentedCountry(), new ArrayList<>(0), - new Traits()); + country, new RepresentedCountry(), new ArrayList<>(0), + new Traits()); + } + + /** Reset the core for the next test. See {@link MockSolrServer#reset()}. */ + public void reset() { + mockSolrServer.reset(); + } + + @Override + public void destroy() throws Exception { + mockSolrServer.destroy(); } } diff --git a/dspace-api/src/test/java/org/dspace/xmlworkflow/XmlWorkflowFactoryTest.java b/dspace-api/src/test/java/org/dspace/xmlworkflow/XmlWorkflowFactoryTest.java index a19e6a2622..c7239f1f5a 100644 --- a/dspace-api/src/test/java/org/dspace/xmlworkflow/XmlWorkflowFactoryTest.java +++ b/dspace-api/src/test/java/org/dspace/xmlworkflow/XmlWorkflowFactoryTest.java @@ -10,8 +10,10 @@ package org.dspace.xmlworkflow; import static junit.framework.TestCase.assertEquals; import static org.junit.Assert.fail; +import java.io.IOException; import java.sql.SQLException; +import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.AbstractUnitTest; import org.dspace.authorize.AuthorizeException; @@ -35,9 +37,11 @@ import org.junit.Test; */ public class XmlWorkflowFactoryTest extends AbstractUnitTest { - private CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); - private CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); - private XmlWorkflowFactory xmlWorkflowFactory + private final CollectionService collectionService + = ContentServiceFactory.getInstance().getCollectionService(); + private final CommunityService communityService + = ContentServiceFactory.getInstance().getCommunityService(); + private final XmlWorkflowFactory xmlWorkflowFactory = new DSpace().getServiceManager().getServiceByName("xmlWorkflowFactory", XmlWorkflowFactoryImpl.class); private Community owningCommunity; @@ -47,7 +51,7 @@ public class XmlWorkflowFactoryTest extends AbstractUnitTest { /** * log4j category */ - private static final Logger log = org.apache.logging.log4j.LogManager.getLogger(XmlWorkflowFactoryTest.class); + private static final Logger log = LogManager.getLogger(XmlWorkflowFactoryTest.class); /** * This method will be run before every test as per @Before. It will @@ -94,7 +98,7 @@ public class XmlWorkflowFactoryTest extends AbstractUnitTest { this.collectionService.delete(context, this.nonMappedCollection); this.collectionService.delete(context, this.mappedCollection); this.communityService.delete(context, this.owningCommunity); - } catch (Exception e) { + } catch (IOException | SQLException | AuthorizeException e) { log.error("Error in destroy", e); } @@ -112,12 +116,12 @@ public class XmlWorkflowFactoryTest extends AbstractUnitTest { @Test public void workflowMapping_NonMappedCollection() throws WorkflowConfigurationException { Workflow workflow = xmlWorkflowFactory.getWorkflow(this.nonMappedCollection); - assertEquals(workflow.getID(), "defaultWorkflow"); + assertEquals("defaultWorkflow", workflow.getID()); } @Test public void workflowMapping_MappedCollection() throws WorkflowConfigurationException { Workflow workflow = xmlWorkflowFactory.getWorkflow(this.mappedCollection); - assertEquals(workflow.getID(), "selectSingleReviewer"); + assertEquals("selectSingleReviewer", workflow.getID()); } } diff --git a/dspace-server-webapp/pom.xml b/dspace-server-webapp/pom.xml index ccb78dde49..96ed8bd2d3 100644 --- a/dspace-server-webapp/pom.xml +++ b/dspace-server-webapp/pom.xml @@ -37,7 +37,7 @@ false - maven.test.skip + skipTests false @@ -307,6 +307,13 @@ dspace-api + + org.dspace + dspace-api + test-jar + test + + org.dspace dspace-services @@ -532,13 +539,11 @@ org.apache.lucene lucene-analyzers-smartcn - ${solr.client.version} test org.apache.lucene lucene-analyzers-stempel - ${solr.client.version} test diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java index df1598b96a..d167d2a84d 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/DiscoveryRestController.java @@ -7,6 +7,8 @@ */ package org.dspace.app.rest; +import static org.apache.commons.collections4.ListUtils.emptyIfNull; + import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -100,51 +102,55 @@ public class DiscoveryRestController implements InitializingBean { @RequestMapping(method = RequestMethod.GET, value = "/search/facets") public FacetsResource getFacets(@RequestParam(name = "query", required = false) String query, - @RequestParam(name = "dsoType", required = false) String dsoType, + @RequestParam(name = "dsoType", required = false) List dsoTypes, @RequestParam(name = "scope", required = false) String dsoScope, @RequestParam(name = "configuration", required = false) String configuration, List searchFilters, Pageable page) throws Exception { + dsoTypes = emptyIfNull(dsoTypes); + if (log.isTraceEnabled()) { log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope) - + ", configuration name: " + StringUtils.trimToEmpty(configuration) - + ", dsoType: " + StringUtils.trimToEmpty(dsoType) - + ", query: " + StringUtils.trimToEmpty(query) - + ", filters: " + Objects.toString(searchFilters)); + + ", configuration name: " + StringUtils.trimToEmpty(configuration) + + ", dsoTypes: " + String.join(", ", dsoTypes) + + ", query: " + StringUtils.trimToEmpty(query) + + ", filters: " + Objects.toString(searchFilters)); } SearchResultsRest searchResultsRest = discoveryRestRepository - .getAllFacets(query, dsoType, dsoScope, configuration, searchFilters); + .getAllFacets(query, dsoTypes, dsoScope, configuration, searchFilters); FacetsResource facetsResource = new FacetsResource(searchResultsRest, page); halLinkService.addLinks(facetsResource, page); return facetsResource; - - } @RequestMapping(method = RequestMethod.GET, value = "/search/objects") public SearchResultsResource getSearchObjects(@RequestParam(name = "query", required = false) String query, - @RequestParam(name = "dsoType", required = false) String dsoType, + @RequestParam(name = "dsoType", required = false) + List dsoTypes, @RequestParam(name = "scope", required = false) String dsoScope, @RequestParam(name = "configuration", required = false) String configuration, List searchFilters, Pageable page) throws Exception { + + dsoTypes = emptyIfNull(dsoTypes); + if (log.isTraceEnabled()) { log.trace("Searching with scope: " + StringUtils.trimToEmpty(dsoScope) - + ", configuration name: " + StringUtils.trimToEmpty(configuration) - + ", dsoType: " + StringUtils.trimToEmpty(dsoType) - + ", query: " + StringUtils.trimToEmpty(query) - + ", filters: " + Objects.toString(searchFilters) - + ", page: " + Objects.toString(page)); + + ", configuration name: " + StringUtils.trimToEmpty(configuration) + + ", dsoTypes: " + String.join(", ", dsoTypes) + + ", query: " + StringUtils.trimToEmpty(query) + + ", filters: " + Objects.toString(searchFilters) + + ", page: " + Objects.toString(page)); } //Get the Search results in JSON format SearchResultsRest searchResultsRest = discoveryRestRepository - .getSearchObjects(query, dsoType, dsoScope, configuration, searchFilters, page, utils.obtainProjection()); + .getSearchObjects(query, dsoTypes, dsoScope, configuration, searchFilters, page, utils.obtainProjection()); //Convert the Search JSON results to paginated HAL resources SearchResultsResource searchResultsResource = new SearchResultsResource(searchResultsRest, utils, page); @@ -174,15 +180,18 @@ public class DiscoveryRestController implements InitializingBean { public RepresentationModel getFacetValues(@PathVariable("name") String facetName, @RequestParam(name = "prefix", required = false) String prefix, @RequestParam(name = "query", required = false) String query, - @RequestParam(name = "dsoType", required = false) String dsoType, + @RequestParam(name = "dsoType", required = false) List dsoTypes, @RequestParam(name = "scope", required = false) String dsoScope, @RequestParam(name = "configuration", required = false) String configuration, List searchFilters, Pageable page) throws Exception { + + dsoTypes = emptyIfNull(dsoTypes); + if (log.isTraceEnabled()) { log.trace("Facetting on facet " + facetName + " with scope: " + StringUtils.trimToEmpty(dsoScope) - + ", dsoType: " + StringUtils.trimToEmpty(dsoType) + + ", dsoTypes: " + String.join(", ", dsoTypes) + ", prefix: " + StringUtils.trimToEmpty(prefix) + ", query: " + StringUtils.trimToEmpty(query) + ", filters: " + Objects.toString(searchFilters) @@ -190,7 +199,7 @@ public class DiscoveryRestController implements InitializingBean { } FacetResultsRest facetResultsRest = discoveryRestRepository - .getFacetObjects(facetName, prefix, query, dsoType, dsoScope, configuration, searchFilters, page); + .getFacetObjects(facetName, prefix, query, dsoTypes, dsoScope, configuration, searchFilters, page); FacetResultsResource facetResultsResource = converter.toResource(facetResultsRest); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java index b501ba4406..65eb303abd 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/RestResourceController.java @@ -624,7 +624,7 @@ public class RestResourceController implements InitializingBean { HttpServletRequest request, @PathVariable String apiCategory, @PathVariable String model, - @RequestParam("file") MultipartFile uploadfile) + @RequestParam("file") List uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { checkModelPluralForm(apiCategory, model); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ShibbolethRestController.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ShibbolethRestController.java index 7355bab2a8..06ad196e45 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/ShibbolethRestController.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/ShibbolethRestController.java @@ -11,7 +11,9 @@ import java.io.IOException; import java.util.Arrays; import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; import org.dspace.app.rest.model.AuthnRest; +import org.dspace.core.Utils; import org.dspace.services.ConfigurationService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,14 +49,29 @@ public class ShibbolethRestController implements InitializingBean { .register(this, Arrays.asList(new Link("/api/" + AuthnRest.CATEGORY, "shibboleth"))); } + // LGTM.com thinks this method has an unvalidated URL redirect (https://lgtm.com/rules/4840088/) in `redirectUrl`, + // even though we are clearly validating the hostname of `redirectUrl` and test it in ShibbolethRestControllerIT + @SuppressWarnings("lgtm[java/unvalidated-url-redirection]") @RequestMapping(method = RequestMethod.GET) public void shibboleth(HttpServletResponse response, @RequestParam(name = "redirectUrl", required = false) String redirectUrl) throws IOException { if (redirectUrl == null) { redirectUrl = configurationService.getProperty("dspace.ui.url"); } - log.info("Redirecting to " + redirectUrl); - response.sendRedirect(redirectUrl); + + // Validate that the redirectURL matches either the server or UI hostname. It *cannot* be an arbitrary URL. + String redirectHostName = Utils.getHostName(redirectUrl); + String serverHostName = Utils.getHostName(configurationService.getProperty("dspace.server.url")); + String clientHostName = Utils.getHostName(configurationService.getProperty("dspace.ui.url")); + if (StringUtils.equalsAnyIgnoreCase(redirectHostName, serverHostName, clientHostName)) { + log.debug("Shibboleth redirecting to " + redirectUrl); + response.sendRedirect(redirectUrl); + } else { + log.error("Invalid Shibboleth redirectURL=" + redirectUrl + + ". URL doesn't match hostname of server or UI!"); + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + "Invalid redirectURL! Must match server or ui hostname."); + } } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java index 1532502b86..5feb375801 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetResultsConverter.java @@ -35,13 +35,14 @@ public class DiscoverFacetResultsConverter { @Autowired private SearchFilterToAppliedFilterConverter searchFilterToAppliedFilterConverter; - public FacetResultsRest convert(Context context, String facetName, String prefix, String query, String dsoType, - String dsoScope, List searchFilters, DiscoverResult searchResult, - DiscoveryConfiguration configuration, Pageable page, Projection projection) { + public FacetResultsRest convert(Context context, String facetName, String prefix, String query, + List dsoTypes, String dsoScope, List searchFilters, + DiscoverResult searchResult, DiscoveryConfiguration configuration, Pageable page, + Projection projection) { FacetResultsRest facetResultsRest = new FacetResultsRest(); facetResultsRest.setProjection(projection); - setRequestInformation(context, facetName, prefix, query, dsoType, dsoScope, searchFilters, searchResult, + setRequestInformation(context, facetName, prefix, query, dsoTypes, dsoScope, searchFilters, searchResult, configuration, facetResultsRest, page, projection); addToFacetResultList(facetName, searchResult, facetResultsRest, configuration, page, projection); @@ -72,14 +73,14 @@ public class DiscoverFacetResultsConverter { return facetValueConverter.convert(value, projection); } - private void setRequestInformation(Context context, String facetName, String prefix, String query, String dsoType, - String dsoScope, List searchFilters, DiscoverResult searchResult, - DiscoveryConfiguration configuration, FacetResultsRest facetResultsRest, - Pageable page, Projection projection) { + private void setRequestInformation(Context context, String facetName, String prefix, String query, + List dsoTypes, String dsoScope, List searchFilters, + DiscoverResult searchResult, DiscoveryConfiguration configuration, + FacetResultsRest facetResultsRest, Pageable page, Projection projection) { facetResultsRest.setQuery(query); facetResultsRest.setPrefix(prefix); facetResultsRest.setScope(dsoScope); - facetResultsRest.setDsoType(dsoType); + facetResultsRest.setDsoTypes(dsoTypes); facetResultsRest.setFacetEntry(convertFacetEntry(facetName, searchResult, configuration, page, projection)); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java index ad52f9b002..a519e8b5b8 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverFacetsConverter.java @@ -38,7 +38,7 @@ public class DiscoverFacetsConverter { @Autowired private SearchService searchService; - public SearchResultsRest convert(Context context, String query, String dsoType, String configurationName, + public SearchResultsRest convert(Context context, String query, List dsoTypes, String configurationName, String dsoScope, List searchFilters, final Pageable page, DiscoveryConfiguration configuration, DiscoverResult searchResult, Projection projection) { @@ -46,7 +46,7 @@ public class DiscoverFacetsConverter { SearchResultsRest searchResultsRest = new SearchResultsRest(); searchResultsRest.setProjection(projection); - setRequestInformation(context, query, dsoType, configurationName, dsoScope, searchFilters, page, + setRequestInformation(context, query, dsoTypes, configurationName, dsoScope, searchFilters, page, searchResultsRest); addFacetValues(context, searchResult, searchResultsRest, configuration, projection); @@ -129,13 +129,13 @@ public class DiscoverFacetsConverter { } } - private void setRequestInformation(final Context context, final String query, final String dsoType, + private void setRequestInformation(final Context context, final String query, final List dsoTypes, final String configurationName, final String scope, final List searchFilters, final Pageable page, final SearchResultsRest resultsRest) { resultsRest.setQuery(query); resultsRest.setConfiguration(configurationName); - resultsRest.setDsoType(dsoType); + resultsRest.setDsoTypes(dsoTypes); resultsRest.setSort(SearchResultsRest.Sorting.fromPage(page)); resultsRest.setScope(scope); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java index 772961a50f..6b289ec962 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/converter/DiscoverResultConverter.java @@ -43,7 +43,7 @@ public class DiscoverResultConverter { @Autowired private SearchFilterToAppliedFilterConverter searchFilterToAppliedFilterConverter; - public SearchResultsRest convert(final Context context, final String query, final String dsoType, + public SearchResultsRest convert(final Context context, final String query, final List dsoTypes, final String configurationName, final String scope, final List searchFilters, final Pageable page, final DiscoverResult searchResult, final DiscoveryConfiguration configuration, @@ -52,7 +52,7 @@ public class DiscoverResultConverter { SearchResultsRest resultsRest = new SearchResultsRest(); resultsRest.setProjection(projection); - setRequestInformation(context, query, dsoType, configurationName, scope, searchFilters, page, resultsRest); + setRequestInformation(context, query, dsoTypes, configurationName, scope, searchFilters, page, resultsRest); addSearchResults(searchResult, resultsRest, projection); @@ -101,13 +101,13 @@ public class DiscoverResultConverter { return null; } - private void setRequestInformation(final Context context, final String query, final String dsoType, + private void setRequestInformation(final Context context, final String query, final List dsoTypes, final String configurationName, final String scope, final List searchFilters, final Pageable page, final SearchResultsRest resultsRest) { resultsRest.setQuery(query); resultsRest.setConfiguration(configurationName); - resultsRest.setDsoType(dsoType); + resultsRest.setDsoTypes(dsoTypes); resultsRest.setScope(scope); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/CollectionResourceWorkflowGroupHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/CollectionResourceWorkflowGroupHalLinkFactory.java index 7d0256cfc4..c049a74c0d 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/CollectionResourceWorkflowGroupHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/CollectionResourceWorkflowGroupHalLinkFactory.java @@ -47,9 +47,9 @@ public class CollectionResourceWorkflowGroupHalLinkFactory Map roles = WorkflowUtils.getCollectionRoles(collection); UUID resourceUuid = UUID.fromString(halResource.getContent().getUuid()); for (Map.Entry entry : roles.entrySet()) { - list.add(buildLink("workflowGroups/" + entry.getKey(), getMethodOn() + list.add(buildLink("workflowGroups", getMethodOn() .getWorkflowGroupForRole(resourceUuid, null, null, - entry.getKey()))); + entry.getKey())).withName(entry.getKey())); } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/DiscoveryRestHalLinkFactory.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/DiscoveryRestHalLinkFactory.java index 0479322881..8e744e9fd5 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/DiscoveryRestHalLinkFactory.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/link/search/DiscoveryRestHalLinkFactory.java @@ -28,7 +28,7 @@ public abstract class DiscoveryRestHalLinkFactory extends HalLinkFactory extends HalLinkFactory extends HalLinkFactory dsoType = searchData == null ? null : searchData.getDsoTypes(); String scope = searchData == null ? null : searchData.getScope(); String configuration = searchData == null ? null : searchData.getConfiguration(); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/DiscoveryResultsRest.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/DiscoveryResultsRest.java index d45d948fa6..bf1d513a81 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/DiscoveryResultsRest.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/DiscoveryResultsRest.java @@ -27,7 +27,7 @@ public abstract class DiscoveryResultsRest extends BaseObjectRest { private List appliedFilters; private SearchResultsRest.Sorting sort; @JsonIgnore - private String dsoType; + private List dsoTypes; @JsonIgnore private List searchFilters; private String configuration; @@ -52,12 +52,12 @@ public abstract class DiscoveryResultsRest extends BaseObjectRest { this.query = query; } - public String getDsoType() { - return dsoType; + public List getDsoTypes() { + return dsoTypes; } - public void setDsoType(final String dsoType) { - this.dsoType = dsoType; + public void setDsoTypes(final List dsoTypes) { + this.dsoTypes = dsoTypes; } public String getScope() { diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RelationshipRest.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RelationshipRest.java index 16fcbbd0bf..e1aeb3ff6f 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RelationshipRest.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/RelationshipRest.java @@ -27,7 +27,6 @@ public class RelationshipRest extends BaseObjectRest { @JsonIgnore private UUID rightId; - private int relationshipTypeId; private RelationshipTypeRest relationshipType; private int leftPlace; private int rightPlace; @@ -90,14 +89,6 @@ public class RelationshipRest extends BaseObjectRest { this.rightPlace = rightPlace; } - public int getRelationshipTypeId() { - return relationshipTypeId; - } - - public void setRelationshipTypeId(int relationshipTypeId) { - this.relationshipTypeId = relationshipTypeId; - } - public String getRightwardValue() { return rightwardValue; } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java index 31e2c672e3..2631b63417 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/model/hateoas/HALResource.java @@ -8,11 +8,13 @@ package org.dspace.app.rest.model.hateoas; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonUnwrapped; +import org.apache.commons.lang3.StringUtils; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; @@ -49,6 +51,15 @@ public abstract class HALResource extends EntityModel { public EntityModel add(Link link) { if (!hasLink(link.getRel())) { return super.add(link); + } else { + String name = link.getName(); + if (StringUtils.isNotBlank(name)) { + List list = this.getLinks(link.getRel()); + // If a link of this name doesn't already exist in the list, add it + if (!list.stream().anyMatch((l -> StringUtils.equalsIgnoreCase(l.getName(), name)))) { + super.add(link); + } + } } return this; } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/AuthorizationRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/AuthorizationRestRepository.java index eb7e7efc12..704a4191dd 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/AuthorizationRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/AuthorizationRestRepository.java @@ -7,6 +7,10 @@ */ package org.dspace.app.rest.repository; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.apache.commons.lang3.StringUtils.isNotBlank; + import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -145,9 +149,11 @@ public class AuthorizationRestRepository extends DSpaceRestRepository findByObject(@Parameter(value = "uri", required = true) String uri, - @Parameter(value = "eperson") UUID epersonUuid, + @Parameter(value = "eperson") UUID epersonUuid, @Parameter(value = "feature") String featureName, Pageable pageable) throws AuthorizeException, SQLException { + Context context = obtainContext(); + BaseObjectRest obj = utils.getBaseObjectRestFromUri(context, uri); if (obj == null) { return null; @@ -162,11 +168,16 @@ public class AuthorizationRestRepository extends DSpaceRestRepository features = authorizationFeatureService.findByResourceType(obj.getUniqueType()); - List authorizations = new ArrayList(); - for (AuthorizationFeature f : features) { - if (authorizationFeatureService.isAuthorized(context, f, obj)) { - authorizations.add(new Authorization(user, f, obj)); + List authorizations; + if (isNotBlank(featureName)) { + authorizations = findByObjectAndFeature(context, user, obj, featureName); + } else { + List features = authorizationFeatureService.findByResourceType(obj.getUniqueType()); + authorizations = new ArrayList<>(); + for (AuthorizationFeature f : features) { + if (authorizationFeatureService.isAuthorized(context, f, obj)) { + authorizations.add(new Authorization(user, f, obj)); + } } } @@ -177,57 +188,17 @@ public class AuthorizationRestRepository extends DSpaceRestRepository findByObjectAndFeature( + Context context, EPerson user, BaseObjectRest obj, String featureName + ) throws SQLException { + + AuthorizationFeature feature = authorizationFeatureService.find(featureName); + + if (!authorizationFeatureService.isAuthorized(context, feature, obj)) { + return emptyList(); } - EPerson currUser = context.getCurrentUser(); - // get the user specified in the requested parameters, can be null for anonymous - EPerson user = getUserFromRequestParameter(context, epersonUuid); - if (currUser != user) { - // Temporarily change the Context's current user in order to retrieve - // authorizations based on that user - context.switchContextUser(user); - } - AuthorizationFeature feature = authorizationFeatureService.find(featureName); - AuthorizationRest authorizationRest = null; - if (authorizationFeatureService.isAuthorized(context, feature, obj)) { - Authorization authz = new Authorization(); - authz.setEperson(user); - authz.setFeature(feature); - authz.setObject(obj); - authorizationRest = converter.toRest(authz, utils.obtainProjection()); - } - if (currUser != user) { - // restore the real current user - context.restoreContextUser(); - } - return authorizationRest; + return singletonList(new Authorization(user, feature, obj)); } /** diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java index e8bf235940..149855c488 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DSpaceRestRepository.java @@ -463,7 +463,7 @@ public abstract class DSpaceRestRepository upload(HttpServletRequest request, MultipartFile uploadfile) + public Iterable upload(HttpServletRequest request, List uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { Context context = obtainContext(); Iterable entity = upload(context, request, uploadfile); @@ -486,7 +486,7 @@ public abstract class DSpaceRestRepository upload(Context context, HttpServletRequest request, - MultipartFile uploadfile) + List uploadfile) throws SQLException, FileNotFoundException, IOException, AuthorizeException { throw new RepositoryMethodNotImplementedException("No implementation found; Method not allowed!", ""); } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java index c0d40c4f3e..682ca834b8 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/DiscoveryRestRepository.java @@ -89,7 +89,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { return discoverConfigurationConverter.convert(discoveryConfiguration, utils.obtainProjection()); } - public SearchResultsRest getSearchObjects(final String query, final String dsoType, final String dsoScope, + public SearchResultsRest getSearchObjects(final String query, final List dsoTypes, final String dsoScope, final String configuration, final List searchFilters, final Pageable page, final Projection projection) { @@ -103,7 +103,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { try { discoverQuery = queryBuilder - .buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoType, page); + .buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoTypes, page); searchResult = searchService.search(context, scopeObject, discoverQuery); } catch (SearchServiceException e) { @@ -112,7 +112,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } return discoverResultConverter - .convert(context, query, dsoType, configuration, dsoScope, searchFilters, page, searchResult, + .convert(context, query, dsoTypes, configuration, dsoScope, searchFilters, page, searchResult, discoveryConfiguration, projection); } @@ -130,7 +130,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { return discoverSearchSupportConverter.convert(); } - public FacetResultsRest getFacetObjects(String facetName, String prefix, String query, String dsoType, + public FacetResultsRest getFacetObjects(String facetName, String prefix, String query, List dsoTypes, String dsoScope, final String configuration, List searchFilters, Pageable page) { Context context = obtainContext(); @@ -143,7 +143,7 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { DiscoverQuery discoverQuery = null; try { discoverQuery = queryBuilder.buildFacetQuery(context, scopeObject, discoveryConfiguration, prefix, query, - searchFilters, dsoType, page, facetName); + searchFilters, dsoTypes, page, facetName); searchResult = searchService.search(context, scopeObject, discoverQuery); } catch (SearchServiceException e) { @@ -152,12 +152,12 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { } FacetResultsRest facetResultsRest = discoverFacetResultsConverter.convert(context, facetName, prefix, query, - dsoType, dsoScope, searchFilters, searchResult, discoveryConfiguration, page, + dsoTypes, dsoScope, searchFilters, searchResult, discoveryConfiguration, page, utils.obtainProjection()); return facetResultsRest; } - public SearchResultsRest getAllFacets(String query, String dsoType, String dsoScope, String configuration, + public SearchResultsRest getAllFacets(String query, List dsoTypes, String dsoScope, String configuration, List searchFilters) { Context context = obtainContext(); @@ -171,14 +171,14 @@ public class DiscoveryRestRepository extends AbstractDSpaceRestRepository { try { discoverQuery = queryBuilder - .buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoType, page); + .buildQuery(context, scopeObject, discoveryConfiguration, query, searchFilters, dsoTypes, page); searchResult = searchService.search(context, scopeObject, discoverQuery); } catch (SearchServiceException e) { log.error("Error while searching with Discovery", e); } - SearchResultsRest searchResultsRest = discoverFacetsConverter.convert(context, query, dsoType, + SearchResultsRest searchResultsRest = discoverFacetsConverter.convert(context, query, dsoTypes, configuration, dsoScope, searchFilters, page, discoveryConfiguration, searchResult, utils.obtainProjection()); diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java index a8b514ba0c..1d6471c6be 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/repository/WorkspaceItemRestRepository.java @@ -16,10 +16,6 @@ import java.util.List; import java.util.UUID; import javax.servlet.http.HttpServletRequest; -import gr.ekt.bte.core.TransformationEngine; -import gr.ekt.bte.core.TransformationSpec; -import gr.ekt.bte.exceptions.BadTransformationSpec; -import gr.ekt.bte.exceptions.MalformedSourceException; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Logger; import org.dspace.app.rest.Parameter; @@ -45,6 +41,7 @@ import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.Collection; import org.dspace.content.Item; +import org.dspace.content.MetadataValue; import org.dspace.content.WorkspaceItem; import org.dspace.content.service.BitstreamFormatService; import org.dspace.content.service.BitstreamService; @@ -56,14 +53,12 @@ import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.EPersonServiceImpl; import org.dspace.event.Event; +import org.dspace.importer.external.datamodel.ImportRecord; +import org.dspace.importer.external.exception.FileMultipleOccurencesException; +import org.dspace.importer.external.metadatamapping.MetadatumDTO; +import org.dspace.importer.external.service.ImportService; import org.dspace.services.ConfigurationService; import org.dspace.submit.AbstractProcessingStep; -import org.dspace.submit.lookup.DSpaceWorkspaceItemOutputGenerator; -import org.dspace.submit.lookup.MultipleSubmissionLookupDataLoader; -import org.dspace.submit.lookup.SubmissionItemDataLoader; -import org.dspace.submit.lookup.SubmissionLookupOutputGenerator; -import org.dspace.submit.lookup.SubmissionLookupService; -import org.dspace.submit.util.ItemSubmissionLookupDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -73,10 +68,12 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; + /** * This is the repository responsible to manage WorkspaceItem Rest object * * @author Andrea Bollini (andrea.bollini at 4science.it) + * @author Pasquale Cavallo (pasquale.cavallo at 4science.it) */ @Component(WorkspaceItemRest.CATEGORY + "." + WorkspaceItemRest.NAME) public class WorkspaceItemRestRepository extends DSpaceRestRepository @@ -110,15 +107,15 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository upload(Context context, HttpServletRequest request, - MultipartFile uploadfile) + List uploadfiles) throws SQLException, FileNotFoundException, IOException, AuthorizeException { - File file = Utils.getFile(uploadfile, "upload-loader", "filedataloader"); List results = new ArrayList<>(); + String uuid = request.getParameter("owningCollection"); + if (StringUtils.isBlank(uuid)) { + uuid = configurationService.getProperty("submission.default.collection"); + } + Collection collection = null; + if (StringUtils.isNotBlank(uuid)) { + collection = collectionService.find(context, UUID.fromString(uuid)); + } else { + collection = collectionService.findAuthorizedOptimized(context, Constants.ADD).get(0); + } + + SubmissionConfig submissionConfig = + submissionConfigReader.getSubmissionConfigByCollection(collection.getHandle()); + List result = null; + List records = new ArrayList<>(); try { - String uuid = request.getParameter("collection"); - if (StringUtils.isBlank(uuid)) { - uuid = configurationService.getProperty("submission.default.collection"); - } - - Collection collection = null; - if (StringUtils.isNotBlank(uuid)) { - collection = collectionService.find(context, UUID.fromString(uuid)); - } else { - collection = collectionService.findAuthorizedOptimized(context, Constants.ADD).get(0); - } - - SubmissionConfig submissionConfig = - submissionConfigReader.getSubmissionConfigByCollection(collection.getHandle()); - - - List tmpResult = new ArrayList(); - - TransformationEngine transformationEngine1 = submissionLookupService.getPhase1TransformationEngine(); - TransformationSpec spec = new TransformationSpec(); - // FIXME this is mostly due to the need to test. The BTE framework has an assert statement that check if the - // number of found record is less than the requested and treat 0 as is, instead, the implementation assume - // 0=unlimited this lead to test failure. - // It is unclear if BTE really respect values other than 0/MAX allowing us to put a protection against heavy - // load - spec.setNumberOfRecords(Integer.MAX_VALUE); - if (transformationEngine1 != null) { - MultipleSubmissionLookupDataLoader dataLoader = - (MultipleSubmissionLookupDataLoader) transformationEngine1.getDataLoader(); - - List fileDataLoaders = submissionLookupService.getFileProviders(); - for (String fileDataLoader : fileDataLoaders) { - dataLoader.setFile(file.getAbsolutePath(), fileDataLoader); - - try { - SubmissionLookupOutputGenerator outputGenerator = - (SubmissionLookupOutputGenerator) transformationEngine1.getOutputGenerator(); - outputGenerator.setDtoList(new ArrayList()); - log.debug("BTE transformation is about to start!"); - transformationEngine1.transform(spec); - log.debug("BTE transformation finished!"); - tmpResult.addAll(outputGenerator.getDtoList()); - if (!tmpResult.isEmpty()) { - //exit with the results founded on the first data provided - break; - } - } catch (BadTransformationSpec e1) { - log.error(e1.getMessage(), e1); - } catch (MalformedSourceException e1) { - log.error(e1.getMessage(), e1); + for (MultipartFile mpFile : uploadfiles) { + File file = Utils.getFile(mpFile, "upload-loader", "filedataloader"); + try { + ImportRecord record = importService.getRecord(file, mpFile.getOriginalFilename()); + if (record != null) { + records.add(record); + break; } + } finally { + file.delete(); } } + } catch (FileMultipleOccurencesException e) { + throw new UnprocessableEntityException("Too many entries in file"); + } catch (Exception e) { + log.error("Error importing metadata", e); + } + WorkspaceItem source = submissionService. + createWorkspaceItem(context, getRequestService().getCurrentRequest()); + merge(context, records, source); + result = new ArrayList<>(); + result.add(source); - List result = null; - - //try to ingest workspaceitems - if (!tmpResult.isEmpty()) { - TransformationEngine transformationEngine2 = submissionLookupService.getPhase2TransformationEngine(); - if (transformationEngine2 != null) { - SubmissionItemDataLoader dataLoader = - (SubmissionItemDataLoader) transformationEngine2.getDataLoader(); - dataLoader.setDtoList(tmpResult); - // dataLoader.setProviders() - - DSpaceWorkspaceItemOutputGenerator outputGenerator = - (DSpaceWorkspaceItemOutputGenerator) transformationEngine2.getOutputGenerator(); - outputGenerator.setCollection(collection); - outputGenerator.setContext(context); - outputGenerator.setFormName(submissionConfig.getSubmissionName()); - outputGenerator.setDto(tmpResult.get(0)); - - try { - transformationEngine2.transform(spec); - result = outputGenerator.getWitems(); - } catch (BadTransformationSpec e1) { - e1.printStackTrace(); - } catch (MalformedSourceException e1) { - e1.printStackTrace(); - } - } - } - - //we have to create the workspaceitem to push the file also if nothing found before - if (result == null) { - WorkspaceItem source = - submissionService.createWorkspaceItem(context, getRequestService().getCurrentRequest()); - result = new ArrayList<>(); - result.add(source); - } - - //perform upload of bitstream if there is exact one result and convert workspaceitem to entity rest - if (result != null && !result.isEmpty()) { - for (WorkspaceItem wi : result) { - - List errors = new ArrayList(); - - //load bitstream into bundle ORIGINAL only if there is one result (approximately this is the - // right behaviour for pdf file but not for other bibliographic format e.g. bibtex) - if (result.size() == 1) { - - for (int i = 0; i < submissionConfig.getNumberOfSteps(); i++) { - SubmissionStepConfig stepConfig = submissionConfig.getStep(i); - - ClassLoader loader = this.getClass().getClassLoader(); - Class stepClass; - try { - stepClass = loader.loadClass(stepConfig.getProcessingClassName()); - - Object stepInstance = stepClass.newInstance(); - if (UploadableStep.class.isAssignableFrom(stepClass)) { - UploadableStep uploadableStep = (UploadableStep) stepInstance; - ErrorRest err = uploadableStep.upload(context, submissionService, stepConfig, wi, - uploadfile); + //perform upload of bitstream if there is exact one result and convert workspaceitem to entity rest + if (!result.isEmpty()) { + for (WorkspaceItem wi : result) { + List errors = new ArrayList(); + wi.setMultipleFiles(uploadfiles.size() > 1); + //load bitstream into bundle ORIGINAL only if there is one result (approximately this is the + // right behaviour for pdf file but not for other bibliographic format e.g. bibtex) + if (result.size() == 1) { + for (int i = 0; i < submissionConfig.getNumberOfSteps(); i++) { + SubmissionStepConfig stepConfig = submissionConfig.getStep(i); + ClassLoader loader = this.getClass().getClassLoader(); + Class stepClass; + try { + stepClass = loader.loadClass(stepConfig.getProcessingClassName()); + Object stepInstance = stepClass.newInstance(); + if (UploadableStep.class.isAssignableFrom(stepClass)) { + UploadableStep uploadableStep = (UploadableStep) stepInstance; + for (MultipartFile mpFile : uploadfiles) { + ErrorRest err = uploadableStep.upload(context, + submissionService, stepConfig, wi, mpFile); if (err != null) { errors.add(err); } } - - } catch (Exception e) { - log.error(e.getMessage(), e); } + } catch (Exception e) { + log.error(e.getMessage(), e); } } - WorkspaceItemRest wsi = converter.toRest(wi, utils.obtainProjection()); - if (result.size() == 1) { - if (!errors.isEmpty()) { - wsi.getErrors().addAll(errors); - } - } - results.add(wsi); } + WorkspaceItemRest wsi = converter.toRest(wi, utils.obtainProjection()); + if (result.size() == 1) { + if (!errors.isEmpty()) { + wsi.getErrors().addAll(errors); + } + } + results.add(wsi); } - } finally { - file.delete(); } return results; } @@ -551,4 +488,24 @@ public class WorkspaceItemRestRepository extends DSpaceRestRepository getPKClass() { return Integer.class; } + + private void merge(Context context, List records, WorkspaceItem item) throws SQLException { + for (MetadataValue metadataValue : itemService.getMetadata( + item.getItem(), Item.ANY, Item.ANY, Item.ANY, Item.ANY)) { + itemService.clearMetadata(context, item.getItem(), + metadataValue.getMetadataField().getMetadataSchema().getNamespace(), + metadataValue.getMetadataField().getElement(), + metadataValue.getMetadataField().getQualifier(), + metadataValue.getLanguage()); + } + for (ImportRecord record : records) { + if (record != null && record.getValueList() != null) { + for (MetadatumDTO metadataValue : record.getValueList()) { + itemService.addMetadata(context, item.getItem(), metadataValue.getSchema(), + metadataValue.getElement(), metadataValue.getQualifier(), null, + metadataValue.getValue()); + } + } + } + } } diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java index a6d3fd00dd..3afbdfb8a3 100644 --- a/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java +++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/utils/DiscoverQueryBuilder.java @@ -7,6 +7,10 @@ */ package org.dspace.app.rest.utils; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; + import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -65,14 +69,47 @@ public class DiscoverQueryBuilder implements InitializingBean { pageSizeLimit = configurationService.getIntProperty("rest.search.max.results", 100); } + /** + * Build a discovery query + * + * @param context the DSpace context + * @param scope the scope for this discovery query + * @param discoveryConfiguration the discovery configuration for this discovery query + * @param query the query string for this discovery query + * @param searchFilters the search filters for this discovery query + * @param dsoType only include search results with this type + * @param page the pageable for this discovery query + */ public DiscoverQuery buildQuery(Context context, IndexableObject scope, DiscoveryConfiguration discoveryConfiguration, String query, List searchFilters, String dsoType, Pageable page) throws DSpaceBadRequestException { + List dsoTypes = dsoType != null ? singletonList(dsoType) : emptyList(); + + return buildQuery(context, scope, discoveryConfiguration, query, searchFilters, dsoTypes, page); + } + + /** + * Build a discovery query + * + * @param context the DSpace context + * @param scope the scope for this discovery query + * @param discoveryConfiguration the discovery configuration for this discovery query + * @param query the query string for this discovery query + * @param searchFilters the search filters for this discovery query + * @param dsoTypes only include search results with one of these types + * @param page the pageable for this discovery query + */ + public DiscoverQuery buildQuery(Context context, IndexableObject scope, + DiscoveryConfiguration discoveryConfiguration, + String query, List searchFilters, + List dsoTypes, Pageable page) + throws DSpaceBadRequestException { + DiscoverQuery queryArgs = buildCommonDiscoverQuery(context, discoveryConfiguration, query, searchFilters, - dsoType); + dsoTypes); //When all search criteria are set, configure facet results addFaceting(context, scope, queryArgs, discoveryConfiguration); @@ -98,14 +135,52 @@ public class DiscoverQueryBuilder implements InitializingBean { } } + /** + * Create a discovery facet query. + * + * @param context the DSpace context + * @param scope the scope for this discovery query + * @param discoveryConfiguration the discovery configuration for this discovery query + * @param prefix limit the facets results to those starting with the given prefix. + * @param query the query string for this discovery query + * @param searchFilters the search filters for this discovery query + * @param dsoType only include search results with this type + * @param page the pageable for this discovery query + * @param facetName the facet field + */ public DiscoverQuery buildFacetQuery(Context context, IndexableObject scope, DiscoveryConfiguration discoveryConfiguration, String prefix, String query, List searchFilters, String dsoType, Pageable page, String facetName) throws DSpaceBadRequestException { + List dsoTypes = dsoType != null ? singletonList(dsoType) : emptyList(); + + return buildFacetQuery( + context, scope, discoveryConfiguration, prefix, query, searchFilters, dsoTypes, page, facetName); + } + + /** + * Create a discovery facet query. + * + * @param context the DSpace context + * @param scope the scope for this discovery query + * @param discoveryConfiguration the discovery configuration for this discovery query + * @param prefix limit the facets results to those starting with the given prefix. + * @param query the query string for this discovery query + * @param searchFilters the search filters for this discovery query + * @param dsoTypes only include search results with one of these types + * @param page the pageable for this discovery query + * @param facetName the facet field + */ + public DiscoverQuery buildFacetQuery(Context context, IndexableObject scope, + DiscoveryConfiguration discoveryConfiguration, + String prefix, String query, List searchFilters, + List dsoTypes, Pageable page, String facetName) + throws DSpaceBadRequestException { + DiscoverQuery queryArgs = buildCommonDiscoverQuery(context, discoveryConfiguration, query, searchFilters, - dsoType); + dsoTypes); //When all search criteria are set, configure facet results addFacetingForFacets(context, scope, prefix, queryArgs, discoveryConfiguration, facetName, page); @@ -170,7 +245,7 @@ public class DiscoverQueryBuilder implements InitializingBean { private DiscoverQuery buildCommonDiscoverQuery(Context context, DiscoveryConfiguration discoveryConfiguration, String query, - List searchFilters, String dsoType) + List searchFilters, List dsoTypes) throws DSpaceBadRequestException { DiscoverQuery queryArgs = buildBaseQueryForConfiguration(discoveryConfiguration); @@ -182,10 +257,13 @@ public class DiscoverQueryBuilder implements InitializingBean { queryArgs.setQuery(query); } - //Limit results to DSO type - if (StringUtils.isNotBlank(dsoType)) { - queryArgs.setDSpaceObjectFilter(getDsoType(dsoType)); + //Limit results to DSO types + if (isNotEmpty(dsoTypes)) { + dsoTypes.stream() + .map(this::getDsoType) + .forEach(queryArgs::addDSpaceObjectFilter); } + return queryArgs; } diff --git a/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/api/solr-services.xml b/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/api/solr-services.xml index b0eb2191c7..5bb4b97589 100644 --- a/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/api/solr-services.xml +++ b/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/api/solr-services.xml @@ -19,15 +19,22 @@ - + - + - + - + - - + + diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/oai/OAIpmhIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/oai/OAIpmhIT.java index 3b277a937f..052c363771 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/oai/OAIpmhIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/oai/OAIpmhIT.java @@ -29,9 +29,9 @@ import com.lyncode.xoai.dataprovider.services.impl.BaseDateProvider; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.Configuration; import com.lyncode.xoai.dataprovider.xml.xoaiconfig.ContextConfiguration; import org.apache.commons.lang3.time.DateUtils; -import org.dspace.app.rest.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Community; import org.dspace.services.ConfigurationService; import org.dspace.xoai.services.api.EarliestDateResolver; @@ -76,7 +76,7 @@ public class OAIpmhIT extends AbstractControllerIntegrationTest { private EarliestDateResolver earliestDateResolver; // XOAI's BaseDateProvider (used for date-based testing below) - private static BaseDateProvider baseDateProvider = new BaseDateProvider(); + private static final BaseDateProvider baseDateProvider = new BaseDateProvider(); // Spy on the current XOAIManagerResolver bean, to allow us to change behavior of XOAIManager in tests // See also: createMockXOAIManager() method @@ -278,6 +278,6 @@ public class OAIpmhIT extends AbstractControllerIntegrationTest { * @throws ConfigurationException */ private XOAIManager createMockXOAIManager(Configuration xoaiConfig) throws ConfigurationException { - return new XOAIManager(filterResolver, resourceResolver, xoaiConfig); + return new XOAIManager(filterResolver, resourceResolver, xoaiConfig); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/opensearch/OpenSearchControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/opensearch/OpenSearchControllerIT.java index 58cd3d0a16..9f7e4e6610 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/opensearch/OpenSearchControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/opensearch/OpenSearchControllerIT.java @@ -12,10 +12,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. 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.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -210,7 +210,7 @@ public class OpenSearchControllerIT extends AbstractControllerIntegrationTest { .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: diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rdf/RdfIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rdf/RdfIT.java index 681b2ced81..85ab3dcadd 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rdf/RdfIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rdf/RdfIT.java @@ -14,8 +14,8 @@ import static org.mockito.Mockito.doReturn; import java.net.URI; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.test.AbstractWebClientIntegrationTest; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Community; import org.dspace.content.service.SiteService; import org.dspace.rdf.RDFUtil; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AnonymousAdditionalAuthorizationFilterIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AnonymousAdditionalAuthorizationFilterIT.java index 3202bd37c2..106018ff9b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AnonymousAdditionalAuthorizationFilterIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AnonymousAdditionalAuthorizationFilterIT.java @@ -10,11 +10,11 @@ package org.dspace.app.rest; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.dspace.app.rest.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthenticationRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthenticationRestControllerIT.java index 513ca5ebfd..24a27b9fe8 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthenticationRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthenticationRestControllerIT.java @@ -30,17 +30,17 @@ import javax.servlet.http.Cookie; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -import org.dspace.app.rest.builder.BitstreamBuilder; -import org.dspace.app.rest.builder.BundleBuilder; -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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.matcher.AuthenticationStatusMatcher; import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.HalMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.BundleBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; @@ -70,12 +70,14 @@ public class AuthenticationRestControllerIT extends AbstractControllerIntegratio public static final String[] PASS_ONLY = {"org.dspace.authenticate.PasswordAuthentication"}; public static final String[] SHIB_ONLY = {"org.dspace.authenticate.ShibAuthentication"}; - public static final String[] SHIB_AND_PASS = - {"org.dspace.authenticate.ShibAuthentication", - "org.dspace.authenticate.PasswordAuthentication"}; - public static final String[] SHIB_AND_IP = - {"org.dspace.authenticate.IPAuthentication", - "org.dspace.authenticate.ShibAuthentication"}; + public static final String[] SHIB_AND_PASS = { + "org.dspace.authenticate.ShibAuthentication", + "org.dspace.authenticate.PasswordAuthentication" + }; + public static final String[] SHIB_AND_IP = { + "org.dspace.authenticate.IPAuthentication", + "org.dspace.authenticate.ShibAuthentication" + }; @Before public void setup() throws Exception { @@ -406,7 +408,7 @@ public class AuthenticationRestControllerIT extends AbstractControllerIntegratio @Test public void testLoginGetRequest() throws Exception { - getClient().perform(get("/api/authn/login") + getClient().perform(get("/api/authn/login") .param("user", eperson.getEmail()) .param("password", password)) .andExpect(status().isMethodNotAllowed()); @@ -721,8 +723,8 @@ public class AuthenticationRestControllerIT extends AbstractControllerIntegratio //Check if WWW-Authenticate header contains only password getClient().perform(get("/api/authn/status").header("Referer", "http://my.uni.edu")) - .andExpect(status().isOk()) - .andExpect(header().string("WWW-Authenticate", + .andExpect(status().isOk()) + .andExpect(header().string("WWW-Authenticate", "password realm=\"DSpace REST API\"")); //Check if a shibboleth authentication fails @@ -730,7 +732,6 @@ public class AuthenticationRestControllerIT extends AbstractControllerIntegratio .requestAttr("SHIB-MAIL", eperson.getEmail()) .requestAttr("SHIB-SCOPED-AFFILIATION", "faculty;staff")) .andExpect(status().isUnauthorized()); - } @Test diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationFeatureServiceIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationFeatureServiceIT.java index d53bdc92c8..eba774345d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationFeatureServiceIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationFeatureServiceIT.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Set; import org.apache.commons.lang3.ArrayUtils; +import org.dspace.AbstractIntegrationTestWithDatabase; import org.dspace.app.rest.authorization.AlwaysFalseFeature; import org.dspace.app.rest.authorization.AlwaysThrowExceptionFeature; import org.dspace.app.rest.authorization.AlwaysTrueFeature; @@ -26,7 +27,6 @@ import org.dspace.app.rest.converter.SiteConverter; import org.dspace.app.rest.model.CollectionRest; import org.dspace.app.rest.model.SiteRest; import org.dspace.app.rest.projection.DefaultProjection; -import org.dspace.app.rest.test.AbstractIntegrationTestWithDatabase; import org.dspace.app.rest.utils.DSpaceConfigurationInitializer; import org.dspace.app.rest.utils.DSpaceKernelInitializer; import org.dspace.content.Site; @@ -77,7 +77,7 @@ public class AuthorizationFeatureServiceIT extends AbstractIntegrationTestWithDa assertThat("We have at least our 7 mock features for testing", authzFeatureServiceFindAll.size(), greaterThanOrEqualTo(7)); - Set featureNames = new HashSet(); + Set featureNames = new HashSet<>(); for (AuthorizationFeature f : authzFeatureServiceFindAll) { featureNames.add(f.getName()); } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationRestRepositoryIT.java index edb7ef71a1..df2a4c310b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/AuthorizationRestRepositoryIT.java @@ -7,8 +7,12 @@ */ package org.dspace.app.rest; +import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -28,9 +32,6 @@ import org.dspace.app.rest.authorization.TrueForAdminsFeature; import org.dspace.app.rest.authorization.TrueForLoggedUsersFeature; import org.dspace.app.rest.authorization.TrueForTestUsersFeature; import org.dspace.app.rest.authorization.TrueForUsersInGroupTestFeature; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.EPersonBuilder; -import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.converter.CommunityConverter; import org.dspace.app.rest.converter.EPersonConverter; import org.dspace.app.rest.converter.SiteConverter; @@ -43,6 +44,9 @@ import org.dspace.app.rest.model.SiteRest; import org.dspace.app.rest.projection.DefaultProjection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.utils.Utils; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; import org.dspace.content.Community; import org.dspace.content.Site; import org.dspace.content.factory.ContentServiceFactory; @@ -982,94 +986,153 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration String adminToken = getAuthToken(admin.getEmail(), password); // verify that it works for administrators - with eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName()) .param("eperson", admin.getID().toString())) .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id", Matchers.is(admin.getID().toString() + "_" + alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is(admin.getID().toString() + "_" + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId())), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson.id", is(admin.getID().toString())) + ) + ))); // verify that it works for administrators - without eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id", Matchers.is(admin.getID().toString() + "_" + alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is( + admin.getID().toString() + "_" + + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId() + )), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson.id", is(admin.getID().toString())) + ) + ))); String epersonToken = getAuthToken(eperson.getEmail(), password); // verify that it works for normal loggedin users - with eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id", Matchers.is(eperson.getID().toString() + "_" + alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is( + eperson.getID().toString() + "_" + + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId() + )), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson.id", is(eperson.getID().toString())) + ) + ))); // verify that it works for normal loggedin users - without eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id", Matchers.is(eperson.getID().toString() + "_" + alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is( + eperson.getID().toString() + "_" + + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId() + )), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson.id", is(eperson.getID().toString())) + ) + ))); // verify that it works for administators inspecting other users - by using the eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id", Matchers.is(eperson.getID().toString() + "_" + alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is( + eperson.getID().toString() + "_" + + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId() + )), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson.id", is(eperson.getID().toString())) + ) + ))); // verify that it works for administators inspecting other users - by assuming login - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", eperson.getID())) .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id", Matchers.is(eperson.getID().toString() + "_" + alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is( + eperson.getID().toString() + "_" + + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId() + )), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson.id", is(eperson.getID().toString())) + ) + ))); // verify that it works for anonymous users - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", comUri) .param("projection", "level") .param("embedLevelDepth", "1") .param("feature", alwaysTrue.getName())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.type", is("authorization"))) - .andExpect(jsonPath("$._embedded.feature.id", is(alwaysTrue.getName()))) - .andExpect(jsonPath("$.id",Matchers.is(alwaysTrue.getName() + "_" - + comRest.getUniqueType() + "_" + comRest.getId()))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(1))) + .andExpect(jsonPath("$._embedded.authorizations", contains( + allOf( + hasJsonPath("$.id", is( + alwaysTrue.getName() + "_" + + comRest.getUniqueType() + "_" + comRest.getId() + )), + hasJsonPath("$.type", is("authorization")), + hasJsonPath("$._embedded.feature.id", is(alwaysTrue.getName())), + hasJsonPath("$._embedded.eperson", nullValue()) + ) + ))); } @Test @@ -1086,52 +1149,52 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration String adminToken = getAuthToken(admin.getEmail(), password); // verify that it works for administrators - with eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysFalse.getName()) .param("eperson", admin.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for administrators - without eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysFalse.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); String epersonToken = getAuthToken(eperson.getEmail(), password); // verify that it works for normal loggedin users - with eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForAdmins.getName()) .param("eperson", eperson.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for normal loggedin users - without eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForAdmins.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for administators inspecting other users - by using the eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForAdmins.getName()) .param("eperson", eperson.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for administators inspecting other users - by assuming login - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForAdmins.getName()) .header("X-On-Behalf-Of", eperson.getID())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for anonymous users - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForLoggedUsers.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -1153,98 +1216,99 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration String adminToken = getAuthToken(admin.getEmail(), password); // verify that it works for administrators, no result - with eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName()) .param("eperson", admin.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature") .param("eperson", admin.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for administrators, no result - without eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature")) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); String epersonToken = getAuthToken(eperson.getEmail(), password); // verify that it works for normal loggedin users - with eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature") .param("eperson", eperson.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for normal loggedin users - without eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature")) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for administators inspecting other users - by using the eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature") .param("eperson", eperson.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for administators inspecting other users - by assuming login - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", eperson.getID())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature") .header("X-On-Behalf-Of", eperson.getID())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // verify that it works for anonymous users - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", wrongSiteUri) .param("feature", alwaysTrue.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", "not-existing-feature")) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test /** * Verify that the findByObject return the 400 Bad Request response for invalid or missing URI or feature (required * parameters) - * + * * @throws Exception */ public void findByObjectAndFeatureBadRequestTest() throws Exception { @@ -1266,34 +1330,34 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration log.debug("findByObjectAndFeatureBadRequestTest - Testing the URI: " + invalidUri); // verify that it works for administrators with an invalid or missing uri - with eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName()) .param("eperson", admin.getID().toString())) .andExpect(status().isBadRequest()); // verify that it works for administrators with an invalid or missing uri - without eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName())) .andExpect(status().isBadRequest()); // verify that it works for normal loggedin users with an invalid or missing uri - with eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) .andExpect(status().isBadRequest()); // verify that it works for normal loggedin users with an invalid or missing uri - without eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName())) .andExpect(status().isBadRequest()); // verify that it works for administators inspecting other users with an invalid or missing uri - by // using the eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) @@ -1301,51 +1365,18 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration // verify that it works for administators inspecting other users with an invalid or missing uri - by // assuming login - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", eperson.getID())) .andExpect(status().isBadRequest()); // verify that it works for anonymous users with an invalid or missing uri - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", invalidUri) .param("feature", alwaysTrue.getName())) .andExpect(status().isBadRequest()); } - - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("eperson", admin.getID().toString())) - .andExpect(status().isBadRequest()); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("eperson", eperson.getID().toString())) - .andExpect(status().isBadRequest()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("eperson", eperson.getID().toString())) - .andExpect(status().isBadRequest()); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature")) - .andExpect(status().isBadRequest()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature")) - .andExpect(status().isBadRequest()); - - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri) - .param("eperson", admin.getID().toString())) - .andExpect(status().isBadRequest()); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri) - .param("eperson", eperson.getID().toString())) - .andExpect(status().isBadRequest()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri) - .param("eperson", eperson.getID().toString())) - .andExpect(status().isBadRequest()); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri)) - .andExpect(status().isBadRequest()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri.toString())) - .andExpect(status().isBadRequest()); } @Test @@ -1363,28 +1394,28 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration configurationService.setProperty("org.dspace.app.rest.authorization.AlwaysThrowExceptionFeature.turnoff", true); // verify that it works for an anonymous user inspecting an admin user - by using the eperson parameter - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .param("eperson", admin.getID().toString())) .andExpect(status().isUnauthorized()); // verify that it works for an anonymous user inspecting an admin user - by assuming login - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", admin.getID())) .andExpect(status().isUnauthorized()); // verify that it works for an anonymous user inspecting a normal user - by using the eperson parameter - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) .andExpect(status().isUnauthorized()); // verify that it works for an anonymous user inspecting a normal user - by assuming login - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", eperson.getID())) @@ -1411,28 +1442,28 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration String anotherToken = getAuthToken(anotherEperson.getEmail(), password); // verify that he cannot search the admin authorizations - by using the eperson parameter - getClient(anotherToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(anotherToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .param("eperson", admin.getID().toString())) .andExpect(status().isForbidden()); // verify that he cannot search the admin authorizations - by assuming login - getClient(anotherToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(anotherToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", admin.getID())) .andExpect(status().isForbidden()); // verify that he cannot search the authorizations of another "normal" eperson - by using the eperson parameter - getClient(anotherToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(anotherToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .param("eperson", eperson.getID().toString())) .andExpect(status().isForbidden()); // verify that he cannot search the authorizations of another "normal" eperson - by assuming login - getClient(anotherToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(anotherToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysTrue.getName()) .header("X-On-Behalf-Of", eperson.getID())) @@ -1452,14 +1483,14 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration String adminToken = getAuthToken(admin.getEmail(), password); // verify that it works for administrators - with eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysException.getName()) .param("eperson", admin.getID().toString())) .andExpect(status().isInternalServerError()); // verify that it works for administrators - without eperson parameter - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysException.getName())) .andExpect(status().isInternalServerError()); @@ -1467,20 +1498,20 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration String epersonToken = getAuthToken(eperson.getEmail(), password); // verify that it works for normal loggedin users - with eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysException.getName()) .param("eperson", eperson.getID().toString())) .andExpect(status().isInternalServerError()); // verify that it works for normal loggedin users - without eperson parameter - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysException.getName())) .andExpect(status().isInternalServerError()); // verify that it works for anonymous users - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", alwaysException.getName())) .andExpect(status().isInternalServerError()); @@ -1520,31 +1551,31 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration // check both via direct access than via a search method getClient(adminToken).perform(get("/api/authz/authorizations/" + authAdminSite.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", admin.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // nor the normal user both directly than if checked by the admin getClient(adminToken).perform(get("/api/authz/authorizations/" + authNormalUserSite.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", normalUser.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient(normalUserToken).perform(get("/api/authz/authorizations/" + authNormalUserSite.getID())) .andExpect(status().isNotFound()); - getClient(normalUserToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(normalUserToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", normalUser.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // instead the member user has getClient(adminToken).perform(get("/api/authz/authorizations/" + authMemberSite.getID())) .andExpect(status().isOk()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", memberOfTestGroup.getID().toString())) @@ -1552,7 +1583,7 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration // so it can also check itself the permission getClient(memberToken).perform(get("/api/authz/authorizations/" + authMemberSite.getID())) .andExpect(status().isOk()); - getClient(memberToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(memberToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", memberOfTestGroup.getID().toString())) @@ -1568,7 +1599,7 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration // our admin now should have the authorization getClient(adminToken).perform(get("/api/authz/authorizations/" + authAdminSite.getID())) .andExpect(status().isOk()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", admin.getID().toString())) @@ -1576,15 +1607,15 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration // our normal user when checked via the admin should still not have the authorization getClient(adminToken).perform(get("/api/authz/authorizations/" + authNormalUserSite.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", normalUser.getID().toString())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // but he should have the authorization if loggedin directly getClient(normalUserToken).perform(get("/api/authz/authorizations/" + authNormalUserSite.getID())) .andExpect(status().isOk()); - getClient(normalUserToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(normalUserToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", normalUser.getID().toString())) @@ -1592,14 +1623,14 @@ public class AuthorizationRestRepositoryIT extends AbstractControllerIntegration // for our direct member user we don't expect differences getClient(adminToken).perform(get("/api/authz/authorizations/" + authMemberSite.getID())) .andExpect(status().isOk()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", memberOfTestGroup.getID().toString())) .andExpect(status().isOk()); getClient(memberToken).perform(get("/api/authz/authorizations/" + authMemberSite.getID())) .andExpect(status().isOk()); - getClient(memberToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(memberToken).perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", trueForUsersInGroupTest.getName()) .param("eperson", memberOfTestGroup.getID().toString())) diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamControllerIT.java index 608232ef5d..ca3c05ec30 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamControllerIT.java @@ -22,15 +22,15 @@ import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.dspace.app.rest.builder.BitstreamBuilder; -import org.dspace.app.rest.builder.BundleBuilder; -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.ItemBuilder; -import org.dspace.app.rest.builder.ResourcePolicyBuilder; import org.dspace.app.rest.matcher.BundleMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.BundleBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamFormatRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamFormatRestRepositoryIT.java index 744e673912..48ad410d00 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamFormatRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamFormatRestRepositoryIT.java @@ -25,14 +25,14 @@ import java.util.Random; import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dspace.app.rest.builder.BitstreamFormatBuilder; -import org.dspace.app.rest.builder.EPersonBuilder; import org.dspace.app.rest.converter.BitstreamFormatConverter; import org.dspace.app.rest.matcher.BitstreamFormatMatcher; import org.dspace.app.rest.matcher.HalMatcher; import org.dspace.app.rest.model.BitstreamFormatRest; import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamFormatBuilder; +import org.dspace.builder.EPersonBuilder; import org.dspace.content.BitstreamFormat; import org.dspace.content.service.BitstreamFormatService; import org.dspace.core.I18nUtil; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestControllerIT.java index 96176d0a77..675d725a84 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestControllerIT.java @@ -11,13 +11,13 @@ import static java.util.UUID.randomUUID; import static org.apache.commons.codec.CharEncoding.UTF_8; import static org.apache.commons.collections.CollectionUtils.isEmpty; import static org.apache.commons.io.IOUtils.toInputStream; -import static org.dspace.app.rest.builder.BitstreamBuilder.createBitstream; -import static org.dspace.app.rest.builder.BitstreamFormatBuilder.createBitstreamFormat; -import static org.dspace.app.rest.builder.CollectionBuilder.createCollection; -import static org.dspace.app.rest.builder.CommunityBuilder.createCommunity; -import static org.dspace.app.rest.builder.ItemBuilder.createItem; -import static org.dspace.app.rest.builder.ResourcePolicyBuilder.createResourcePolicy; import static org.dspace.app.rest.matcher.BitstreamFormatMatcher.matchBitstreamFormat; +import static org.dspace.builder.BitstreamBuilder.createBitstream; +import static org.dspace.builder.BitstreamFormatBuilder.createBitstreamFormat; +import static org.dspace.builder.CollectionBuilder.createCollection; +import static org.dspace.builder.CommunityBuilder.createCommunity; +import static org.dspace.builder.ItemBuilder.createItem; +import static org.dspace.builder.ResourcePolicyBuilder.createResourcePolicy; import static org.dspace.content.BitstreamFormat.KNOWN; import static org.dspace.content.BitstreamFormat.SUPPORTED; import static org.dspace.core.Constants.READ; @@ -53,14 +53,14 @@ import org.apache.commons.lang3.StringUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.solr.client.solrj.SolrServerException; -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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.BitstreamFormat; import org.dspace.content.Collection; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestRepositoryIT.java index 691bb7d07d..684eceb639 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BitstreamRestRepositoryIT.java @@ -23,12 +23,6 @@ import java.util.UUID; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -import org.dspace.app.rest.builder.BitstreamBuilder; -import org.dspace.app.rest.builder.BundleBuilder; -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.builder.ResourcePolicyBuilder; import org.dspace.app.rest.matcher.BitstreamFormatMatcher; import org.dspace.app.rest.matcher.BitstreamMatcher; import org.dspace.app.rest.matcher.BundleMatcher; @@ -36,6 +30,12 @@ import org.dspace.app.rest.matcher.HalMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.test.MetadataPatchSuite; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.BundleBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java index 88ca72b08a..c4abf5240b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BrowsesResourceControllerIT.java @@ -19,14 +19,14 @@ 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.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.matcher.BrowseEntryResourceMatcher; import org.dspace.app.rest.matcher.BrowseIndexMatcher; import org.dspace.app.rest.matcher.ItemMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleRestRepositoryIT.java index 4aa25946ff..b99dd5bf99 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleRestRepositoryIT.java @@ -27,13 +27,6 @@ import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -import org.dspace.app.rest.builder.BitstreamBuilder; -import org.dspace.app.rest.builder.BundleBuilder; -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.ItemBuilder; -import org.dspace.app.rest.builder.ResourcePolicyBuilder; import org.dspace.app.rest.matcher.BitstreamMatcher; import org.dspace.app.rest.matcher.BundleMatcher; import org.dspace.app.rest.matcher.HalMatcher; @@ -47,6 +40,13 @@ import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.BundleBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; @@ -76,6 +76,7 @@ public class BundleRestRepositoryIT extends AbstractControllerIntegrationTest { private Bitstream bitstream2; @Before + @Override public void setUp() throws Exception { super.setUp(); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleUploadBitstreamControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleUploadBitstreamControllerIT.java index efb07b3f1d..eefcb81656 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleUploadBitstreamControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/BundleUploadBitstreamControllerIT.java @@ -18,10 +18,6 @@ import java.util.Map; import java.util.UUID; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dspace.app.rest.builder.BundleBuilder; -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.matcher.BitstreamMatcher; import org.dspace.app.rest.matcher.MetadataMatcher; import org.dspace.app.rest.model.BitstreamRest; @@ -29,6 +25,10 @@ import org.dspace.app.rest.model.MetadataRest; import org.dspace.app.rest.model.MetadataValueRest; import org.dspace.app.rest.test.AbstractEntityIntegrationTest; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.BundleBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Bundle; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java index 4f9c753047..fcb814d82d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java @@ -20,12 +20,12 @@ import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.MediaType; -import org.dspace.app.rest.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.WorkspaceItemBuilder; import org.dspace.app.rest.model.patch.AddOperation; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.WorkspaceItem; @@ -61,7 +61,7 @@ public class CCLicenseAddPatchOperationIT extends AbstractControllerIntegrationT String adminToken = getAuthToken(admin.getEmail(), password); - List ops = new ArrayList(); + List ops = new ArrayList<>(); AddOperation addOperation = new AddOperation("/sections/cclicense/uri", "http://creativecommons.org/licenses/by-nc-sa/4.0/"); @@ -102,7 +102,7 @@ public class CCLicenseAddPatchOperationIT extends AbstractControllerIntegrationT String adminToken = getAuthToken(admin.getEmail(), password); - List ops = new ArrayList(); + List ops = new ArrayList<>(); AddOperation addOperation = new AddOperation("/sections/cclicense/uri", "invalid-license-uri"); ops.add(addOperation); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java index 3b05621f08..c003cf2809 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java @@ -19,13 +19,13 @@ import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.MediaType; -import org.dspace.app.rest.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.WorkspaceItemBuilder; 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.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.WorkspaceItem; @@ -62,7 +62,7 @@ public class CCLicenseRemovePatchOperationIT extends AbstractControllerIntegrati String epersonToken = getAuthToken(eperson.getEmail(), password); // First add a license and verify it is added - List ops = new ArrayList(); + List ops = new ArrayList<>(); AddOperation addOperation = new AddOperation("/sections/cclicense/uri", "http://creativecommons.org/licenses/by-nc-sa/4.0/"); @@ -84,7 +84,7 @@ public class CCLicenseRemovePatchOperationIT extends AbstractControllerIntegrati // Remove the license again and verify it is removed - List removeOps = new ArrayList(); + List removeOps = new ArrayList<>(); RemoveOperation removeOperation = new RemoveOperation("/sections/cclicense/uri"); removeOps.add(removeOperation); @@ -120,7 +120,7 @@ public class CCLicenseRemovePatchOperationIT extends AbstractControllerIntegrati String epersonToken = getAuthToken(eperson.getEmail(), password); - List removeOps = new ArrayList(); + List removeOps = new ArrayList<>(); RemoveOperation removeOperation = new RemoveOperation("/sections/cclicense/uri"); removeOps.add(removeOperation); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionGroupRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionGroupRestControllerIT.java index 7464e9c38c..767ea5f565 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionGroupRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionGroupRestControllerIT.java @@ -20,14 +20,14 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; 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.GroupMatcher; import org.dspace.app.rest.model.GroupRest; import org.dspace.app.rest.model.MetadataRest; import org.dspace.app.rest.model.MetadataValueRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Collection; import org.dspace.content.service.CollectionService; import org.dspace.core.Constants; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionHarvestSettingsControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionHarvestSettingsControllerIT.java index dd5f9b6b83..e7479786e7 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionHarvestSettingsControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionHarvestSettingsControllerIT.java @@ -21,15 +21,15 @@ import java.sql.SQLException; import java.util.List; import java.util.Map; -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.matcher.HarvesterMetadataMatcher; import org.dspace.app.rest.matcher.MetadataConfigsMatcher; import org.dspace.app.rest.model.HarvestTypeEnum; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.core.Constants; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionLogoControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionLogoControllerIT.java index e82f845697..f093156000 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionLogoControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionLogoControllerIT.java @@ -14,9 +14,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.Map; 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.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Collection; import org.junit.Before; import org.junit.Test; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionRestRepositoryIT.java index 62dc114c6e..d1522d4c8c 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CollectionRestRepositoryIT.java @@ -27,11 +27,6 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; 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.builder.EPersonBuilder; -import org.dspace.app.rest.builder.GroupBuilder; -import org.dspace.app.rest.builder.ResourcePolicyBuilder; import org.dspace.app.rest.converter.CollectionConverter; import org.dspace.app.rest.matcher.CollectionMatcher; import org.dspace.app.rest.matcher.CommunityMatcher; @@ -46,6 +41,11 @@ import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.test.MetadataPatchSuite; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.core.Constants; @@ -435,7 +435,7 @@ public class CollectionRestRepositoryIT extends AbstractControllerIntegrationTes CollectionMatcher.matchCollectionEntrySpecificEmbedProjection(col2.getName(), col2.getID(), col2.getHandle()) ))) - ) + ) ; getClient().perform(get("/api/core/collections/" + col1.getID() + "/logo")) diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityAdminGroupRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityAdminGroupRestControllerIT.java index fb00219a4d..37548553b1 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityAdminGroupRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityAdminGroupRestControllerIT.java @@ -21,10 +21,6 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; 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.builder.EPersonBuilder; -import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.GroupMatcher; import org.dspace.app.rest.model.GroupRest; @@ -32,6 +28,10 @@ import org.dspace.app.rest.model.MetadataRest; import org.dspace.app.rest.model.MetadataValueRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.service.CollectionService; @@ -157,7 +157,7 @@ public class CommunityAdminGroupRestControllerIT extends AbstractControllerInteg .andExpect(status().isCreated()) .andDo(result -> idRef .set(UUID.fromString(read(result.getResponse().getContentAsString(), "$.id"))) - ); + ); // no needs to explicitly cleanup the group created as the community comes // from a CommunityBuilder that will cleanup also related groups Group adminGroup = groupService.find(context, idRef.get()); @@ -188,7 +188,7 @@ public class CommunityAdminGroupRestControllerIT extends AbstractControllerInteg .andExpect(status().isCreated()) .andDo(result -> idRef .set(UUID.fromString(read(result.getResponse().getContentAsString(), "$.id"))) - ); + ); // no needs to explicitly cleanup the group created as the community comes // from a CommunityBuilder that will cleanup also related groups Group adminGroup = groupService.find(context, idRef.get()); @@ -249,7 +249,7 @@ public class CommunityAdminGroupRestControllerIT extends AbstractControllerInteg .andExpect(status().isCreated()) .andDo(result -> idRef .set(UUID.fromString(read(result.getResponse().getContentAsString(), "$.id"))) - ); + ); // no needs to explicitly cleanup the group created as the community comes // from a CommunityBuilder that will cleanup also related groups Group adminGroup = groupService.find(context, idRef.get()); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityCollectionItemParentIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityCollectionItemParentIT.java index d85cf34d6a..a29d9494c9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityCollectionItemParentIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityCollectionItemParentIT.java @@ -16,14 +16,14 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.sql.SQLException; import java.util.UUID; -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.matcher.CollectionMatcher; import org.dspace.app.rest.matcher.CommunityMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityLogoControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityLogoControllerIT.java index 22174c4c0c..1d34a99dd9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityLogoControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityLogoControllerIT.java @@ -14,8 +14,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.Map; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CommunityBuilder; import org.junit.Before; import org.junit.Test; import org.springframework.http.MediaType; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java index 56ab3c1972..862db60489 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CommunityRestRepositoryIT.java @@ -30,9 +30,6 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; 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.builder.EPersonBuilder; import org.dspace.app.rest.converter.CommunityConverter; import org.dspace.app.rest.matcher.CollectionMatcher; import org.dspace.app.rest.matcher.CommunityMatcher; @@ -47,6 +44,9 @@ import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.test.MetadataPatchSuite; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.service.CommunityService; @@ -115,8 +115,8 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest String authToken = getAuthToken(admin.getEmail(), password); // Capture the UUID of the created Community (see andDo() below) - AtomicReference idRef = new AtomicReference(); - AtomicReference idRefNoEmbeds = new AtomicReference(); + AtomicReference idRef = new AtomicReference<>(); + AtomicReference idRefNoEmbeds = new AtomicReference<>(); try { getClient(authToken).perform(post("/api/core/communities") .content(mapper.writeValueAsBytes(comm)) @@ -234,7 +234,7 @@ public class CommunityRestRepositoryIT extends AbstractControllerIntegrationTest new MetadataValueRest("Title Text"))); // Capture the UUID of the created Community (see andDo() below) - AtomicReference idRef = new AtomicReference(); + AtomicReference idRef = new AtomicReference<>(); try { getClient(authToken).perform(post("/api/core/communities") .content(mapper.writeValueAsBytes(comm)) diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java index 5b8022120d..bd5ceb75d9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/DiscoveryRestControllerIT.java @@ -25,15 +25,6 @@ import java.util.UUID; import com.jayway.jsonpath.matchers.JsonPathMatchers; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -import org.dspace.app.rest.builder.BitstreamBuilder; -import org.dspace.app.rest.builder.ClaimedTaskBuilder; -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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -import org.dspace.app.rest.builder.WorkflowItemBuilder; -import org.dspace.app.rest.builder.WorkspaceItemBuilder; import org.dspace.app.rest.matcher.AppliedFilterMatcher; import org.dspace.app.rest.matcher.FacetEntryMatcher; import org.dspace.app.rest.matcher.FacetValueMatcher; @@ -45,6 +36,15 @@ import org.dspace.app.rest.matcher.SortOptionMatcher; import org.dspace.app.rest.matcher.WorkflowItemMatcher; import org.dspace.app.rest.matcher.WorkspaceItemMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.ClaimedTaskBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.WorkflowItemBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -95,11 +95,11 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest //We have 4 facets in the default configuration, they need to all be present in the embedded section .andExpect(jsonPath("$._embedded.facets", containsInAnyOrder( FacetEntryMatcher.authorFacet(false), - FacetEntryMatcher.entityTypeFacet(false), + FacetEntryMatcher.entityTypeFacet(false), FacetEntryMatcher.dateIssuedFacet(false), FacetEntryMatcher.subjectFacet(false), FacetEntryMatcher.hasContentInOriginalBundleFacet(false))) - ); + ); } @Test @@ -1351,9 +1351,10 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest context.restoreAuthSystemState(); - //** WHEN ** - //An anonymous user browses this endpoint to find the the objects in the system - //With a dsoType 'item' + // ** WHEN ** + // An anonymous user browses this endpoint to find the the objects in the system + + // With dsoType 'item' getClient().perform(get("/api/discover/search/objects") .param("dsoType", "Item")) @@ -1384,8 +1385,118 @@ public class DiscoveryRestControllerIT extends AbstractControllerIntegrationTest FacetEntryMatcher.hasContentInOriginalBundleFacet(false) ))) //There always needs to be a self link available - .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))) - ; + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))); + + // With dsoTypes 'community' and 'collection' + getClient().perform(get("/api/discover/search/objects") + .param("dsoType", "Community") + .param("dsoType", "Collection")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + // The page element needs to look like this and only have four totalElements because we only want + // the communities and the collections (dsoType) and we only created two of both types + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 4) + ))) + // Only the two communities and the two collections can be present in the embedded.objects section + // as that's what we specified in the dsoType parameter + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.containsInAnyOrder( + SearchResultMatcher.match("core", "community", "communities"), + SearchResultMatcher.match("core", "community", "communities"), + SearchResultMatcher.match("core", "collection", "collections"), + SearchResultMatcher.match("core", "collection", "collections") + ))) + //These facets have to show up in the embedded.facets section as well with the given hasMore + // property because we don't exceed their default limit for a hasMore true (the default is 10) + .andExpect(jsonPath("$._embedded.facets", Matchers.containsInAnyOrder( + FacetEntryMatcher.authorFacet(false), + FacetEntryMatcher.entityTypeFacet(false), + FacetEntryMatcher.subjectFacet(false), + FacetEntryMatcher.dateIssuedFacet(false), + FacetEntryMatcher.hasContentInOriginalBundleFacet(false) + ))) + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))); + + // With dsoTypes 'collection' and 'item' + getClient().perform(get("/api/discover/search/objects") + .param("dsoType", "Collection") + .param("dsoType", "Item")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + // The page element needs to look like this and only have five totalElements because we only want + // the collections and the items (dsoType) and we only created two collections and three items + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 5) + ))) + // Only the two collections and the three items can be present in the embedded.objects section + // as that's what we specified in the dsoType parameter + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.containsInAnyOrder( + SearchResultMatcher.match("core", "collection", "collections"), + SearchResultMatcher.match("core", "collection", "collections"), + SearchResultMatcher.match("core", "item", "items"), + SearchResultMatcher.match("core", "item", "items"), + SearchResultMatcher.match("core", "item", "items") + ))) + //These facets have to show up in the embedded.facets section as well with the given hasMore + // property because we don't exceed their default limit for a hasMore true (the default is 10) + .andExpect(jsonPath("$._embedded.facets", Matchers.containsInAnyOrder( + FacetEntryMatcher.authorFacet(false), + FacetEntryMatcher.entityTypeFacet(false), + FacetEntryMatcher.subjectFacet(false), + FacetEntryMatcher.dateIssuedFacet(false), + FacetEntryMatcher.hasContentInOriginalBundleFacet(false) + ))) + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))); + + // With dsoTypes 'community', 'collection' and 'item' + getClient().perform(get("/api/discover/search/objects") + .param("dsoType", "Community") + .param("dsoType", "Collection") + .param("dsoType", "Item")) + + //** THEN ** + //The status has to be 200 OK + .andExpect(status().isOk()) + //The type has to be 'discover' + .andExpect(jsonPath("$.type", is("discover"))) + // The page element needs to look like this and have seven totalElements because we want + // the communities, the collections and the items (dsoType) and we created two communities, + // two collections and three items + .andExpect(jsonPath("$._embedded.searchResult.page", is( + PageMatcher.pageEntryWithTotalPagesAndElements(0, 20, 1, 7) + ))) + // The two communities, the two collections and the three items can be present in the embedded.objects + // section as that's what we specified in the dsoType parameter + .andExpect(jsonPath("$._embedded.searchResult._embedded.objects", Matchers.containsInAnyOrder( + SearchResultMatcher.match("core", "community", "communities"), + SearchResultMatcher.match("core", "community", "communities"), + SearchResultMatcher.match("core", "collection", "collections"), + SearchResultMatcher.match("core", "collection", "collections"), + SearchResultMatcher.match("core", "item", "items"), + SearchResultMatcher.match("core", "item", "items"), + SearchResultMatcher.match("core", "item", "items") + ))) + //These facets have to show up in the embedded.facets section as well with the given hasMore + // property because we don't exceed their default limit for a hasMore true (the default is 10) + .andExpect(jsonPath("$._embedded.facets", Matchers.containsInAnyOrder( + FacetEntryMatcher.authorFacet(false), + FacetEntryMatcher.entityTypeFacet(false), + FacetEntryMatcher.subjectFacet(false), + FacetEntryMatcher.dateIssuedFacet(false), + FacetEntryMatcher.hasContentInOriginalBundleFacet(false) + ))) + //There always needs to be a self link available + .andExpect(jsonPath("$._links.self.href", containsString("/api/discover/search/objects"))); } @Test diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java index d2b599e477..ef0d684903 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/EPersonRestRepositoryIT.java @@ -39,11 +39,6 @@ import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; -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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.jackson.IgnoreJacksonWriteOnlyAccess; import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.GroupMatcher; @@ -57,6 +52,11 @@ 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.app.rest.test.MetadataPatchSuite; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java index 868b5d271e..7789bc5d7b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/GroupRestRepositoryIT.java @@ -31,10 +31,6 @@ import java.util.concurrent.atomic.AtomicReference; import javax.ws.rs.core.MediaType; 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.builder.EPersonBuilder; -import org.dspace.app.rest.builder.GroupBuilder; import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.GroupMatcher; import org.dspace.app.rest.matcher.HalMatcher; @@ -47,6 +43,10 @@ import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.test.MetadataPatchSuite; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.factory.ContentServiceFactory; @@ -97,7 +97,7 @@ public class GroupRestRepositoryIT extends AbstractControllerIntegrationTest { // hold the id of the created workflow item AtomicReference idRef = new AtomicReference<>(); - AtomicReference idRefNoEmbeds = new AtomicReference(); + AtomicReference idRefNoEmbeds = new AtomicReference<>(); try { ObjectMapper mapper = new ObjectMapper(); GroupRest groupRest = new GroupRest(); @@ -121,7 +121,7 @@ public class GroupRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", GroupMatcher.matchFullEmbeds())) .andDo(result -> idRef .set(UUID.fromString(read(result.getResponse().getContentAsString(), "$.id"))) - ); + ); getClient(authToken).perform(get("/api/eperson/groups")) //The status has to be 200 OK diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/IdentifierRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/IdentifierRestControllerIT.java index 2956e90513..bd67289330 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/IdentifierRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/IdentifierRestControllerIT.java @@ -11,8 +11,8 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CommunityBuilder; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -27,7 +27,7 @@ public class IdentifierRestControllerIT extends AbstractControllerIntegrationTes @Before public void setup() throws Exception { super.setUp(); - } + } @Test public void testValidIdentifier() throws Exception { diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemOwningCollectionUpdateRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemOwningCollectionUpdateRestControllerIT.java index 98014cc3a0..73c2c8a3fe 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemOwningCollectionUpdateRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemOwningCollectionUpdateRestControllerIT.java @@ -15,14 +15,14 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder 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.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.EPersonBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -import org.dspace.app.rest.builder.ResourcePolicyBuilder; import org.dspace.app.rest.matcher.CollectionMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.ResourcePolicy; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.core.Constants; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java index 0c96d24288..37b26d5c14 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemRestRepositoryIT.java @@ -33,14 +33,6 @@ import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; 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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -import org.dspace.app.rest.builder.ResourcePolicyBuilder; -import org.dspace.app.rest.builder.WorkspaceItemBuilder; import org.dspace.app.rest.matcher.BitstreamMatcher; import org.dspace.app.rest.matcher.CollectionMatcher; import org.dspace.app.rest.matcher.HalMatcher; @@ -52,6 +44,14 @@ 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.app.rest.test.MetadataPatchSuite; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemTemplateRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemTemplateRestControllerIT.java index 58cca9c414..55e82831f3 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemTemplateRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ItemTemplateRestControllerIT.java @@ -22,8 +22,6 @@ import java.util.List; import java.util.Map; 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.MetadataMatcher; import org.dspace.app.rest.model.MetadataRest; import org.dspace.app.rest.model.MetadataValueRest; @@ -33,6 +31,8 @@ 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.authorize.service.ResourcePolicyService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Collection; import org.dspace.core.Constants; import org.hamcrest.Matchers; @@ -249,7 +249,7 @@ public class ItemTemplateRestControllerIT extends AbstractControllerIntegrationT String itemId = installTestTemplate(); - List ops = new ArrayList(); + List ops = new ArrayList<>(); ReplaceOperation replaceOperation = new ReplaceOperation("/inArchive", true); ops.add(replaceOperation); String illegalPatchBody = getPatchContent(ops); @@ -266,7 +266,7 @@ public class ItemTemplateRestControllerIT extends AbstractControllerIntegrationT String itemId = installTestTemplate(); - List ops = new ArrayList(); + List ops = new ArrayList<>(); ReplaceOperation replaceOperation = new ReplaceOperation("/discoverable", true); ops.add(replaceOperation); String illegalPatchBody = getPatchContent(ops); @@ -283,7 +283,7 @@ public class ItemTemplateRestControllerIT extends AbstractControllerIntegrationT String itemId = installTestTemplate(); - List ops = new ArrayList(); + List ops = new ArrayList<>(); ReplaceOperation replaceOperation = new ReplaceOperation("/withdrawn", true); ops.add(replaceOperation); String illegalPatchBody = getPatchContent(ops); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/LanguageSupportIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/LanguageSupportIT.java index cc8af92e2b..379744ed22 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/LanguageSupportIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/LanguageSupportIT.java @@ -12,8 +12,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.Locale; -import org.dspace.app.rest.builder.EPersonBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.EPersonBuilder; import org.dspace.content.authority.ChoiceAuthorityServiceImpl; import org.dspace.core.LegacyPluginServiceImpl; import org.dspace.eperson.EPerson; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/LoginAsEPersonIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/LoginAsEPersonIT.java index 22ec3ebb1d..95412b514d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/LoginAsEPersonIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/LoginAsEPersonIT.java @@ -23,15 +23,15 @@ import java.util.UUID; import com.fasterxml.jackson.databind.ObjectMapper; 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.ItemBuilder; -import org.dspace.app.rest.builder.PoolTaskBuilder; import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.WorkflowItemMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.PoolTaskBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/MappedCollectionRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/MappedCollectionRestRepositoryIT.java index b3b6513cdd..26d5e87b1d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/MappedCollectionRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/MappedCollectionRestRepositoryIT.java @@ -15,12 +15,12 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder 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.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.matcher.CollectionMatcher; import org.dspace.app.rest.matcher.ItemMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -406,13 +406,13 @@ public class MappedCollectionRestRepositoryIT extends AbstractControllerIntegrat .andExpect(jsonPath("$._embedded.mappedItems", Matchers.not(Matchers.contains( ItemMatcher.matchItemProperties(publicItem1)) ))) - .andExpect(jsonPath("$._embedded.mappedItems", Matchers.hasSize(0)));; + .andExpect(jsonPath("$._embedded.mappedItems", Matchers.hasSize(0))); getClient().perform(get("/api/core/collections/" + col3.getID() + "/mappedItems")) .andExpect(status().isOk()) .andExpect(jsonPath("$._embedded.mappedItems", Matchers.contains( ItemMatcher.matchItemProperties(publicItem1)) )) - .andExpect(jsonPath("$._embedded.mappedItems", Matchers.hasSize(1)));; + .andExpect(jsonPath("$._embedded.mappedItems", Matchers.hasSize(1))); } @Test diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadataSchemaRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadataSchemaRestRepositoryIT.java index 940a077f4c..4a094d7dc9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadataSchemaRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadataSchemaRestRepositoryIT.java @@ -21,13 +21,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dspace.app.rest.builder.MetadataSchemaBuilder; import org.dspace.app.rest.converter.MetadataSchemaConverter; import org.dspace.app.rest.matcher.HalMatcher; import org.dspace.app.rest.matcher.MetadataschemaMatcher; import org.dspace.app.rest.model.MetadataSchemaRest; import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.MetadataSchemaBuilder; import org.dspace.content.MetadataSchema; import org.hamcrest.Matchers; import org.junit.Test; @@ -99,17 +99,17 @@ public class MetadataSchemaRestRepositoryIT extends AbstractControllerIntegratio try { - getClient(authToken) - .perform(post("/api/core/metadataschemas") - .content(new ObjectMapper().writeValueAsBytes(metadataSchemaRest)) - .contentType(contentType)) - .andExpect(status().isCreated()) - .andExpect(jsonPath("$", HalMatcher.matchNoEmbeds())) - .andDo(result -> idRef.set(read(result.getResponse().getContentAsString(), "$.id"))); + getClient(authToken) + .perform(post("/api/core/metadataschemas") + .content(new ObjectMapper().writeValueAsBytes(metadataSchemaRest)) + .contentType(contentType)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$", HalMatcher.matchNoEmbeds())) + .andDo(result -> idRef.set(read(result.getResponse().getContentAsString(), "$.id"))); - getClient().perform(get("/api/core/metadataschemas/" + idRef.get())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$", MetadataschemaMatcher.matchEntry(TEST_NAME, TEST_NAMESPACE))); + getClient().perform(get("/api/core/metadataschemas/" + idRef.get())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", MetadataschemaMatcher.matchEntry(TEST_NAME, TEST_NAMESPACE))); } finally { MetadataSchemaBuilder.deleteMetadataSchema(idRef.get()); } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadatafieldRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadatafieldRestRepositoryIT.java index 067a496de7..5b2bfa6f6d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadatafieldRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/MetadatafieldRestRepositoryIT.java @@ -23,11 +23,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.dspace.app.rest.builder.MetadataFieldBuilder; -import org.dspace.app.rest.builder.MetadataSchemaBuilder; import org.dspace.app.rest.matcher.MetadataFieldMatcher; import org.dspace.app.rest.model.MetadataFieldRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.MetadataFieldBuilder; +import org.dspace.builder.MetadataSchemaBuilder; import org.dspace.content.MetadataField; import org.dspace.content.MetadataFieldServiceImpl; import org.dspace.content.MetadataSchema; @@ -179,21 +179,21 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration String authToken = getAuthToken(admin.getEmail(), password); AtomicReference idRef = new AtomicReference<>(); try { - assertThat(metadataFieldService.findByElement(context, metadataSchema, ELEMENT, QUALIFIER), nullValue()); + assertThat(metadataFieldService.findByElement(context, metadataSchema, ELEMENT, QUALIFIER), nullValue()); - getClient(authToken) - .perform(post("/api/core/metadatafields") - .param("schemaId", metadataSchema.getID() + "") - .param("projection", "full") - .content(new ObjectMapper().writeValueAsBytes(metadataFieldRest)) - .contentType(contentType)) - .andExpect(status().isCreated()) - .andDo(result -> idRef.set(read(result.getResponse().getContentAsString(), "$.id"))); + getClient(authToken) + .perform(post("/api/core/metadatafields") + .param("schemaId", metadataSchema.getID() + "") + .param("projection", "full") + .content(new ObjectMapper().writeValueAsBytes(metadataFieldRest)) + .contentType(contentType)) + .andExpect(status().isCreated()) + .andDo(result -> idRef.set(read(result.getResponse().getContentAsString(), "$.id"))); - getClient(authToken).perform(get("/api/core/metadatafields/" + idRef.get())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$", MetadataFieldMatcher.matchMetadataFieldByKeys( - metadataSchema.getName(), "testElementForCreate", "testQualifierForCreate"))); + getClient(authToken).perform(get("/api/core/metadatafields/" + idRef.get())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", MetadataFieldMatcher.matchMetadataFieldByKeys( + metadataSchema.getName(), "testElementForCreate", "testQualifierForCreate"))); } finally { MetadataFieldBuilder.deleteMetadataField(idRef.get()); } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ProcessRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ProcessRestRepositoryIT.java index fdca31d07b..f2e8322dc9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ProcessRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ProcessRestRepositoryIT.java @@ -22,11 +22,11 @@ import java.util.Random; import org.apache.commons.codec.CharEncoding; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; -import org.dspace.app.rest.builder.ProcessBuilder; import org.dspace.app.rest.matcher.PageMatcher; import org.dspace.app.rest.matcher.ProcessFileTypesMatcher; import org.dspace.app.rest.matcher.ProcessMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.ProcessBuilder; import org.dspace.content.Bitstream; import org.dspace.content.ProcessStatus; import org.dspace.scripts.DSpaceCommandLineParameter; @@ -72,7 +72,7 @@ public class ProcessRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is( ProcessMatcher.matchProcess(process.getName(), String.valueOf(process.getEPerson().getID()), process.getID(), parameters, ProcessStatus.SCHEDULED))) - ); + ); } @Test @@ -86,7 +86,7 @@ public class ProcessRestRepositoryIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is( ProcessMatcher.matchProcess(process.getName(), String.valueOf(process.getEPerson().getID()), process.getID(), new LinkedList<>(), ProcessStatus.SCHEDULED))) - ); + ); } @Test @@ -323,6 +323,7 @@ public class ProcessRestRepositoryIT extends AbstractControllerIntegrationTest { } @After + @Override public void destroy() throws Exception { super.destroy(); } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java index 87d9c16e12..9cc9ce51c9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipDeleteRestRepositoryIT.java @@ -16,11 +16,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.List; -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.builder.RelationshipBuilder; import org.dspace.app.rest.test.AbstractEntityIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.RelationshipBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -618,7 +618,7 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio assertThat(publicationAuthorList.size(), equalTo(0)); List publicationRelationships = itemService.getMetadata(publicationItem, - "relation", "isAuthorOfPublication", Item.ANY, Item.ANY); + "relation", "isAuthorOfPublication", Item.ANY, Item.ANY); assertThat(publicationRelationships.size(), equalTo(0)); projectItem = itemService.find(context, projectItem.getID()); @@ -628,7 +628,7 @@ public class RelationshipDeleteRestRepositoryIT extends AbstractEntityIntegratio assertThat(projectAuthorList.get(0).getValue(), equalTo("Smith, Donald")); assertNull(projectAuthorList.get(0).getAuthority()); List projectRelationships = itemService.getMetadata(projectItem, - "relation", "isPersonOfProject", Item.ANY, Item.ANY); + "relation", "isPersonOfProject", Item.ANY, Item.ANY); assertThat(projectRelationships.size(), equalTo(0)); } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipRestRepositoryIT.java index a9badd03f6..060c504f3d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipRestRepositoryIT.java @@ -33,16 +33,16 @@ import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonObject; import org.apache.commons.lang3.StringUtils; -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.ItemBuilder; -import org.dspace.app.rest.builder.RelationshipBuilder; import org.dspace.app.rest.matcher.PageMatcher; import org.dspace.app.rest.matcher.RelationshipMatcher; import org.dspace.app.rest.model.RelationshipRest; import org.dspace.app.rest.test.AbstractEntityIntegrationTest; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.RelationshipBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipTypeRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipTypeRestControllerIT.java index fe4bef8b8d..9f631c0650 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipTypeRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RelationshipTypeRestControllerIT.java @@ -13,15 +13,15 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder 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.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -import org.dspace.app.rest.builder.RelationshipBuilder; import org.dspace.app.rest.matcher.EntityTypeMatcher; import org.dspace.app.rest.matcher.PageMatcher; import org.dspace.app.rest.matcher.RelationshipMatcher; import org.dspace.app.rest.matcher.RelationshipTypeMatcher; import org.dspace.app.rest.test.AbstractEntityIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.RelationshipBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.EntityType; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ResourcePolicyRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ResourcePolicyRestRepositoryIT.java index 1b207fbeee..d8a6234d36 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ResourcePolicyRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ResourcePolicyRestRepositoryIT.java @@ -29,12 +29,6 @@ import java.util.concurrent.atomic.AtomicReference; import javax.ws.rs.core.MediaType; 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.builder.EPersonBuilder; -import org.dspace.app.rest.builder.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -import org.dspace.app.rest.builder.ResourcePolicyBuilder; import org.dspace.app.rest.matcher.ResourcePolicyMatcher; import org.dspace.app.rest.model.ResourcePolicyRest; import org.dspace.app.rest.model.patch.AddOperation; @@ -45,6 +39,12 @@ import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.AuthorizeService; import org.dspace.authorize.service.ResourcePolicyService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RestResourceControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RestResourceControllerIT.java index 164459b228..1ca5179942 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/RestResourceControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/RestResourceControllerIT.java @@ -12,8 +12,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.UUID; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CommunityBuilder; import org.junit.Test; /** diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ScriptRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ScriptRestRepositoryIT.java index c1ba31305e..debd15b409 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ScriptRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ScriptRestRepositoryIT.java @@ -27,10 +27,6 @@ import java.util.stream.Collectors; import com.google.gson.Gson; import org.apache.commons.collections4.CollectionUtils; -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.builder.ProcessBuilder; import org.dspace.app.rest.converter.DSpaceRunnableParameterConverter; import org.dspace.app.rest.matcher.PageMatcher; import org.dspace.app.rest.matcher.ProcessMatcher; @@ -39,6 +35,10 @@ import org.dspace.app.rest.model.ParameterValueRest; import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.AuthorizeException; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ProcessBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -82,7 +82,9 @@ public class ScriptRestRepositoryIT extends AbstractControllerIntegrationTest { ScriptMatcher.matchScript(scriptConfigurations.get(2).getName(), scriptConfigurations.get(2).getDescription()), ScriptMatcher.matchScript(scriptConfigurations.get(3).getName(), - scriptConfigurations.get(3).getDescription()) + scriptConfigurations.get(3).getDescription()), + ScriptMatcher.matchScript(scriptConfigurations.get(4).getName(), + scriptConfigurations.get(4).getDescription()) ))); } @@ -139,7 +141,7 @@ public class ScriptRestRepositoryIT extends AbstractControllerIntegrationTest { getClient(token).perform(get("/api/system/scripts/mock-script")) .andExpect(status().isOk()) .andExpect(jsonPath("$", ScriptMatcher - .matchMockScript(scriptConfigurations.get(3).getOptions()))); + .matchMockScript(scriptConfigurations.get(scriptConfigurations.size() - 1).getOptions()))); } @Test diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SearchEventRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SearchEventRestRepositoryIT.java index 497f7b9073..bd40cfdc9d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SearchEventRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SearchEventRestRepositoryIT.java @@ -16,13 +16,13 @@ import java.util.List; 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.builder.ItemBuilder; import org.dspace.app.rest.model.PageRest; import org.dspace.app.rest.model.SearchEventRest; import org.dspace.app.rest.model.SearchResultsRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ShibbolethRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ShibbolethRestControllerIT.java index e13d091168..78f9d8f8cf 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ShibbolethRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ShibbolethRestControllerIT.java @@ -31,12 +31,29 @@ public class ShibbolethRestControllerIT extends AbstractControllerIntegrationTes } @Test - public void testRedirectToGivenUrl() throws Exception { + public void testRedirectToGivenTrustedUrl() throws Exception { String token = getAuthToken(eperson.getEmail(), password); getClient(token).perform(get("/api/authn/shibboleth") - .param("redirectUrl", "http://dspace.org")) + .param("redirectUrl", "http://localhost:8080/server/api/authn/status")) .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrl("http://dspace.org")); + .andExpect(redirectedUrl("http://localhost:8080/server/api/authn/status")); + } + + @Test + public void testRedirectToGivenUntrustedUrl() throws Exception { + String token = getAuthToken(eperson.getEmail(), password); + + // Now attempt to redirect to a URL that is NOT trusted (i.e. not the Server or UI). + // Should result in a 400 error. + getClient(token).perform(get("/api/authn/shibboleth") + .param("redirectUrl", "http://dspace.org")) + .andExpect(status().isBadRequest()); + } + + @Test + public void testRedirectRequiresAuth() throws Exception { + getClient().perform(get("/api/authn/shibboleth")) + .andExpect(status().isUnauthorized()); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SiteRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SiteRestRepositoryIT.java index f208d0827f..092ea32b3f 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SiteRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SiteRestRepositoryIT.java @@ -14,10 +14,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.UUID; -import org.dspace.app.rest.builder.SiteBuilder; import org.dspace.app.rest.matcher.SiteMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.test.MetadataPatchSuite; +import org.dspace.builder.SiteBuilder; import org.dspace.content.Site; import org.dspace.eperson.EPerson; import org.hamcrest.Matchers; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubResourcePermissionsIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubResourcePermissionsIT.java index d4399a8047..c5f2ed9a13 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubResourcePermissionsIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubResourcePermissionsIT.java @@ -15,15 +15,15 @@ import java.io.InputStream; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -import org.dspace.app.rest.builder.BitstreamBuilder; -import org.dspace.app.rest.builder.BundleBuilder; -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.matcher.BundleMatcher; import org.dspace.app.rest.matcher.CommunityMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.BundleBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Bundle; import org.dspace.content.Collection; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java index e52b70b7bd..e642336b1c 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionDefinitionsControllerIT.java @@ -18,10 +18,10 @@ 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.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.matcher.SubmissionDefinitionsMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Collection; import org.hamcrest.Matchers; import org.junit.Test; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java index 4eee3579ee..f754d969fd 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/SubmissionFormsControllerIT.java @@ -18,11 +18,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.Locale; -import org.dspace.app.rest.builder.EPersonBuilder; import org.dspace.app.rest.matcher.SubmissionFormFieldMatcher; import org.dspace.app.rest.repository.SubmissionFormRestRepository; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.util.DCInputsReaderException; +import org.dspace.builder.EPersonBuilder; import org.dspace.eperson.EPerson; import org.dspace.services.ConfigurationService; import org.hamcrest.Matchers; @@ -194,7 +194,7 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe // check the first two rows .andExpect(jsonPath("$.rows[0].fields", contains( SubmissionFormFieldMatcher.matchFormClosedRelationshipFieldDefinition("Journal", null, - false,"Select the journal related to this volume.", "isVolumeOfJournal", + false,"Select the journal related to this volume.", "isJournalOfVolume", "creativework.publisher:somepublishername", "periodical", false)))) ; } @@ -258,7 +258,7 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe + " Як що вмiст вайлу не є текстовим, наприклад є фотографiєю, тодi вибрати (N/A)", "dc.language.iso")))); - resetLocalesConfiguration(); + resetLocalesConfiguration(); } @Test @@ -331,7 +331,7 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe + " Як що вмiст вайлу не є текстовим, наприклад є фотографiєю, тодi вибрати (N/A)", "dc.language.iso")))); - resetLocalesConfiguration(); + resetLocalesConfiguration(); } @Test @@ -377,7 +377,7 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe + " Se il contenuto non ha davvero una lingua" + " (ad esempio, se è un set di dati o un'immagine) selezionare (N/A)", "dc.language.iso")))); - resetLocalesConfiguration(); + resetLocalesConfiguration(); } @Test @@ -408,7 +408,7 @@ public class SubmissionFormsControllerIT extends AbstractControllerIntegrationTe "\u00C8 necessario inserire un titolo principale per questo item", false, "Inserisci titolo principale di questo item", "dc.title")))); - resetLocalesConfiguration(); + resetLocalesConfiguration(); } @Test diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/TaskRestRepositoriesIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/TaskRestRepositoriesIT.java index 8a8c567293..a7813601ec 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/TaskRestRepositoriesIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/TaskRestRepositoriesIT.java @@ -25,12 +25,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; -import org.dspace.app.rest.builder.ClaimedTaskBuilder; -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.PoolTaskBuilder; -import org.dspace.app.rest.builder.WorkflowItemBuilder; import org.dspace.app.rest.matcher.ClaimedTaskMatcher; import org.dspace.app.rest.matcher.EPersonMatcher; import org.dspace.app.rest.matcher.PoolTaskMatcher; @@ -41,6 +35,12 @@ import org.dspace.app.rest.matcher.WorkspaceItemMatcher; 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.builder.ClaimedTaskBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.PoolTaskBuilder; +import org.dspace.builder.WorkflowItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -339,7 +339,6 @@ public class TaskRestRepositoriesIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/workflow/pooltasks"))) .andExpect(jsonPath("$.page.size", is(20))) .andExpect(jsonPath("$.page.totalElements", is(3))); - ; String authReviewer2 = getAuthToken(reviewer2.getEmail(), password); getClient(authReviewer2).perform(get("/api/workflow/pooltasks/search/findByUser") @@ -360,7 +359,6 @@ public class TaskRestRepositoriesIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$._links.self.href", Matchers.containsString("/api/workflow/pooltasks"))) .andExpect(jsonPath("$.page.size", is(20))) .andExpect(jsonPath("$.page.totalElements", is(2))); - ; String authAdmin = getAuthToken(admin.getEmail(), password); getClient(authAdmin).perform(get("/api/workflow/pooltasks/search/findByUser") diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/UUIDLookupRestControllerIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/UUIDLookupRestControllerIT.java index d8cad3117a..8a6debce3e 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/UUIDLookupRestControllerIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/UUIDLookupRestControllerIT.java @@ -16,13 +16,13 @@ import java.util.UUID; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -import org.dspace.app.rest.builder.SiteBuilder; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.SiteBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/UriListParsingIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/UriListParsingIT.java index 108859381e..91a1572e5a 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/UriListParsingIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/UriListParsingIT.java @@ -13,12 +13,12 @@ import static org.junit.Assert.assertTrue; import java.util.List; -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.app.rest.utils.ContextUtil; import org.dspace.app.rest.utils.Utils; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.DSpaceObject; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionHistoryRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionHistoryRestRepositoryIT.java index 584b099e9e..60fdb11c97 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionHistoryRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionHistoryRestRepositoryIT.java @@ -17,13 +17,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.sql.SQLException; import java.util.Date; -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.matcher.VersionHistoryMatcher; import org.dspace.app.rest.matcher.VersionMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.AuthorizeException; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionRestRepositoryIT.java index 1a64454dc6..a6087c58c2 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/VersionRestRepositoryIT.java @@ -11,12 +11,12 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder 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.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; -import org.dspace.app.rest.builder.ItemBuilder; import org.dspace.app.rest.matcher.ItemMatcher; import org.dspace.app.rest.matcher.VersionMatcher; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ViewEventRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ViewEventRestRepositoryIT.java index a84b2138a1..5683bd30a8 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/ViewEventRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/ViewEventRestRepositoryIT.java @@ -17,13 +17,13 @@ import java.util.UUID; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.codec.CharEncoding; import org.apache.commons.io.IOUtils; -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.ItemBuilder; -import org.dspace.app.rest.builder.SiteBuilder; import org.dspace.app.rest.model.ViewEventRest; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.BitstreamBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.SiteBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowDefinitionRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowDefinitionRestRepositoryIT.java index 7d8b7f7065..ab99e1d4c2 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowDefinitionRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowDefinitionRestRepositoryIT.java @@ -19,12 +19,12 @@ import java.util.List; import java.util.UUID; import org.apache.commons.lang3.StringUtils; -import org.dspace.app.rest.builder.CollectionBuilder; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.matcher.WorkflowDefinitionMatcher; import org.dspace.app.rest.model.WorkflowDefinitionRest; import org.dspace.app.rest.repository.WorkflowDefinitionRestRepository; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.xmlworkflow.factory.XmlWorkflowFactory; @@ -41,7 +41,8 @@ import org.junit.Test; */ public class WorkflowDefinitionRestRepositoryIT extends AbstractControllerIntegrationTest { - private XmlWorkflowFactory xmlWorkflowFactory = XmlWorkflowServiceFactory.getInstance().getWorkflowFactory(); + private final XmlWorkflowFactory xmlWorkflowFactory + = XmlWorkflowServiceFactory.getInstance().getWorkflowFactory(); private static final String WORKFLOW_DEFINITIONS_ENDPOINT = "/api/" + WorkflowDefinitionRest.CATEGORY + "/" + WorkflowDefinitionRest.NAME_PLURAL; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java index 13837f6461..e8c7922dc0 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkflowItemRestRepositoryIT.java @@ -28,14 +28,6 @@ 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.ClaimedTaskBuilder; -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.ItemBuilder; -import org.dspace.app.rest.builder.WorkflowItemBuilder; -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.WorkflowItemMatcher; @@ -46,6 +38,14 @@ 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.builder.BitstreamBuilder; +import org.dspace.builder.ClaimedTaskBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.WorkflowItemBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java index c4a64c6de1..d66cd463b9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/WorkspaceItemRestRepositoryIT.java @@ -35,13 +35,6 @@ import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.databind.ObjectMapper; 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.GroupBuilder; -import org.dspace.app.rest.builder.ItemBuilder; -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.MetadataMatcher; @@ -51,6 +44,13 @@ 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.builder.BitstreamBuilder; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; +import org.dspace.builder.GroupBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Bitstream; import org.dspace.content.Collection; import org.dspace.content.Community; @@ -871,7 +871,7 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration * * @throws Exception */ - public void createMultipleWorkspaceItemFromFileTest() throws Exception { + public void createSingleWorkspaceItemFromFileWithOneEntryTest() throws Exception { context.turnOffAuthorisationSystem(); //** GIVEN ** @@ -892,57 +892,260 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration .build(); InputStream bibtex = getClass().getResourceAsStream("bibtex-test.bib"); - final MockMultipartFile bibtexFile = new MockMultipartFile("file", "bibtex-test.bib", "application/x-bibtex", - bibtex); + final MockMultipartFile bibtexFile = new MockMultipartFile("file", "/local/path/bibtex-test.bib", + "application/x-bibtex", bibtex); context.restoreAuthSystemState(); String authToken = getAuthToken(eperson.getEmail(), password); - // bulk create workspaceitems in the default collection (col1) + // create a workspaceitem from a single bibliographic entry file explicitly 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 + // 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[0].sections.upload.files[0]" + + ".metadata['dc.source'][0].value", + is("/local/path/bibtex-test.bib"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0]" + + ".metadata['dc.title'][0].value", + is("bibtex-test.bib"))) .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()) + jsonPath("$._embedded.workspaceitems[*]._embedded.upload").doesNotExist()); ; - // bulk create workspaceitems explicitly in the col2 + // create a workspaceitem from a single bibliographic entry file explicitly in the col2 getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") .file(bibtexFile) - .param("collection", col2.getID().toString())) + .param("owningCollection", 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[0].sections.upload.files[0]" + + ".metadata['dc.source'][0].value", + is("/local/path/bibtex-test.bib"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload" + + ".files[0].metadata['dc.title'][0].value", + is("bibtex-test.bib"))) .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()) - ; + jsonPath("$._embedded.workspaceitems[*]._embedded.upload").doesNotExist()); bibtex.close(); } + + + @Test + /** + * Test the creation of workspaceitems POSTing to the resource collection endpoint a + * bibtex and pubmed files + * + * @throws Exception + */ + public void createSingleWorkspaceItemFromMultipleFilesWithOneEntryTest() 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") + .withSubmitterGroup(eperson) + .build(); + Collection col2 = CollectionBuilder.createCollection(context, child1) + .withName("Collection 2") + .withSubmitterGroup(eperson) + .build(); + + InputStream bibtex = getClass().getResourceAsStream("bibtex-test.bib"); + final MockMultipartFile bibtexFile = new MockMultipartFile("file", "/local/path/bibtex-test.bib", + "application/x-bibtex", bibtex); + InputStream xmlIS = getClass().getResourceAsStream("pubmed-test.xml"); + final MockMultipartFile pubmedFile = new MockMultipartFile("file", "/local/path/pubmed-test.xml", + "application/xml", xmlIS); + + context.restoreAuthSystemState(); + + String authToken = getAuthToken(eperson.getEmail(), password); + // create a workspaceitem from a single bibliographic entry file explicitly in the default collection (col1) + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile).file(pubmedFile)) + // 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[0].sections.upload.files[0]" + + ".metadata['dc.source'][0].value", + is("/local/path/bibtex-test.bib"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0]" + + ".metadata['dc.title'][0].value", + is("bibtex-test.bib"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][1].value") + .doesNotExist()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[1]" + + ".metadata['dc.source'][0].value", + is("/local/path/pubmed-test.xml"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[1]" + + ".metadata['dc.title'][0].value", + is("pubmed-test.xml"))); + + // create a workspaceitem from a single bibliographic entry file explicitly in the col2 + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile).file(pubmedFile) + .param("owningCollection", 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[0].sections.upload.files[0]" + + ".metadata['dc.source'][0].value", + is("/local/path/bibtex-test.bib"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload" + + ".files[0].metadata['dc.title'][0].value", + is("bibtex-test.bib"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][1].value") + .doesNotExist()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[1]" + + ".metadata['dc.source'][0].value", + is("/local/path/pubmed-test.xml"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[1]" + + ".metadata['dc.title'][0].value", + is("pubmed-test.xml"))); + bibtex.close(); + xmlIS.close(); + } + + @Test + /** + * Test the creation of workspaceitems POSTing to the resource collection endpoint a bibtex file + * contains more than one entry. + * + * @throws Exception + */ + public void createSingleWorkspaceItemsFromSingleFileWithMultipleEntriesTest() 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") + .withSubmitterGroup(eperson) + .build(); + Collection col2 = CollectionBuilder.createCollection(context, child1) + .withName("Collection 2") + .withSubmitterGroup(eperson) + .build(); + + InputStream bibtex = getClass().getResourceAsStream("bibtex-test-3-entries.bib"); + final MockMultipartFile bibtexFile = new MockMultipartFile("file", "bibtex-test-3-entries.bib", + "application/x-bibtex", + bibtex); + + context.restoreAuthSystemState(); + + String authToken = getAuthToken(eperson.getEmail(), password); + // create a workspaceitem from a single bibliographic entry file explicitly in the default collection (col1) + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(bibtexFile)) + // create should return return a 422 because we don't allow/support bibliographic files + // that have multiple metadata records + .andExpect(status().is(422)); + bibtex.close(); + } + + @Test + /** + * Test the creation of workspaceitems POSTing to the resource collection endpoint a pubmed XML + * file. + * + * @throws Exception + */ + public void createPubmedWorkspaceItemFromFileTest() 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") + .withSubmitterGroup(eperson) + .build(); + Collection col2 = CollectionBuilder.createCollection(context, child1) + .withName("Collection 2") + .withSubmitterGroup(eperson) + .build(); + InputStream xmlIS = getClass().getResourceAsStream("pubmed-test.xml"); + final MockMultipartFile pubmedFile = new MockMultipartFile("file", "/local/path/pubmed-test.xml", + "application/xml", xmlIS); + + context.restoreAuthSystemState(); + + String authToken = getAuthToken(eperson.getEmail(), password); + // create a workspaceitem from a single bibliographic entry file explicitly in the default collection (col1) + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(pubmedFile)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][0].value", + is("Multistep microreactions with proteins using electrocapture technology."))) + .andExpect( + jsonPath( + "$._embedded.workspaceitems[0].sections.traditionalpageone['dc.identifier.other'][0].value", + is("15117179"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone" + + "['dc.contributor.author'][0].value", + is("Astorga-Wells, Juan"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0]" + + ".metadata['dc.source'][0].value", + is("/local/path/pubmed-test.xml"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0]" + + ".metadata['dc.title'][0].value", + is("pubmed-test.xml"))); + + // create a workspaceitem from a single bibliographic entry file explicitly in the col2 + getClient(authToken).perform(fileUpload("/api/submission/workspaceitems") + .file(pubmedFile) + .param("owningCollection", col2.getID().toString())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone['dc.title'][0].value", + is("Multistep microreactions with proteins using electrocapture technology."))) + .andExpect( + jsonPath( + "$._embedded.workspaceitems[0].sections.traditionalpageone['dc.identifier.other'][0].value", + is("15117179"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.traditionalpageone" + + "['dc.contributor.author'][0].value", + is("Astorga-Wells, Juan"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0].metadata['dc.source'][0].value", + is("/local/path/pubmed-test.xml"))) + .andExpect(jsonPath("$._embedded.workspaceitems[0].sections.upload.files[0].metadata['dc.title'][0].value", + is("pubmed-test.xml"))); + + xmlIS.close(); + } + @Test /** * Test the creation of a workspaceitem POSTing to the resource collection endpoint a PDF file. As a single item @@ -1052,7 +1255,7 @@ public class WorkspaceItemRestRepositoryIT extends AbstractControllerIntegration // create an empty workspaceitem explicitly in the col1, check validation on creation getClient(authToken).perform(post("/api/submission/workspaceitems") - .param("collection", col1.getID().toString()) + .param("owningCollection", col1.getID().toString()) .contentType(org.springframework.http.MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()) // title and dateissued are required in the first panel diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/AdministratorFeatureIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/AdministratorFeatureIT.java index e1e89cda02..c8e35cb10b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/AdministratorFeatureIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/AdministratorFeatureIT.java @@ -12,9 +12,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.dspace.app.rest.authorization.impl.AdministratorOfFeature; -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.converter.CollectionConverter; import org.dspace.app.rest.converter.CommunityConverter; import org.dspace.app.rest.converter.SiteConverter; @@ -25,6 +22,9 @@ import org.dspace.app.rest.model.SiteRest; import org.dspace.app.rest.projection.DefaultProjection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.authorize.service.AuthorizeService; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.EPersonBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Site; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/CCLicenseFeatureRestIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/CCLicenseFeatureRestIT.java index 97225d7df0..38fc9a06fd 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/CCLicenseFeatureRestIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/CCLicenseFeatureRestIT.java @@ -7,15 +7,13 @@ */ package org.dspace.app.rest.authorization; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 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.authorization.impl.CCLicenseFeature; -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.builder.ResourcePolicyBuilder; import org.dspace.app.rest.converter.ItemConverter; import org.dspace.app.rest.matcher.AuthorizationMatcher; import org.dspace.app.rest.model.ItemRest; @@ -23,6 +21,10 @@ import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.utils.Utils; import org.dspace.authorize.ResourcePolicy; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ResourcePolicyBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -81,13 +83,14 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", admin.getID().toString()) .param("feature", ccLicenseFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))) + ); } @Test @@ -110,13 +113,14 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))) + ); // verify that the property core.authorization.collection-admin.item-admin.cc-license = false is respected // the community admins should be still authorized @@ -127,13 +131,14 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))) + ); // now verify that the property core.authorization.community-admin.item-admin.cc-license = false is respected // and also community admins are blocked @@ -143,11 +148,11 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { getClient(comAdminToken).perform(get("/api/authz/authorizations/" + authAdminCCLicense.getID())) .andExpect(status().isNotFound()); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -170,24 +175,25 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); - getClient(colAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(colAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))) + ); // verify that the property core.authorization.collection-admin.item-admin.cc-license = false is respected configurationService.setProperty("core.authorization.item-admin.cc-license", false); configurationService.setProperty("core.authorization.collection-admin.item-admin.cc-license", false); getClient(colAdminToken).perform(get("/api/authz/authorizations/" + authAdminCCLicense.getID())) .andExpect(status().isNotFound()); - getClient(colAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(colAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -211,23 +217,24 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); - getClient(itemAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(itemAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminCCLicense)))) + ); // verify that the property core.authorization.item-admin.cc-license = false is respected configurationService.setProperty("core.authorization.item-admin.cc-license", false); getClient(itemAdminToken).perform(get("/api/authz/authorizations/" + authAdminCCLicense.getID())) .andExpect(status().isNotFound()); - getClient(itemAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(itemAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -248,19 +255,19 @@ public class CCLicenseFeatureRestIT extends AbstractControllerIntegrationTest { getClient(epersonToken).perform(get("/api/authz/authorizations/" + authEpersonCCLicense.getID())) .andExpect(status().isNotFound()); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", ccLicenseFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // check the authorization for the anonymous user getClient().perform(get("/api/authz/authorizations/" + authAnonymousCCLicense.getID())) .andExpect(status().isNotFound()); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("feature", ccLicenseFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EPersonRegistrationFeatureIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EPersonRegistrationFeatureIT.java index 528ab24eb2..6372324630 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EPersonRegistrationFeatureIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EPersonRegistrationFeatureIT.java @@ -7,7 +7,10 @@ */ package org.dspace.app.rest.authorization; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +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.authorization.impl.EPersonRegistrationFeature; @@ -63,10 +66,11 @@ public class EPersonRegistrationFeatureIT extends AbstractControllerIntegrationT String siteUri = utils.linkToSingleResource(SiteRest, "self").getHref(); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", siteUri) .param("feature", epersonRegistrationFeature.getName())) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", greaterThan(0))); } @Test @@ -78,10 +82,11 @@ public class EPersonRegistrationFeatureIT extends AbstractControllerIntegrationT configurationService.setProperty("user.registration", false); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri) - .param("feature", epersonRegistrationFeature.getName())) - .andExpect(status().isNoContent()); + getClient().perform(get("/api/authz/authorizations/search/object") + .param("uri", siteUri) + .param("feature", epersonRegistrationFeature.getName())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); } @@ -94,18 +99,20 @@ public class EPersonRegistrationFeatureIT extends AbstractControllerIntegrationT String siteUri = utils.linkToSingleResource(SiteRest, "self").getHref(); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri) - .param("feature", epersonRegistrationFeature.getName())) - .andExpect(status().isOk()); + getClient().perform(get("/api/authz/authorizations/search/object") + .param("uri", siteUri) + .param("feature", epersonRegistrationFeature.getName())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", greaterThan(0))); //Enable Shibboleth and password login configurationService.setProperty("plugin.sequence.org.dspace.authenticate.AuthenticationMethod", SHIB_ONLY); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") - .param("uri", siteUri) - .param("feature", epersonRegistrationFeature.getName())) - .andExpect(status().isNoContent()); + getClient().perform(get("/api/authz/authorizations/search/object") + .param("uri", siteUri) + .param("feature", epersonRegistrationFeature.getName())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.page.totalElements", is(0))); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EnrollAdministratorIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EnrollAdministratorIT.java index 2be3ed9466..c6ea031f7d 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EnrollAdministratorIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/EnrollAdministratorIT.java @@ -15,12 +15,12 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.dspace.app.rest.authorization.impl.AdministratorOfFeature; -import org.dspace.app.rest.builder.EPersonBuilder; import org.dspace.app.rest.converter.SiteConverter; import org.dspace.app.rest.matcher.AuthorizationMatcher; import org.dspace.app.rest.model.SiteRest; import org.dspace.app.rest.projection.DefaultProjection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.EPersonBuilder; import org.dspace.content.Site; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.SiteService; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/LoginOnBehalfOfFeatureRestIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/LoginOnBehalfOfFeatureRestIT.java index 207592c68a..890f8bf239 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/LoginOnBehalfOfFeatureRestIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/LoginOnBehalfOfFeatureRestIT.java @@ -7,12 +7,12 @@ */ package org.dspace.app.rest.authorization; +import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 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.authorization.impl.LoginOnBehalfOfFeature; -import org.dspace.app.rest.builder.CommunityBuilder; import org.dspace.app.rest.converter.CommunityConverter; import org.dspace.app.rest.converter.SiteConverter; import org.dspace.app.rest.matcher.AuthorizationMatcher; @@ -21,6 +21,7 @@ import org.dspace.app.rest.model.SiteRest; import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.utils.Utils; +import org.dspace.builder.CommunityBuilder; import org.dspace.content.Site; import org.dspace.content.service.SiteService; import org.dspace.services.ConfigurationService; @@ -101,8 +102,7 @@ public class LoginOnBehalfOfFeatureRestIT extends AbstractControllerIntegrationT .param("eperson", String.valueOf(admin.getID())) .param("feature", loginOnBehalfOf.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$._embedded.authorizations", Matchers.not(Matchers.hasItem( - AuthorizationMatcher.matchAuthorization(loginOnBehalfOfAuthorization))))); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -122,8 +122,7 @@ public class LoginOnBehalfOfFeatureRestIT extends AbstractControllerIntegrationT .param("eperson", String.valueOf(eperson.getID())) .param("feature", loginOnBehalfOf.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$._embedded.authorizations", Matchers.not( - Matchers.hasItem(AuthorizationMatcher.matchAuthorization(loginOnBehalfOfAuthorization))))); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -143,8 +142,7 @@ public class LoginOnBehalfOfFeatureRestIT extends AbstractControllerIntegrationT .param("eperson", String.valueOf(eperson.getID())) .param("feature", loginOnBehalfOf.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$._embedded.authorizations", Matchers.not( - Matchers.hasItem(AuthorizationMatcher.matchAuthorization(loginOnBehalfOfAuthorization))))); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -164,7 +162,6 @@ public class LoginOnBehalfOfFeatureRestIT extends AbstractControllerIntegrationT .param("eperson", String.valueOf(admin.getID())) .param("feature", loginOnBehalfOf.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$._embedded.authorizations", Matchers.not( - Matchers.hasItem(AuthorizationMatcher.matchAuthorization(loginOnBehalfOfAuthorization))))); + .andExpect(jsonPath("$.page.totalElements", is(0))); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/ReinstateFeatureRestIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/ReinstateFeatureRestIT.java index 96cd2243fc..8c630a6795 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/ReinstateFeatureRestIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/ReinstateFeatureRestIT.java @@ -7,22 +7,24 @@ */ package org.dspace.app.rest.authorization; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 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.authorization.impl.ReinstateFeature; -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.builder.WorkflowItemBuilder; -import org.dspace.app.rest.builder.WorkspaceItemBuilder; import org.dspace.app.rest.converter.ItemConverter; import org.dspace.app.rest.matcher.AuthorizationMatcher; import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.utils.Utils; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.WorkflowItemBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -82,13 +84,14 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", admin.getID().toString()) .param("feature", reinstateFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); } @Test @@ -111,13 +114,14 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); // verify that the property core.authorization.collection-admin.item.reinstatiate = false is respected // the community admins should be still authorized @@ -127,13 +131,14 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); // now verify that the property core.authorization.community-admin.item.reinstatiate = false is respected // and also community admins are blocked @@ -143,11 +148,11 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { getClient(comAdminToken).perform(get("/api/authz/authorizations/" + authAdminWithdraw.getID())) .andExpect(status().isNotFound()); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -170,23 +175,24 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(colAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(colAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); // verify that the property core.authorization.collection-admin.item.reinstatiate = false is respected configurationService.setProperty("core.authorization.collection-admin.item.reinstatiate", false); getClient(colAdminToken).perform(get("/api/authz/authorizations/" + authAdminWithdraw.getID())) .andExpect(status().isNotFound()); - getClient(colAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(colAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -207,20 +213,20 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { getClient(epersonToken).perform(get("/api/authz/authorizations/" + authEpersonWithdraw.getID())) .andExpect(status().isNotFound()); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // check the authorization for the anonymous user getClient().perform(get("/api/authz/authorizations/" + authAnonymousWithdraw.getID())) .andExpect(status().isNotFound()); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -251,28 +257,28 @@ public class ReinstateFeatureRestIT extends AbstractControllerIntegrationTest { getClient(adminToken).perform(get("/api/authz/authorizations/" + authWithdrawnItem.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", archivedItemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient(adminToken).perform(get("/api/authz/authorizations/" + authWsItem.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wsItemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient(adminToken).perform(get("/api/authz/authorizations/" + authWFItem.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wfItemUri) .param("eperson", eperson.getID().toString()) .param("feature", reinstateFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/WithdrawFeatureRestIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/WithdrawFeatureRestIT.java index dac47a3a88..e0d00fa63a 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/WithdrawFeatureRestIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/authorization/WithdrawFeatureRestIT.java @@ -7,22 +7,24 @@ */ package org.dspace.app.rest.authorization; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 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.authorization.impl.WithdrawFeature; -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.builder.WorkflowItemBuilder; -import org.dspace.app.rest.builder.WorkspaceItemBuilder; import org.dspace.app.rest.converter.ItemConverter; import org.dspace.app.rest.matcher.AuthorizationMatcher; import org.dspace.app.rest.model.ItemRest; import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.test.AbstractControllerIntegrationTest; import org.dspace.app.rest.utils.Utils; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.WorkflowItemBuilder; +import org.dspace.builder.WorkspaceItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; @@ -82,13 +84,14 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", admin.getID().toString()) .param("feature", withdrawFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); } @Test @@ -111,13 +114,14 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); // verify that the property core.authorization.collection-admin.item.withdraw = false is respected // the community admins should be still authorized @@ -127,13 +131,14 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(status().isOk()) + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); // now verify that the property core.authorization.community-admin.item.withdraw = false is respected // and also community admins are blocked @@ -143,11 +148,11 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { getClient(comAdminToken).perform(get("/api/authz/authorizations/" + authAdminWithdraw.getID())) .andExpect(status().isNotFound()); - getClient(comAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(comAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -170,23 +175,24 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { .andExpect(jsonPath("$", Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); - getClient(colAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(colAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) .andExpect(status().isOk()) - .andExpect(jsonPath("$", - Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))); + .andExpect(jsonPath("$._embedded.authorizations", contains( + Matchers.is(AuthorizationMatcher.matchAuthorization(authAdminWithdraw)))) + ); // verify that the property core.authorization.collection-admin.item.withdraw = false is respected configurationService.setProperty("core.authorization.collection-admin.item.withdraw", false); getClient(colAdminToken).perform(get("/api/authz/authorizations/" + authAdminWithdraw.getID())) .andExpect(status().isNotFound()); - getClient(colAdminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(colAdminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -207,20 +213,20 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { getClient(epersonToken).perform(get("/api/authz/authorizations/" + authEpersonWithdraw.getID())) .andExpect(status().isNotFound()); - getClient(epersonToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(epersonToken).perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); // check the authorization for the anonymous user getClient().perform(get("/api/authz/authorizations/" + authAnonymousWithdraw.getID())) .andExpect(status().isNotFound()); - getClient().perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient().perform(get("/api/authz/authorizations/search/object") .param("uri", itemUri) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } @Test @@ -252,28 +258,28 @@ public class WithdrawFeatureRestIT extends AbstractControllerIntegrationTest { getClient(adminToken).perform(get("/api/authz/authorizations/" + authWithdrawnItem.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", withdrawnItemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient(adminToken).perform(get("/api/authz/authorizations/" + authWsItem.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wsItemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); getClient(adminToken).perform(get("/api/authz/authorizations/" + authWFItem.getID())) .andExpect(status().isNotFound()); - getClient(adminToken).perform(get("/api/authz/authorizations/search/objectAndFeature") + getClient(adminToken).perform(get("/api/authz/authorizations/search/object") .param("uri", wfItemUri) .param("eperson", eperson.getID().toString()) .param("feature", withdrawFeature.getName())) - .andExpect(status().isNoContent()); + .andExpect(jsonPath("$.page.totalElements", is(0))); } } diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CSVMetadataImportReferenceIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CSVMetadataImportReferenceIT.java index 53f3966c7c..a8c4b42173 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CSVMetadataImportReferenceIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CSVMetadataImportReferenceIT.java @@ -21,10 +21,10 @@ import java.util.UUID; import org.dspace.app.bulkedit.MetadataImportException; import org.dspace.app.bulkedit.MetadataImportInvalidHeadingException; -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.AbstractEntityIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Item; import org.dspace.content.MetadataField; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CsvImportIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CsvImportIT.java index 5955edbdda..38b745e320 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CsvImportIT.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/csv/CsvImportIT.java @@ -24,11 +24,11 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -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.matcher.RelationshipMatcher; import org.dspace.app.rest.test.AbstractEntityIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; import org.dspace.content.Collection; import org.dspace.content.Community; import org.dspace.content.Item; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java index c470e8a045..98a7101a9b 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractControllerIntegrationTest.java @@ -19,6 +19,7 @@ import javax.servlet.Filter; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.lang3.StringUtils; +import org.dspace.AbstractIntegrationTestWithDatabase; import org.dspace.app.rest.Application; import org.dspace.app.rest.model.patch.Operation; import org.dspace.app.rest.utils.DSpaceConfigurationInitializer; diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractEntityIntegrationTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractEntityIntegrationTest.java index dec2461779..0f771df0b9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractEntityIntegrationTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractEntityIntegrationTest.java @@ -7,8 +7,8 @@ */ package org.dspace.app.rest.test; -import org.dspace.app.rest.builder.EntityTypeBuilder; -import org.dspace.app.rest.builder.RelationshipTypeBuilder; +import org.dspace.builder.EntityTypeBuilder; +import org.dspace.builder.RelationshipTypeBuilder; import org.dspace.content.EntityType; import org.dspace.content.service.EntityTypeService; import org.junit.Before; @@ -37,6 +37,7 @@ public class AbstractEntityIntegrationTest extends AbstractControllerIntegration * in relationship-types.xml */ @Before + @Override public void setUp() throws Exception { super.setUp(); diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractWebClientIntegrationTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractWebClientIntegrationTest.java index eef602f47c..9083887581 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractWebClientIntegrationTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/test/AbstractWebClientIntegrationTest.java @@ -8,6 +8,7 @@ package org.dspace.app.rest.test; import org.apache.commons.lang3.StringUtils; +import org.dspace.AbstractIntegrationTestWithDatabase; import org.dspace.app.rest.Application; import org.dspace.app.rest.utils.DSpaceConfigurationInitializer; import org.dspace.app.rest.utils.DSpaceKernelInitializer; @@ -102,6 +103,7 @@ public class AbstractWebClientIntegrationTest extends AbstractIntegrationTestWit * @param path path to perform GET against * @param username Username (may be null to perform an unauthenticated POST) * @param password Password + * @param requestEntity unknown -- not used. * @return ResponseEntity with a String body */ public ResponseEntity postResponseAsString(String path, String username, String password, diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java index 195cc31027..5a1e7cd1a9 100644 --- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java +++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/utils/DiscoverQueryBuilderTest.java @@ -7,6 +7,7 @@ */ package org.dspace.app.rest.utils; +import static java.util.Collections.emptyList; import static org.dspace.discovery.configuration.DiscoveryConfigurationParameters.SORT.COUNT; import static org.dspace.discovery.configuration.DiscoveryConfigurationParameters.SORT.VALUE; import static org.dspace.discovery.configuration.DiscoveryConfigurationParameters.TYPE_HIERARCHICAL; @@ -14,10 +15,11 @@ import static org.dspace.discovery.configuration.DiscoveryConfigurationParameter import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.emptyOrNullString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.isEmptyOrNullString; import static org.junit.Assert.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -181,7 +183,7 @@ public class DiscoverQueryBuilderTest { assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\"")); assertThat(discoverQuery.getQuery(), is(query)); - assertThat(discoverQuery.getDSpaceObjectFilter(), is(IndexableItem.TYPE)); + assertThat(discoverQuery.getDSpaceObjectFilters(), contains(IndexableItem.TYPE)); assertThat(discoverQuery.getSortField(), is("dc.title_sort")); assertThat(discoverQuery.getSortOrder(), is(DiscoverQuery.SORT_ORDER.asc)); assertThat(discoverQuery.getMaxResults(), is(10)); @@ -203,11 +205,11 @@ public class DiscoverQueryBuilderTest { @Test public void testBuildQueryDefaults() throws Exception { DiscoverQuery discoverQuery = - queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, null, null); + queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, emptyList(), null); assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true")); - assertThat(discoverQuery.getQuery(), isEmptyOrNullString()); - assertThat(discoverQuery.getDSpaceObjectFilter(), isEmptyOrNullString()); + assertThat(discoverQuery.getQuery(), is(emptyOrNullString())); + assertThat(discoverQuery.getDSpaceObjectFilters(), is(empty())); //Note this should actually be "dc.date.accessioned_dt" but remember that our searchService is just a stupid // mock assertThat(discoverQuery.getSortField(), is("dc.date.accessioned_sort")); @@ -233,11 +235,11 @@ public class DiscoverQueryBuilderTest { page = PageRequest.of(2, 10, Sort.Direction.ASC, "SCORE"); DiscoverQuery discoverQuery = - queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, null, page); + queryBuilder.buildQuery(context, null, discoveryConfiguration, null, null, emptyList(), page); assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true")); - assertThat(discoverQuery.getQuery(), isEmptyOrNullString()); - assertThat(discoverQuery.getDSpaceObjectFilter(), is(isEmptyOrNullString())); + assertThat(discoverQuery.getQuery(), is(emptyOrNullString())); + assertThat(discoverQuery.getDSpaceObjectFilters(), is(empty())); //Note this should actually be "dc.date.accessioned_dt" but remember that our searchService is just a stupid // mock assertThat(discoverQuery.getSortField(), is("score_sort")); @@ -297,8 +299,8 @@ public class DiscoverQueryBuilderTest { assertThat(discoverQuery.getFilterQueries(), containsInAnyOrder("archived:true", "subject:\"Java\"")); assertThat(discoverQuery.getQuery(), is(query)); - assertThat(discoverQuery.getDSpaceObjectFilter(), is(IndexableItem.TYPE)); - assertThat(discoverQuery.getSortField(), isEmptyOrNullString()); + assertThat(discoverQuery.getDSpaceObjectFilters(), contains(IndexableItem.TYPE)); + assertThat(discoverQuery.getSortField(), is(emptyOrNullString())); assertThat(discoverQuery.getMaxResults(), is(0)); assertThat(discoverQuery.getStart(), is(0)); assertThat(discoverQuery.getFacetMinCount(), is(1)); diff --git a/dspace-server-webapp/src/test/java/org/dspace/curate/CurationScriptIT.java b/dspace-server-webapp/src/test/java/org/dspace/curate/CurationScriptIT.java new file mode 100644 index 0000000000..58a92f7505 --- /dev/null +++ b/dspace-server-webapp/src/test/java/org/dspace/curate/CurationScriptIT.java @@ -0,0 +1,425 @@ +/** + * 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 com.jayway.jsonpath.JsonPath.read; +import static org.hamcrest.Matchers.is; +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.File; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import com.google.gson.Gson; +import org.dspace.app.rest.converter.DSpaceRunnableParameterConverter; +import org.dspace.app.rest.matcher.ProcessMatcher; +import org.dspace.app.rest.model.ParameterValueRest; +import org.dspace.app.rest.model.ProcessRest; +import org.dspace.app.rest.model.ScriptRest; +import org.dspace.app.rest.projection.Projection; +import org.dspace.app.rest.test.AbstractControllerIntegrationTest; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.builder.ProcessBuilder; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.Item; +import org.dspace.content.ProcessStatus; +import org.dspace.scripts.DSpaceCommandLineParameter; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * IT for {@link CurationCli} + * + * @author Maria Verdonck (Atmire) on 24/06/2020 + */ +public class CurationScriptIT extends AbstractControllerIntegrationTest { + + @Autowired + private DSpaceRunnableParameterConverter dSpaceRunnableParameterConverter; + + private final static String SCRIPTS_ENDPOINT = "/api/" + ScriptRest.CATEGORY + "/" + ScriptRest.PLURAL_NAME; + private final static String CURATE_SCRIPT_ENDPOINT = SCRIPTS_ENDPOINT + "/curate/" + ProcessRest.PLURAL_NAME; + + @Test + public void curateScript_invalidTaskOption() throws Exception { + context.turnOffAuthorisationSystem(); + + String token = getAuthToken(admin.getEmail(), password); + + 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("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-i", publicItem1.getHandle())); + parameters.add(new DSpaceCommandLineParameter("-t", "invalidTaskOption")); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + context.restoreAuthSystemState(); + + // Request with -t + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_MissingEperson() throws Exception { + context.turnOffAuthorisationSystem(); + + String token = getAuthToken(admin.getEmail(), password); + + 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("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-i", publicItem1.getHandle())); + parameters.add(new DSpaceCommandLineParameter("-t", CurationClientOptions.getTaskOptions().get(0))); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + context.restoreAuthSystemState(); + + // Request with missing required -e + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_NonExistentEPerson() throws Exception { + context.turnOffAuthorisationSystem(); + + String token = getAuthToken(admin.getEmail(), password); + + 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("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", "nonExistentEmail@test.com")); + parameters.add(new DSpaceCommandLineParameter("-i", publicItem1.getHandle())); + parameters.add(new DSpaceCommandLineParameter("-t", CurationClientOptions.getTaskOptions().get(0))); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + context.restoreAuthSystemState(); + + // Request with -e + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_MissingHandle() throws Exception { + String token = getAuthToken(admin.getEmail(), password); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-t", CurationClientOptions.getTaskOptions().get(0))); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + // Request with missing required -i + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_invalidHandle() throws Exception { + String token = getAuthToken(admin.getEmail(), password); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-i", "invalidhandle")); + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-t", CurationClientOptions.getTaskOptions().get(0))); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + // Request with missing required -i + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_MissingTaskOrTaskFile() throws Exception { + context.turnOffAuthorisationSystem(); + + String token = getAuthToken(admin.getEmail(), password); + + 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("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-i", publicItem1.getHandle())); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + context.restoreAuthSystemState(); + + // Request without -t or -T (and no -q ) + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_InvalidScope() throws Exception { + String token = getAuthToken(admin.getEmail(), password); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-i", "all")); + parameters.add(new DSpaceCommandLineParameter("-s", "invalidScope")); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + // Request with invalid -s ; must be object, curation or open + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_InvalidTaskFile() throws Exception { + String token = getAuthToken(admin.getEmail(), password); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-i", "all")); + parameters.add(new DSpaceCommandLineParameter("-T", "invalidTaskFile")); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + // Request with invalid -s ; must be object, curation or open + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + // Illegal Argument Exception + .andExpect(status().isBadRequest()); + } + + @Test + public void curateScript_validRequest_Task() throws Exception { + context.turnOffAuthorisationSystem(); + + String token = getAuthToken(admin.getEmail(), password); + AtomicReference idRef = new AtomicReference<>(); + + 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("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + LinkedList parameters = new LinkedList<>(); + + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-i", publicItem1.getHandle())); + parameters.add(new DSpaceCommandLineParameter("-t", CurationClientOptions.getTaskOptions().get(0))); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + context.restoreAuthSystemState(); + + try { + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + .andExpect(status().isAccepted()) + .andExpect(jsonPath("$", is( + ProcessMatcher.matchProcess("curate", + String.valueOf(admin.getID()), parameters, + ProcessStatus.SCHEDULED)))) + .andDo(result -> idRef + .set(read(result.getResponse().getContentAsString(), "$.processId"))); + } finally { + ProcessBuilder.deleteProcess(idRef.get()); + } + } + + @Test + public void curateScript_validRequest_TaskFile() throws Exception { + context.turnOffAuthorisationSystem(); + + String token = getAuthToken(admin.getEmail(), password); + AtomicReference idRef = new AtomicReference<>(); + + 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("Public item 1") + .withIssueDate("2017-10-17") + .withAuthor("Smith, Donald").withAuthor("Doe, John") + .withSubject("ExtraEntry") + .build(); + + File taskFile = new File(testProps.get("test.curateTaskFile").toString()); + + LinkedList parameters = new LinkedList<>(); + parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail())); + parameters.add(new DSpaceCommandLineParameter("-i", publicItem1.getHandle())); + parameters.add(new DSpaceCommandLineParameter("-T", taskFile.getAbsolutePath())); + + List list = parameters.stream() + .map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter + .convert(dSpaceCommandLineParameter, Projection.DEFAULT)) + .collect(Collectors.toList()); + + context.restoreAuthSystemState(); + + try { + getClient(token) + .perform(post(CURATE_SCRIPT_ENDPOINT).contentType("multipart/form-data") + .param("properties", + new Gson().toJson(list))) + .andExpect(status().isAccepted()) + .andExpect(jsonPath("$", is( + ProcessMatcher.matchProcess("curate", + String.valueOf(admin.getID()), parameters, + ProcessStatus.SCHEDULED)))) + .andDo(result -> idRef + .set(read(result.getResponse().getContentAsString(), "$.processId"))); + } finally { + ProcessBuilder.deleteProcess(idRef.get()); + } + } + +} diff --git a/dspace-server-webapp/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java b/dspace-server-webapp/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java deleted file mode 100644 index 245bb8f86f..0000000000 --- a/dspace-server-webapp/src/test/java/org/dspace/statistics/MockSolrLoggerServiceImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * The contents of this file are subject to the license and copyright - * detailed in the LICENSE and NOTICE files at the root of the source - * tree and available online at - * - * http://www.dspace.org/license/ - */ -package org.dspace.statistics; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import com.maxmind.geoip2.DatabaseReader; -import com.maxmind.geoip2.model.CityResponse; -import com.maxmind.geoip2.record.City; -import com.maxmind.geoip2.record.Continent; -import com.maxmind.geoip2.record.Country; -import com.maxmind.geoip2.record.Location; -import com.maxmind.geoip2.record.MaxMind; -import com.maxmind.geoip2.record.Postal; -import com.maxmind.geoip2.record.RepresentedCountry; -import com.maxmind.geoip2.record.Traits; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.dspace.solr.MockSolrServer; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.stereotype.Service; - -/** - * Mock service that uses an embedded SOLR server for the statistics core. - * - *

- * NOTE: this class overrides one of the same name - * defined in dspace-api and declared as a bean there. - * See {@code test/data/dspaceFolder/config/spring/api/solr-services.xml}. Some kind of classpath - * magic makes this work. - */ -@Service -public class MockSolrLoggerServiceImpl - extends SolrLoggerServiceImpl - implements InitializingBean, DisposableBean { - - private static final Logger log = LogManager.getLogger(); - - private MockSolrServer mockSolrServer; - - public MockSolrLoggerServiceImpl() { - } - - @Override - public void afterPropertiesSet() throws Exception { - // Initialize our service with a Mock Solr statistics core - mockSolrServer = new MockSolrServer("statistics"); - solr = mockSolrServer.getSolrServer(); - - // Mock GeoIP's DatabaseReader - DatabaseReader reader = mock(DatabaseReader.class); - // Ensure that any tests requesting a city() get a mock/fake CityResponse - when(reader.city(any(InetAddress.class))).thenReturn(mockCityResponse()); - // Save this mock DatabaseReader to be used by SolrLoggerService - locationService = reader; - } - - /** - * A mock/fake GeoIP CityResponse, which will be used for *all* test statistical requests - * @return faked CityResponse - */ - private CityResponse mockCityResponse() { - List cityNames = new ArrayList(Collections.singleton("New York")); - City city = new City(cityNames, 1, 1, new HashMap()); - - List countryNames = new ArrayList(Collections.singleton("United States")); - Country country = new Country(countryNames, 1, 1, "US", new HashMap()); - - Location location = new Location(1, 1, 40.760498D, -73.9933D, 501, 1, "EST"); - - Postal postal = new Postal("10036", 1); - - return new CityResponse(city, new Continent(), country, location, new MaxMind(), postal, - country, new RepresentedCountry(), new ArrayList<>(0), - new Traits()); - } - - /** Remove all records. */ - public void reset() { - mockSolrServer.reset(); - } - - @Override - public void destroy() throws Exception { - mockSolrServer.destroy(); - } -} diff --git a/dspace-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test-3-entries.bib b/dspace-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test-3-entries.bib new file mode 100644 index 0000000000..4d197ff90f --- /dev/null +++ b/dspace-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test-3-entries.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-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test.bib b/dspace-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test.bib index 4d197ff90f..d6e0d992a4 100644 --- a/dspace-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test.bib +++ b/dspace-server-webapp/src/test/resources/org/dspace/app/rest/bibtex-test.bib @@ -1,14 +1,4 @@ @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" } + year = "2006" } \ No newline at end of file diff --git a/dspace-server-webapp/src/test/resources/org/dspace/app/rest/pubmed-test.xml b/dspace-server-webapp/src/test/resources/org/dspace/app/rest/pubmed-test.xml new file mode 100644 index 0000000000..3fdceb3880 --- /dev/null +++ b/dspace-server-webapp/src/test/resources/org/dspace/app/rest/pubmed-test.xml @@ -0,0 +1,151 @@ + + + + + + 15117179 + + 2005 + 02 + 15 + + + 2006 + 11 + 15 + +

+ + 0003-2700 + + 76 + 9 + + 2004 + May + 01 + + + Analytical chemistry + Anal. Chem. + + Multistep microreactions with proteins using electrocapture technology. + + 2425-9 + + + A method to perform multistep reactions by means of electroimmobilization of a target molecule in a microflow stream is presented. A target protein is captured by the opposing effects between the hydrodynamic and electric forces, after which another medium is injected into the system. The second medium carries enzymes or other reagents, which are brought into contact with the target protein and react. The immobilization is reversed by disconnecting the electric field, upon which products are collected at the outlet of the device for analysis. On-line reduction, alkylation, and trypsin digestion of proteins is demonstrated and was monitored by MALDI mass spectrometry. + + + + Astorga-Wells + Juan + J + + Department of Medical Biochemistry and Biophysics, Karolinska Institutet, SE-171 77 Stockholm, Sweden. + + + + Bergman + Tomas + T + + + Jörnvall + Hans + H + + + eng + + Journal Article + Research Support, Non-U.S. Gov't + +
+ + United States + Anal Chem + 0370536 + 0003-2700 + + + + 0 + Proteins + + + EC 3.4.21.4 + Trypsin + + + IM + + + Animals + + + Cattle + + + Electrochemistry + + + Horses + + + Microfluidics + instrumentation + methods + + + Peptide Mapping + methods + + + Proteins + analysis + chemistry + + + Spectrometry, Mass, Matrix-Assisted Laser Desorption-Ionization + methods + + + Trypsin + chemistry + + + + + + + 2004 + 5 + 1 + 5 + 0 + + + 2005 + 2 + 16 + 9 + 0 + + + 2004 + 5 + 1 + 5 + 0 + + + ppublish + + 15117179 + 10.1021/ac0354342 + + + + + \ No newline at end of file diff --git a/dspace-server-webapp/src/test/resources/test-config.properties b/dspace-server-webapp/src/test/resources/test-config.properties index 273d93c968..3af96b20fc 100644 --- a/dspace-server-webapp/src/test/resources/test-config.properties +++ b/dspace-server-webapp/src/test/resources/test-config.properties @@ -11,3 +11,6 @@ test.folder.assetstore = ./target/testing/dspace/assetstore #Path for a test file to create bitstreams test.bitstream = ./target/testing/dspace/assetstore/ConstitutionofIreland.pdf + +#Path for a test Taskfile for the curate script +test.curateTaskFile = ./target/testing/dspace/assetstore/curate.txt diff --git a/dspace-services/pom.xml b/dspace-services/pom.xml index 95ab75f52e..1a355964d2 100644 --- a/dspace-services/pom.xml +++ b/dspace-services/pom.xml @@ -25,7 +25,7 @@ false - maven.test.skip + skipTests false diff --git a/dspace/config/launcher.xml b/dspace/config/launcher.xml index f06225e5cc..4dd49ac146 100644 --- a/dspace/config/launcher.xml +++ b/dspace/config/launcher.xml @@ -54,13 +54,6 @@ org.dspace.administer.CreateAdministrator - - curate - Perform curation tasks on DSpace objects - - org.dspace.curate.CurationCli - - database Perform database tasks like test database connection, migrate/repair database, remove database diff --git a/dspace/config/modules/curate.cfg b/dspace/config/modules/curate.cfg index cf1a25410c..df6d4f855a 100644 --- a/dspace/config/modules/curate.cfg +++ b/dspace/config/modules/curate.cfg @@ -11,8 +11,8 @@ plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.NoOpCurationTask = noop plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.ProfileFormats = profileformats plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.RequiredMetadata = requiredmetadata -plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.ClamScan = vscan -plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.MicrosoftTranslator = translate +#plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.ClamScan = vscan +#plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.MicrosoftTranslator = translate plugin.named.org.dspace.curate.CurationTask = org.dspace.ctask.general.MetadataValueLinkChecker = checklinks # add new tasks here (or in additional config files) @@ -25,30 +25,6 @@ curate.taskqueue.dir = ${dspace.dir}/ctqueues # (optional) directory location of scripted (non-java) tasks # curate.script.dir = ${dspace.dir}/ctscripts -# Friendly names for curation tasks to appear in admin UI -# Also acts as a filter - i.e. tasks not enumerated here can still -# be invoked on cmd line, etc - just not in UI -curate.ui.tasknames = profileformats = Profile Bitstream Formats -curate.ui.tasknames = requiredmetadata = Check for Required Metadata -curate.ui.tasknames = checklinks = Check Links in Metadata - -# Tasks may be organized into named groups which display together in UI drop-downs -# curate.ui.taskgroups = \ -# general = General Purpose Tasks, - -# Group membership is defined using comma-separated lists of task names, one property per group -# curate.ui.taskgroup.general = profileformats, requiredmetadata, checklinks - -# Name of queue used when tasks queued in Admin UI -curate.ui.queuename = admin_ui - -# Localized names for curation status codes in Admin UI -curate.ui.statusmessages = \ - -3 = Unknown Task, \ - -2 = No Status Set, \ - -1 = Error, \ - 0 = Success, \ - 1 = Fail, \ - 2 = Skip, \ - other = Invalid Status +# Ensure list of Curation Tasks (defined above) is available via the REST API /api/config/properties endpoint +rest.properties.exposed = plugin.named.org.dspace.curate.CurationTask diff --git a/dspace/config/spring/api/bibtex-integration.xml b/dspace/config/spring/api/bibtex-integration.xml new file mode 100644 index 0000000000..9675ef82b3 --- /dev/null +++ b/dspace/config/spring/api/bibtex-integration.xml @@ -0,0 +1,74 @@ + + + + + + + Defines which metadatum is mapped on which metadatum. Note that while the key must be unique it + only matters here for postprocessing of the value. The mapped MetadatumContributor has full control over + what metadatafield is generated. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dspace/config/spring/api/discovery.xml b/dspace/config/spring/api/discovery.xml index 803d1cad81..76e5a07239 100644 --- a/dspace/config/spring/api/discovery.xml +++ b/dspace/config/spring/api/discovery.xml @@ -66,13 +66,13 @@ - - - - + + + + - + @@ -1079,9 +1079,9 @@ - - + @@ -1144,9 +1144,9 @@ - - + @@ -1205,9 +1205,9 @@ - - + @@ -1265,9 +1265,9 @@ - - + @@ -1325,9 +1325,9 @@ - - + diff --git a/dspace/config/spring/api/scripts.xml b/dspace/config/spring/api/scripts.xml index 0713baad19..31d457f09d 100644 --- a/dspace/config/spring/api/scripts.xml +++ b/dspace/config/spring/api/scripts.xml @@ -18,4 +18,9 @@ + + + + + diff --git a/dspace/config/submission-forms.xml b/dspace/config/submission-forms.xml index 1a6ddcf049..9729fb74c5 100644 --- a/dspace/config/submission-forms.xml +++ b/dspace/config/submission-forms.xml @@ -489,8 +489,8 @@ - isVolumeOfJournal - periodical + isJournalOfVolume + journal creativework.publisher:somepublishername Select the journal related to this volume. @@ -614,7 +614,7 @@ isAuthorOfPublication - personOrOrganization + personOrOrgunit true true @@ -1750,4 +1750,4 @@ - \ No newline at end of file + diff --git a/dspace/modules/additions/pom.xml b/dspace/modules/additions/pom.xml index 59ba279c3f..fe2a181a40 100644 --- a/dspace/modules/additions/pom.xml +++ b/dspace/modules/additions/pom.xml @@ -49,7 +49,7 @@ false - maven.test.skip + skipTests false @@ -158,7 +158,6 @@ org.dspace dspace-api - 7.0-beta4-SNAPSHOT test-jar test @@ -174,10 +173,20 @@ org.dspace dspace-api + + org.dspace + dspace-api + test-jar + test + org.dspace dspace-api-lang + + org.dspace + dspace-services + javax.servlet javax.servlet-api @@ -194,6 +203,32 @@ + + org.apache.lucene + lucene-core + + + + org.apache.lucene + lucene-analyzers-icu + test + + + org.apache.lucene + lucene-analyzers-smartcn + test + + + org.apache.lucene + lucene-analyzers-stempel + test + + + org.apache.xmlbeans + xmlbeans + 2.6.0 + junit diff --git a/dspace/modules/server/pom.xml b/dspace/modules/server/pom.xml index 174d6eb019..d60cc32c8c 100644 --- a/dspace/modules/server/pom.xml +++ b/dspace/modules/server/pom.xml @@ -84,7 +84,7 @@ just adding new jar in the classloader false - maven.test.skip + skipTests false @@ -194,7 +194,6 @@ just adding new jar in the classloader org.dspace dspace-server-webapp - 7.0-beta4-SNAPSHOT test-jar test @@ -235,6 +234,18 @@ just adding new jar in the classloader + + org.dspace + dspace-api + test-jar + test + + + org.dspace + dspace-server-webapp + test-jar + test + org.springframework.boot spring-boot-starter-test diff --git a/dspace/pom.xml b/dspace/pom.xml index f468746b62..58f1af66b5 100644 --- a/dspace/pom.xml +++ b/dspace/pom.xml @@ -148,15 +148,17 @@ - + test-coverage-report false - maven.test.skip + skipTests false diff --git a/pom.xml b/pom.xml index f895efafb0..f0b3158982 100644 --- a/pom.xml +++ b/pom.xml @@ -289,7 +289,7 @@ org.apache.maven.plugins maven-dependency-plugin - 3.1.1 + 3.1.2 org.apache.maven.plugins @@ -475,29 +475,33 @@ - + skiptests - + - !maven.test.skip + !skipTests - true + true - + skipits - + !skipITs @@ -532,7 +536,7 @@ false - maven.test.skip + skipTests false @@ -572,7 +576,7 @@ false - maven.test.skip + skipTests false @@ -1010,6 +1014,12 @@ dspace-api 7.0-beta4-SNAPSHOT + + org.dspace + dspace-api + test-jar + 7.0-beta4-SNAPSHOT + org.dspace.modules additions @@ -1036,6 +1046,12 @@ dspace-services 7.0-beta4-SNAPSHOT + + org.dspace + dspace-server-webapp + test-jar + 7.0-beta4-SNAPSHOT + org.dspace dspace-rdf @@ -1209,6 +1225,11 @@ solr-cell ${solr.client.version} + + org.apache.lucene + lucene-core + ${solr.client.version} + @@ -1217,6 +1238,16 @@ ${solr.client.version} test + + org.apache.lucene + lucene-analyzers-smartcn + ${solr.client.version} + + + org.apache.lucene + lucene-analyzers-stempel + ${solr.client.version} + org.apache.ant @@ -1272,7 +1303,7 @@ commons-cli commons-cli - 1.3.1 + 1.4 commons-codec